diff --git a/.gitignore b/.gitignore index 87941747..eebdcc21 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /build/ /install/ /*.log +/slurm-????????.out # ecbundle (cloned at build time by openifs-bundle) /ecbundle/ @@ -21,4 +22,4 @@ __pycache__/ .DS_Store # User-specific Docker config -scripts/docker/config/my_config.yml \ No newline at end of file +scripts/docker/config/my_config.yml diff --git a/arch/bsc/mn5-gpp/default b/arch/bsc/mn5-gpp/default new file mode 120000 index 00000000..cd30990e --- /dev/null +++ b/arch/bsc/mn5-gpp/default @@ -0,0 +1 @@ +intel/openmpi \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/gnu/env.sh b/arch/bsc/mn5-gpp/gnu/env.sh new file mode 100755 index 00000000..8b20cab8 --- /dev/null +++ b/arch/bsc/mn5-gpp/gnu/env.sh @@ -0,0 +1,43 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +module_purge +module_load gcc/12.3.0 +module_load openmpi/4.1.5-gcc +module_load hdf5/1.14.1-2-gcc-openmpi +module_load pnetcdf/1.12.3-gcc-openmpi +module_load netcdf/c-4.9.2_fortran-4.6.1_cxx4-4.3.1_hdf5-1.14.1-2_pnetcdf-1.12.3-gcc-openmpi +module_load cmake/3.29.2 +module_load aec/1.1.2-gcc +module_load mkl/2024.1 +module_load python/3.12.1-gcc +module_load ucx/1.16.0-gcc +module_load fftw/3.3.10-gcc-ompi + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Undo stack size limitation enforced by Python module (prevent segfault during +# runtime) +ulimit -s unlimited + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/bsc/mn5-gpp/gnu/final.cmake b/arch/bsc/mn5-gpp/gnu/final.cmake new file mode 120000 index 00000000..a07077d3 --- /dev/null +++ b/arch/bsc/mn5-gpp/gnu/final.cmake @@ -0,0 +1 @@ +../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/gnu/modulefile.in b/arch/bsc/mn5-gpp/gnu/modulefile.in new file mode 120000 index 00000000..67a37141 --- /dev/null +++ b/arch/bsc/mn5-gpp/gnu/modulefile.in @@ -0,0 +1 @@ +../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/env.sh b/arch/bsc/mn5-gpp/intel/intelmpi/env.sh new file mode 100644 index 00000000..b36def0f --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/intelmpi/env.sh @@ -0,0 +1,46 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +module_purge +module_load intel/2023.2.0 +module_load impi/2021.10.0 +module_load hdf5/1.14.1-2 +module_load pnetcdf/1.12.3 +module_load netcdf/2023-06-14 +module_load fftw/3.3.10 +module_load mkl/2024.1 +module_load ucx/1.16.0 +module_load aec/1.1.2 +module_load cmake/3.29.2 +module_load python/3.12.1 + +export TBBMALLOC_DIR="/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/lib/intel64/gcc4.8" +export TBBROOT="/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0" + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Undo stack size limitation enforced by Python module (prevent segfault during +# runtime) +ulimit -s unlimited + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/final.cmake b/arch/bsc/mn5-gpp/intel/intelmpi/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/intelmpi/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in b/arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/intelmpi/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/openmpi/env.sh b/arch/bsc/mn5-gpp/intel/openmpi/env.sh new file mode 100755 index 00000000..e2304652 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/openmpi/env.sh @@ -0,0 +1,46 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +module_purge +module_load intel/2023.2.0 +module_load openmpi/4.1.5 +module_load hdf5/1.14.1-2-openmpi +module_load pnetcdf/1.12.3-openmpi +module_load netcdf/2023-06-14-ompi +module_load fftw/3.3.10-openmpi +module_load mkl/2024.1 +module_load ucx/1.16.0 +module_load aec/1.1.2 +module_load cmake/3.29.2 +module_load python/3.12.1 + +export TBBMALLOC_DIR=/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/lib/intel64/gcc4.8 +export TBBROOT=/apps/GPP/ONEAPI/2023.2.0/tbb/2021.10.0/ + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Undo stack size limitation enforced by Python module (prevent segfault during +# runtime) +ulimit -s unlimited + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/bsc/mn5-gpp/intel/openmpi/final.cmake b/arch/bsc/mn5-gpp/intel/openmpi/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/openmpi/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/bsc/mn5-gpp/intel/openmpi/modulefile.in b/arch/bsc/mn5-gpp/intel/openmpi/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/bsc/mn5-gpp/intel/openmpi/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/final.cmake b/arch/csc/final.cmake new file mode 120000 index 00000000..0db77c05 --- /dev/null +++ b/arch/csc/final.cmake @@ -0,0 +1 @@ +../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/lumi/default b/arch/csc/lumi/default new file mode 120000 index 00000000..0bb37cb5 --- /dev/null +++ b/arch/csc/lumi/default @@ -0,0 +1 @@ +gnu/11.2.0/ \ No newline at end of file diff --git a/arch/csc/lumi/gnu/11.2.0/env.sh b/arch/csc/lumi/gnu/11.2.0/env.sh new file mode 100644 index 00000000..81b08409 --- /dev/null +++ b/arch/csc/lumi/gnu/11.2.0/env.sh @@ -0,0 +1,49 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +module_purge + +# Load modules +module_load LUMI/22.12 +module_load partition/C +module_load EasyBuild-user + +module_load PrgEnv-gnu/8.3.3 +module_load gcc/11.2.0 +module_load cray-mpich/8.1.23 +module_load cray-libsci + +module_load cray-fftw/3.3.10.3 +module_load cray-hdf5/1.12.2.1 +module_load cray-netcdf/4.9.0.1 +#module_load eigen/3.3.7 +#module_load cmake/3.20.2 +#module_load ninja/1.10.0 +#module_load fcm/2019.05.0 +module_load libaec/1.0.6-cpeGNU-22.12 + + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/csc/lumi/gnu/11.2.0/final.cmake b/arch/csc/lumi/gnu/11.2.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/lumi/gnu/11.2.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/lumi/gnu/11.2.0/modulefile.in b/arch/csc/lumi/gnu/11.2.0/modulefile.in new file mode 120000 index 00000000..67a37141 --- /dev/null +++ b/arch/csc/lumi/gnu/11.2.0/modulefile.in @@ -0,0 +1 @@ +../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/mahti/default b/arch/csc/mahti/default new file mode 120000 index 00000000..0bb37cb5 --- /dev/null +++ b/arch/csc/mahti/default @@ -0,0 +1 @@ +gnu/11.2.0/ \ No newline at end of file diff --git a/arch/csc/mahti/gnu/11.2.0/env.sh b/arch/csc/mahti/gnu/11.2.0/env.sh new file mode 100644 index 00000000..b74b27c7 --- /dev/null +++ b/arch/csc/mahti/gnu/11.2.0/env.sh @@ -0,0 +1,47 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +module_purge + +# Load modules +module_load gcc/11.2.0 + +module_load openmpi/4.1.2 +module_load mpich/4.0.1 +module_load netlib-scalapack/2.1.0 +module_load openblas/0.3.18-omp +#module_load intel-oneapi-mkl/2022.1.0 +module_load fftw/3.3.10-mpi +module_load netcdf-fortran/4.5.3 +module_load netcdf-c/4.8.1 +module_load hdf5/1.10.7-mpi +module_load cmake/3.21.4 +module_load libaec/1.0.5 + +# Correct python version and libraries +#module_load geoconda + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/csc/mahti/gnu/11.2.0/final.cmake b/arch/csc/mahti/gnu/11.2.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/mahti/gnu/11.2.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/mahti/gnu/11.2.0/modulefile.in b/arch/csc/mahti/gnu/11.2.0/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/csc/mahti/gnu/11.2.0/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/modulefile.in b/arch/csc/modulefile.in new file mode 120000 index 00000000..dae96ffd --- /dev/null +++ b/arch/csc/modulefile.in @@ -0,0 +1 @@ +../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/puhti/compile_flags_puhti.cmake b/arch/csc/puhti/compile_flags_puhti.cmake new file mode 100644 index 00000000..f4a1db42 --- /dev/null +++ b/arch/csc/puhti/compile_flags_puhti.cmake @@ -0,0 +1,535 @@ + +# noopt: -DCMAKE_BUILD_TYPE=Debug +# NANS_C: -DCMAKE_BUILD_TYPE=Bit -DIFS_CHECK_BOUNDS=ON -DIFS_INIT_SNAN=ON +# noopt_NANS_C: -DCMAKE_BUILD_TYPE=Debug -DIFS_CHECK_BOUNDS=ON -DIFS_INIT_SNAN=ON + +if(IFS_CHECK_BOUNDS) + # Files that fail bounds checking across multiple compilers. + # Only files generating false positives should be added to this list. + list(APPEND no_bounds_checking + arpifs/adiab/cpg5_gp.F90 + arpifs/adiab/cpg_gp.F90 + arpifs/adiab/cpg_gp_ad.F90 + arpifs/adiab/cpg_gp_hyd.F90 + arpifs/adiab/cpg_gp_tl.F90 + arpifs/adiab/lapinea.F90 + arpifs/adiab/lapinea5.F90 + arpifs/adiab/lapineaad.F90 + arpifs/adiab/lapineatl.F90 + arpifs/adiab/larcinb.F90 + arpifs/adiab/larmes.F90 + arpifs/adiab/larmes5.F90 + arpifs/adiab/larmesad.F90 + arpifs/adiab/larmestl.F90 + arpifs/adiab/lattex.F90 + arpifs/adiab/postphy.F90 + arpifs/chem/chem_bascoetm5.F90 + arpifs/chem/chem_main.F90 + arpifs/chem/chem_massdia.F90 + arpifs/chem/tm5_rbud.F90 + arpifs/phys_radi/radintg.F90 + ) +endif() + + +if(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") + set(autopromote_flags -sreal64) +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + set(autopromote_flags -fdefault-real-8 -fdefault-double-8) +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + set(autopromote_flags -real-size 64) +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI|NVHPC") + set(autopromote_flags -r8) +endif() + + +if(CMAKE_Fortran_COMPILER_ID MATCHES "Cray") + + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -ram -emf") # common flags for all build types + + if(IFS_CHECK_BOUNDS) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -Rb") + endif() + + if(IFS_INIT_SNAN) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -ei") + endif() + + if(IFS_SHARED_LIBS) + set(PIC_FLAGS "-fPIC -hPIC") + endif() + + set(IFS_Fortran_FLAGS_BIT "-hflex_mp=conservative -Othread1 -hfp1 -hadd_paren -homp") # no debug symbols + set(IFS_Fortran_FLAGS_DEBUG "-G0 -O0 -hflex_mp=conservative -hfp0 -hadd_paren -homp") + + if($ENV{CRAY_FTN_VERSION} MATCHES "8.7.0") + # FMA with 8.7.0 breaks the adjoint test + set(IFS_Fortran_FLAGS_BIT "${IFS_Fortran_FLAGS_BIT} -hnofma") # no fused muiltply-add instructions + endif() + + if($ENV{CRAY_FTN_VERSION} MATCHES "8.5.6|8.5.8") + set(IFS_Fortran_FLAGS_BIT "${IFS_Fortran_FLAGS_BIT} -hipa0") # disable interprocedural analysis + endif() + + set(IFS_C_FLAGS_BIT "-O2 -hlist=a -homp") + set(IFS_C_FLAGS_DEBUG "-g -O0 -hlist=a -homp") + + set(IFS_CXX_FLAGS_BIT "-g -O1 -hlist=a -homp") + set(IFS_CXX_FLAGS_DEBUG "-g -O0 -hlist=a -homp") + + set(ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -Ktrap=fp -homp") + set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -Wl,--as-needed -hbyteswapio") + + # Some macro expansions generate very long lines + file(GLOB_RECURSE long_line_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_CURRENT_SOURCE_DIR}/satrad/rttov/*/*.F*" "${CMAKE_CURRENT_SOURCE_DIR}/odb/*/*.F*") + set_source_files_properties(${long_line_srcs} + PROPERTIES COMPILE_FLAGS "-N1023") + + set_source_files_properties(arpifs/mwave/mwave_emis.F90 + arpifs/mwave/mwave_emis_cmem.F90 + arpifs/phys_radi/raddiag.F90 arpifs/setup/suvert.F90 + arpifs/phys_ec/vdfexcus.F90 arpifs/phys_ec/vdfexcusad.F90 arpifs/phys_ec/vdfexcustl.F90 + surf/external/surftstp.F90 surf/module/surftstp_ctl_mod.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -O0,fp1,omp ${PIC_FLAGS}") + + set_source_files_properties(arpifs/module/spectral_arp_mod.F90 arpifs/module/varbc_allsky.F90 + arpifs/utility/deallo.F90 arpifs/cma2odb/create_averaged_values.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "-g ${IFS_Fortran_FLAGS} -hflex_mp=conservative -hfp1 -hadd_paren ${PIC_FLAGS}") + + set_source_files_properties(arpifs/adiab/larmes.F90 + arpifs/adiab/larmes_xyz.F90 + arpifs/phys_ec/phys_arrays_ini.F90 arpifs/phys_ec/cloudsc.F90 + PROPERTIES COMPILE_FLAGS "-hcontiguous") + + set_source_files_properties(arpifs/phys_ec/vdfouter.F90 + PROPERTIES COMPILE_FLAGS "-Oloop_trips=small") + + set_source_files_properties(arpifs/phys_ec/local_state_ini.F90 + PROPERTIES COMPILE_FLAGS "-hcontiguous -hnopattern") + + set_source_files_properties(arpifs/adiab/larche.F90 + PROPERTIES COMPILE_FLAGS "-Oshortcircuit1 -Oloop_trips=small -hcontiguous") + + set_source_files_properties(wam/Wam_oper/propags2.F + PROPERTIES COMPILE_FLAGS "-Oloop_trips=small") + + set_source_files_properties(arpifs/adiab/cpg.F90 + arpifs/phys_ec/state_update.F90 arpifs/phys_ec/state_increment.F90 arpifs/phys_ec/state_copy.F90 + PROPERTIES COMPILE_FLAGS "-Onopattern -hcontiguous") + + set_source_files_properties(arpifs/phys_radi/radlswr.F90 + PROPERTIES COMPILE_FLAGS "-Ovector0") + + set_source_files_properties(arpifs/phys_radi/lwad.F90 + arpifs/phys_radi/rrtm_ecrt_140gp_mcica.F90 arpifs/phys_radi/srtm_srtm_224gp_mcica.F90 + PROPERTIES COMPILE_FLAGS "-Onopattern") + + set_source_files_properties(wam/Wam_oper/secspom.F + PROPERTIES COMPILE_FLAGS "-hloop_trips=small") + + set_source_files_properties(arpifs/interpol/lascaw.F90 + PROPERTIES COMPILE_FLAGS "-Othread2 -Oshortcircuit1 -hcontiguous") + + set_source_files_properties(arpifs/parallel/brptob.F90 + PROPERTIES COMPILE_FLAGS "-hnopattern -hcontiguous") + + set_source_files_properties(arpifs/phys_radi/radlswad.F90 + PROPERTIES COMPILE_FLAGS "-Onopattern -hcontiguous") + + # Optimised code takes wrong branch leading to division by zero in odb/lib/aggr.c + set_source_files_properties(lib/aggr.c + PROPERTIES COMPILE_FLAGS "-O0") + + # IFS-864 Chemistry solver is not bit-reproducible between NPES settings without + # either -fp0 or -hcpu=ivybridge (as at 46r1 and crayftn 8.5.8) + set_source_files_properties(arpifs/chem/tm5_do_ebi.F90 arpifs/chem/tm5_do_ebi_tc02b.F90 + PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") + + # Fix internal compiler error + set_source_files_properties(satrad/programs/bufr_grid_screen.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -hflex_mp=intolerant -Othread1 -hfp1 -hadd_paren" + OVERRIDE_COMPILE_FLAGS_DEBUG "${IFS_Fortran_FLAGS} -g -hflex_mp=intolerant -hfp0 -hadd_paren") + + # Compile MPL sources with -g for better traceback + file(GLOB mpl_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/ifsaux/module/mpl_*.F90") + set_source_files_properties(${mpl_srcs} PROPERTIES COMPILE_FLAGS "-g") + + # Fix for "CONGRAD: SPTSV/DPTSV returned non-zero info with crayftn 8.7.7 (cdt/18.12) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(trans/module/ftinv_ctlad_mod.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for FP Overflow in CY47R2 + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/dia/cpdyddh.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for FPE in CY47R2 ifs-test/tests/t21/test_4dvar_airep_t + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/dia/spnorm.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for internal compiler errors with crayftn 8.7.7 (cdt/18.12) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/module/surface_views_module.fypp + PROPERTIES COMPILE_FLAGS "-O0,fp0,noomp") + + set_source_files_properties( + satrad/rttov/main/rttov_alloc_sunglint.F90 satrad/rttov/main/rttov_alloc_transmission_aux.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + + string(TOUPPER ${CMAKE_BUILD_TYPE} btype) + string(REGEX REPLACE "-Rb" "" flags "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_${btype}}") + set_source_files_properties(arpifs/module/traj_semilag_mod.F90 arpifs/module/traj_physics_mod.F90 enkf/module/obs_base_mod.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags} ${PIC_FLAGS}") + endif() + + # IFS-1933 Fix for adjoint test + set_source_files_properties(arpifs/phys_ec/cuascn.F90 + PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") + + # Fix for adjoint problem with crayftn 8.7.7 (cdt/18.12) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties( + surf/module/surfexcdrivers_ctl_mod.F90 surf/module/surfexcdriverstl_ctl_mod.F90 + surf/module/surfexcdriversad_ctl_mod.F90 surf/module/surfexcdriver_ctl_mod.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for an exception with ifs-test/tests/t21/test_glomap_edge_fc with crayftn 8.7.7 (cdt/18.23) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.7.6) + set_source_files_properties(arpifs/glomap_mode/ukca_so2so4.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1") + endif() + + # Routines with very long compile times with crayftn 8.5.8 (cdt/17.03) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.5.7) + file(GLOB fa_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/ifsaux/fa/*.F90") + set_source_files_properties(${fa_srcs} arpifs/op_obs/bgobs.F90 + arpifs/control/cnt0.F90 arpifs/control/cprep3.F90 arpifs/control/cprep4.F90 + arpifs/module/field_registry_mod.fypp + arpifs/phys_dmn/aplpar.F90 arpifs/phys_dmn/apl_arome.F90 + arpifs/op_obs/departure_jo.F90 arpifs/op_obs/departure_joad.F90 arpifs/op_obs/departure_jotl.F90 + arpifs/op_obs/hop.F90 arpifs/op_obs/hretr_aeolus.F90 arpifs/obs_preproc/mw_clearsky_screen_wrapper.F90 + arpifs/setup/suafn.F90 arpifs/setup/suafn1.F90 arpifs/setup/su0yomb.F90 arpifs/var/sujbtest.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1") + endif() + + # Fix for LREPRO4DVAR in crayftn 8.6.2 (cdt/17.09) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.6.1) + set_source_files_properties(arpifs/adiab/lattex.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp") + endif() + + # Fix for LREPRO4DVAR in crayftn 8.5.8 (cdt/17.03) + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.5.7) + set_source_files_properties(arpifs/phys_ec/cumastrn.F90 arpifs/phys_ec/cuadjtqs.F90 + arpifs/phys_ec/cuadjtqsad.F90 arpifs/phys_ec/cuadjtqstl.F90 + arpifs/phys_radi/swniad.F90 arpifs/phys_radi/swnitl.F90 arpifs/var/pregprh.F90 + PROPERTIES COMPILE_FLAGS "-O0,fp1,omp,scalar2") + endif() + + # Fix for bugs in crayftn 8.4.5 (cdt/16.03) and 8.5.8 (cdt/17.03) + if($ENV{CRAY_FTN_VERSION} MATCHES "8.4.5|8.5.8") + file(GLOB_RECURSE prepdata_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/prepdata/*.F*") + set_source_files_properties(${prepdata_srcs} + ssa/plot/coordinates.F90 ssa/plot/fdb_output.F90 ssa/plot/getfields.F90 ssa/plot/print_nml.F90 + ssa/sub/inisnw.F90 ssa/sub/inisst.F90 ssa/sub/init2m.F90 ssa/sub/reg_to_gg.F90 ssa/util/setcomssa.F90 + satrad/programs/bufr_screen_nexrad.F90 satrad/programs/bufr_screen_nexrad.F90 satrad/programs/bufr_screen_opera.F90 + satrad/programs/bufr_screen_synop_rain_gauges.F90 satrad/programs/calc_radiance_fields.F90 + satrad/programs/eda_rad_scale.F90 satrad/programs/gensatim.F90 + PROPERTIES COMPILE_FLAGS "-hipa0") + set_source_files_properties(arpifs/interpol/slcomm2a.F90 arpifs/pp_obs/pos.F90 + PROPERTIES COMPILE_FLAGS "-g") + endif() + + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.4.0) # cdt/15.11 + + # Fix for adjoint test + set_source_files_properties(surf/module/vsurf_mod.F90 surf/module/vsurfs_mod.F90 + surf/module/vsurfstl_mod.F90 surf/module/vsurfsad_mod.F90 surf/module/vupdz0_mod.F90 + surf/module/vupdz0s_mod.F90 surf/module/vupdz0stl_mod.F90 surf/module/vupdz0sad_mod.F90 + surf/module/surfsebs_ctl_mod.F90 surf/module/surfsebstl_ctl_mod.F90 surf/module/surfsebsad_ctl_mod.F90 + surf/module/surfrad_ctl_mod.F90 + PROPERTIES COMPILE_FLAGS "-hcpu=ivybridge") + + # Fix for hang at MPI_finialize in 43R3 with crayftn 8.4.1 (in cdt/15.11) + set_source_files_properties(arpifs/io_serv/io_serv_flush.F90 + PROPERTIES COMPILE_FLAGS "-g") + + # Fix for double free error + string(TOUPPER ${CMAKE_BUILD_TYPE} btype) + string(REGEX REPLACE "-g|-G[0-2]|-Gfast|-Rb" "" flags "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_${btype}}") + set_source_files_properties(arpifs/adiab/gp_derivatives.F90 + arpifs/setup/sump.F90 arpifs/dia/wrspeca.F90 arpifs/module/iogrida_mod.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags} ${PIC_FLAGS}") + + endif() + + if($ENV{CRAY_FTN_VERSION} VERSION_GREATER 8.4.5) # cdt/16.04 + + # Fix for crash in __pgas_runtime_error_checking with crayftn 8.4.6 (in cdt/16.04) + set_source_files_properties(ifsaux/module/oml_mod.F90 arpifs/module/varbc_pred.F90 + PROPERTIES COMPILE_FLAGS "-hnocaf") + + set_source_files_properties(radiation/module/easy_netcdf_read_mpi.F90 radiation/module/easy_netcdf.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_DEBUG} ${PIC_FLAGS}") + + endif() + + set_source_files_properties( + climfield/ifs_tools/grib_set_vtable.F90 + climfield/src/checkgg.F90 + climfield/ifs_tools/spint_special_filter.F90 + climfield/ifs_tools/cheminterpol.F90 + climfield/ifs_tools/cheminterpol_vms.F90 + PROPERTIES + OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -hflex_mp=intolerant -hfp0" + OVERRIDE_COMPILE_FLAGS_DEBUG "${IFS_Fortran_FLAGS} -g -hflex_mp=intolerant -hfp0") + + set_source_files_properties( + climfield/ifs_tools/depth_mode_filter.F90 + PROPERTIES COMPILE_FLAGS "-N 255") + +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + + if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") + set(IFS_GNU64_FLAG "") + else() + set(IFS_GNU64_FLAG "-m64") + endif() + + string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} ${IFS_GNU64_FLAG} " + "-fconvert=big-endian -fPIC -fopenmp " + "-fno-range-check -ffree-line-length-none -fbacktrace -fno-second-underscore " + "-fconvert=swap") + #"-ffpe-trap=invalid,zero,overflow -fconvert=swap") + + # gfortran 10 has become stricter with argument matching + if( NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10 ) + string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -fallow-argument-mismatch -fallow-invalid-boz") + endif() + + if(IFS_CHECK_BOUNDS) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -fcheck=bounds") + + # Disable bounds checking on files that would fail the check. + # Only files generating false positives should be added to this list. + set_source_files_properties( + ${no_bounds_checking} + arpifs/adiab/call_sl.F90 + arpifs/adiab/cpg_drv.F90 + arpifs/adiab/cpg_drv_ad.F90 + arpifs/adiab/cpg_drv_tl.F90 + arpifs/glomap_mode/aer_dust.F90 + arpifs/module/ecphys_perturb_type_mod.F90 + arpifs/phys_ec/ec_phys_ad.F90 + arpifs/phys_ec/ec_phys_drv.F90 + arpifs/phys_ec/ec_phys_drv_tl.F90 + arpifs/phys_ec/ec_phys_tl.F90 + PROPERTIES COMPILE_FLAGS "-fcheck=no-bounds") + endif() + + if(IFS_INIT_SNAN) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -finit-real=snan") + endif() + + set(IFS_Fortran_FLAGS_BIT "-g -O2") + set(IFS_Fortran_FLAGS_DEBUG "-g -O0") + + set(IFS_C_FLAGS_BIT "-g ${IFS_GNU64_FLAG}") + set(IFS_C_FLAGS_DEBUG "-g -O0 ${IFS_GNU64_FLAG}") + + if( CMAKE_CXX_COMPILER_ID MATCHES "GNU" ) + set(IFS_CXX_FLAGS_BIT "-g -O1 ${IFS_GNU64_FLAG}") + set(IFS_CXX_FLAGS_DEBUG "-g -O0 ${IFS_GNU64_FLAG}") + endif() + + find_package( OpenMP COMPONENTS Fortran REQUIRED ) + if( TARGET OpenMP::OpenMP_Fortran ) + set( IFS_OMP_Fortran_LIBRARIES OpenMP::OpenMP_Fortran ) + endif() + + if( APPLE ) + + if( NOT IFS_OMP_Fortran_LIBRARIES ) + ecbuild_error( "OpenMP libraries not found" ) + endif() + + else() + + set( IFS_LINK_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -fopenmp" ) + + endif() + + set( ECBUILD_SHARED_LINKER_FLAGS "${IFS_LINK_FLAGS}" ) + if( NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # Darwin linker does not support --as-needed + set( ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -Wl,--as-needed" ) + endif() + + if( $ENV{HOSTNAME} MATCHES "lxc.*|lxg.*") + set( ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_EXE_LINKER_FLAGS} -Wl,--allow-shlib-undefined" ) + set( ECBUILD_MODULE_LINKER_FLAGS "${ECBUILD_MODULE_LINKER_FLAGS} -Wl,--allow-shlib-undefined" ) + set( ECBUILD_SHARED_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -Wl,--allow-shlib-undefined" ) + endif() + + # Fixes for Ubuntu Docker container running OpenMPI 4.1 + # Without these changes, ifstest fails on the ubuntu dockers + # None of these routines use OpenMP directly, so apply generally. + + set_source_files_properties( + # Fix most ifs-test configurations + arpifs/control/cnt0.F90 arpifs/setup/su0yomb.F90 arpifs/fullpos/sufpdyn.F90 + # Fix adjoint & tangent tests + arpifs/var/suscal.F90 + # Fix 4dvar tests + arpifs/var/suecges.F90 arpifs/var/suinfce.F90 + # Fix SCM test + scmec/source/cnt1c.F90 + PROPERTIES COMPILE_FLAGS "-fno-openmp") + +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + + string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -fpe0 -convert big_endian -assume byterecl -align array64byte " + "-traceback -fpic -qopenmp -qopenmp-threadprivate compat -fp-model precise " + "-fp-speculation=safe -qopt-report=2 -qopt-report-phase=all -fast-transcendentals -ftz " + "-finline-functions -finline-limit=1500 -Winline -assume realloc_lhs " + "-diag-disable=7713 " # disable unused statement functions warning + "-diag-disable=11021 " # disable unresolved libraries in ipo warning + "-diag-disable=10397" ) # disable message reporting location of opt report files + + if(IFS_CHECK_BOUNDS) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -check bounds") + + # Disable bounds checking on files that would fail the check. + # Only files generating false positives should be added to this list. + set_source_files_properties( + ${no_bounds_checking} + PROPERTIES COMPILE_FLAGS "-check nobounds") + endif() + + if(IFS_INIT_SNAN) + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -init=snan") + endif() + + set(IFS_Fortran_FLAGS_BIT "-g -O2 -march=core-avx2 -no-fma ") + set(IFS_Fortran_FLAGS_DEBUG "-g -O0") + + set(IFS_C_FLAGS_BIT "-g -O2 -march=core-avx2 -no-fma ") + set(IFS_C_FLAGS_DEBUG "-g -O0") + + set(IFS_CXX_FLAGS_BIT "-g -O2 -march=core-avx2 -no-fma ") + set(IFS_CXX_FLAGS_DEBUG "-g -O0") + + set(ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -qopenmp -O2 -L$ENV{TBBROOT}/lib/intel64/gcc4.8 -ltbbmalloc_proxy") + if( $ENV{HOSTNAME} MATCHES "cc.*") + # On Cray using the Intel compiler cmake links with the Intel ifcore run-time library without + # multi-threaded support. This adds the version with multi-threaded support. See JIRA issue ECBUILD-464. + set(ECBUILD_SHARED_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS} -lifcoremt" ) + endif() + set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS}") + + # Use heap-arrays on leap42 desktops which have small default stack size + if( $ENV{ECPLATFORM} MATCHES "desktop-leap42") + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -heap-arrays 64 ") + endif() + + # Workaround for Intel 18.0.1 bug + string(TOUPPER ${CMAKE_BUILD_TYPE} btype) + string(REPLACE "-qopenmp " "" flags "${IFS_Fortran_FLAGS} ${IFS_Fortran_FLAGS_${btype}}") + set_source_files_properties(arpifs/fullpos/sufpdyn.F90 PROPERTIES OVERRIDE_COMPILE_FLAGS "${flags}") + + # Source file specific optimisations + set_source_files_properties(arpifs/phys_ec/cloudsc.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(arpifs/adiab/laitli.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma -qopt-prefetch=0 ") + + set_source_files_properties(arpifs/phys_ec/cloudvar.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(radiation/module/radiation_mcica_sw.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O2 -march=core-avx2 -no-fma -vecabi=cmdtarget ") + + set_source_files_properties(radiation/module/radiation_cloud_generator.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O2 -march=core-avx2 -no-fma -vecabi=cmdtarget ") + + set_source_files_properties(arpifs/phys_radi/radintg.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(arpifs/phys_ec/radiation_aerosol_optics.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(arpifs/adiab/larmes.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + set_source_files_properties(ifs/adiab/larmes_xyz.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -g -O3 -march=core-avx2 -no-fma ") + + + # Workaround for Intel 18.0.0 bug IFS-1425 + set_source_files_properties(satrad/programs/calc_radiance_fields.F90 + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_Fortran_FLAGS} -O1 -g ") + + if($ENV{ECPLATFORM} MATCHES "desktop-leap42") + set_source_files_properties(ifsaux/support/ec_args.c + PROPERTIES OVERRIDE_COMPILE_FLAGS "${IFS_C_FLAGS} -std=c99") + endif() + +elseif(CMAKE_Fortran_COMPILER_ID MATCHES "PGI") + +# # Global flags + set(IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} -Mbyteswapio -Kieee -mp") +# + set(IFS_Fortran_FLAGS_BIT "-g -O2") + set(IFS_Fortran_FLAGS_DEBUG "-O0 -g -C -Mchkstk -Ktrap=fp -Mchkfpstk -Mchkptr -Mbounds -Mcoff -Mdwarf1 -Mdwarf2 -Mdwarf3 -Melf -Mnodwarf -traceback") +# +# # Directory flags +# file(GLOB phys_radi_srcs RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/arpifs/phys_radi/*.F90") +# set_source_files_properties(${phys_radi_srcs} PROPERTIES COMPILE_FLAGS "-Mbyteswapio") +# +# # Single file flags + set_source_files_properties(arpifs/phys_radi/surrtab.F90 PROPERTIES COMPILE_FLAGS "-Kieee -Mbyteswapio") +# + set(IFS_C_FLAGS_BIT "-g -O1") + set(IFS_C_FLAGS_DEBUG "-g -O0") +# +# set(ECBUILD_SHARED_LINKER_FLAGS "-Wl,--eh-frame-hdr -Wl,--disable-new-dtags -openmp") +# set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_SHARED_LINKER_FLAGS}") + +endif() + +if( CMAKE_C_COMPILER_ID MATCHES "Clang") + set(CMAKE_C_LINK_FLAGS "") # no openmp possible +endif() +if( CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_LINK_FLAGS "") # no openmp possible +endif() + +if( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(ECBUILD_EXE_LINKER_FLAGS "${ECBUILD_EXE_LINKER_FLAGS} -Wl,-stack_size,12000000") # 1000000 = 16MB +endif() + +macro( add_precision_suffix _var ) + if( DEFINED ${_var} ) + string( REPLACE "IFS" "${PNAME}" _var_with_suffix "${_var}" ) + set( ${_var_with_suffix} ${${_var}} ) + endif() +endmacro() + +add_precision_suffix( IFS_Fortran_FLAGS ) +add_precision_suffix( IFS_Fortran_FLAGS_DEBUG ) +add_precision_suffix( IFS_Fortran_FLAGS_BIT ) + +add_precision_suffix( IFS_C_FLAGS ) +add_precision_suffix( IFS_C_FLAGS_DEBUG ) +add_precision_suffix( IFS_C_FLAGS_BIT ) + +add_precision_suffix( IFS_CXX_FLAGS ) +add_precision_suffix( IFS_CXX_FLAGS_DEBUG ) +add_precision_suffix( IFS_CXX_FLAGS_BIT ) diff --git a/arch/csc/puhti/default b/arch/csc/puhti/default new file mode 120000 index 00000000..78100fda --- /dev/null +++ b/arch/csc/puhti/default @@ -0,0 +1 @@ +intel/2021.6.0/ \ No newline at end of file diff --git a/arch/csc/puhti/gnu/11.3.0/env.sh b/arch/csc/puhti/gnu/11.3.0/env.sh new file mode 100755 index 00000000..61a317e0 --- /dev/null +++ b/arch/csc/puhti/gnu/11.3.0/env.sh @@ -0,0 +1,44 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +module_purge + +# Load modules +module_load gcc/11.3.0 + +module_load openmpi/4.1.4 +module_load intel-oneapi-mkl/2022.1.0 +module_load fftw/3.3.10-mpi +module_load netcdf-fortran/4.5.4 +module_load netcdf-c/4.8.1 +module_load hdf5/1.10.8 +module_load cmake/3.23.1 +module_load libaec/1.0.6 + +# Correct python version and libraries +module_load geoconda + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null diff --git a/arch/csc/puhti/gnu/11.3.0/final.cmake b/arch/csc/puhti/gnu/11.3.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/puhti/gnu/11.3.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/puhti/gnu/11.3.0/modulefile.in b/arch/csc/puhti/gnu/11.3.0/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/csc/puhti/gnu/11.3.0/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/csc/puhti/gnu/default b/arch/csc/puhti/gnu/default new file mode 120000 index 00000000..fcfed5b0 --- /dev/null +++ b/arch/csc/puhti/gnu/default @@ -0,0 +1 @@ +11.3.0 \ No newline at end of file diff --git a/arch/csc/puhti/intel/2021.6.0/env.sh b/arch/csc/puhti/intel/2021.6.0/env.sh new file mode 100755 index 00000000..1971aada --- /dev/null +++ b/arch/csc/puhti/intel/2021.6.0/env.sh @@ -0,0 +1,62 @@ +# Source me to get the correct configure/build/run environment + +# Store tracing and disable (module is *way* too verbose) +{ tracing_=${-//[^x]/}; set +x; } 2>/dev/null + +module_load() { + echo "+ module load $*" + module load $* +} +module_unload() { + echo "+ module unload $*" + module unload $* +} +module_purge() { + echo "+ module purge" + module purge +} + +# Unload all modules to be certain +[[ ${IFS_RUNTIME_ENV:-unset} == "unset" ]] && module_purge + +# Load modules + +export USER_SPACK_ROOT=/fmi/projappl/project_2003011/spack-intel +module_load spack/v0.18-user + +module_load intel-oneapi-compilers-classic/2021.6.0 +#module_load intel-oneapi-compilers/2022.1.0 +module_load intel-oneapi-tbb/2021.6.0 +module_load intel-oneapi-mpi/2021.6.0 +module_load intel-oneapi-mkl/2022.1.0 + +module_load fftw/3.3.10-mpi +module_load netcdf-c/4.8.1 +module_load netcdf-fortran/4.5.4 +module_load hdf5/1.12.2-mpi +module_load cmake/3.23.1 + +#module_load geoconda +source /fmi/projappl/project_2003011/bergmant/openifs-48r1-pls/.oifspy/bin/activate +lspack="/appl/spack/v018/install-tree/intel-2021.6.0" +llibaec=$lspack/libaec-1.0.6-txsq2w + +for lib in $llibaec; do + export CPATH=$lib/include:$CPATH + export LIBRARY_PATH=$lib/lib64:$LIBRARY_PATH + export PATH=$lib/bin:$PATH + export PKG_CONFIG_PATH=$lib/lib/pkgconfig:$PKG_CONFIG_PATH + export CMAKE_PREFIX_PATH=$lib/.:$CMAKE_PREFIX_PATH + export LD_LIBRARY_PATH=$lib/lib64:$LD_LIBRARY_PATH + export LIBAEC_INSTALL_ROOT=$lib +done + +# Setting required for bit reproducibility with Intel MKL: +export MKL_CBWR=AUTO,STRICT + +# Record the RPATH in the executable +export LD_RUN_PATH=$LD_LIBRARY_PATH + +# Restore tracing to stored setting +{ if [[ -n "$tracing_" ]]; then set -x; else set +x; fi } 2>/dev/null + diff --git a/arch/csc/puhti/intel/2021.6.0/final.cmake b/arch/csc/puhti/intel/2021.6.0/final.cmake new file mode 120000 index 00000000..bb3bb4f4 --- /dev/null +++ b/arch/csc/puhti/intel/2021.6.0/final.cmake @@ -0,0 +1 @@ +../../../../ecmwf/final.cmake \ No newline at end of file diff --git a/arch/csc/puhti/intel/2021.6.0/modulefile.in b/arch/csc/puhti/intel/2021.6.0/modulefile.in new file mode 120000 index 00000000..0801ce95 --- /dev/null +++ b/arch/csc/puhti/intel/2021.6.0/modulefile.in @@ -0,0 +1 @@ +../../../../ecmwf/modulefile.in \ No newline at end of file diff --git a/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh b/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh index 63177301..2aa757fb 100755 --- a/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh +++ b/arch/ecmwf/hpc2020/intel/2021.4.0/hpcx-openmpi/2.9.0/env.sh @@ -30,6 +30,7 @@ module_purge() { # Load modules module_load prgenv/intel module_load intel/2021.4.0 +#module_load intel/2023.2.0 module_load hpcx-openmpi/2.9.0 module_load intel-mkl/19.0.5 diff --git a/hpc-csc-config.edit_me.sh b/hpc-csc-config.edit_me.sh new file mode 100644 index 00000000..e93431de --- /dev/null +++ b/hpc-csc-config.edit_me.sh @@ -0,0 +1,97 @@ +# +# +# hpc-config.edit_me.sh +# +# +# This script sets the HPC environment for CSC platforms (puhti, +# lumi, and mahti) for OpenIFS 48r1 +# +# The script is ran in oifs-config.edit_me.sh, which requires +# editing for that purpose. +# +# + +#--- set default values to unset for some variables ---------------------- +unset HPC_PARTITION +unset HPC_ACCOUNT +unset DEFAULT_NUM_THREADS +unset IGT_BUILD_LAUNCHER +unset IGT_TEST_LAUNCHER +unset HPC_FLAGS + +#--- set HPC architecture specific settings ----------------------------- + +if [[ $HPC_PLATFORM == "hpc2020" ]]; then + #--- HPC2020 SPECIFIC SETTINGS + + #--- global variables + export DEFAULT_NUM_THREADS=64 + + #--- + +elif [[ $HPC_PLATFORM == "puhti" ]]; then + #--- PUHTI SPECIFIC SETTINGS + #--- local variables + PARTITION="--partition=fmi" + ACCOUNT="--account=project_2003011" + MEM="--mem=0" + + # Add exclusive flag for Puhti: + # start a single tasks reserving a full node (shared otherwise), + # also change the default TMPDIR (changed in openifs-bundle) + HPC_FLAGS="-n 1 --exclusive --export=ALL,MY_TMP=/dev/shm" + + #--- global variables + # Since we need to reserve the full node, make use of it + export DEFAULT_NUM_THREADS=40 + + # Make sure GIT is loaded + module load git + + # Overwrite compile flags. There's a bug in Puhti installed libxml + # resulting in floating point exception due to the use of -ffpe-trap= + cp -f /fmi/projappl/project_2003011/bergmant/openifs-48r1-pls/arch/csc/puhti/compile_flags_puhti.cmake /fmi/projappl/project_2003011/bergmant/openifs-48r1-pls/ifs-source/cmake/compile_flags.cmake + + #--- + +elif [[ $HPC_PLATFORM == "lumi" ]]; then + #--- LUMI SPECIFIC SETTINGS + #--- local variables + PARTITION="--partition=small" + ACCOUNT="--account=project_462000178" + MEM="--mem=60GB" + + #--- global variables + export DEFAULT_NUM_THREADS=16 + export EBU_USER_PREFIX=/project/project_462000178/EasyBuild + + #--- + +elif [[ $HPC_PLATFORM == "mahti" ]]; then + #--- MAHTI SPECIFIC SETTINGS + #--- local variables + PARTITION="--partition=medium" + ACCOUNT="--account=project_2001029" + MEM="--mem=60GB" + + # Need specify the number of tasks for slurm, + # otherwise thread number used as tasks + HPC_FLAGS="-n 1" + + #--- global variables + export DEFAULT_NUM_THREADS=10 + + #--- + +else + #--- UNSPECIFIED PLATFORM DEFAULTS + # Note: Default threads = 8 works on Mac M1 but is + # potentially too high for older systems + export DEFAULT_NUM_THREADS=8 +fi + +#--- set non-default launcher options +if [[ $HPC_HOST == "csc" ]]; then + export IGT_BUILD_LAUNCHER="srun $HPC_FLAGS -c ${DEFAULT_NUM_THREADS} ${MEM} --time=60 $ACCOUNT $PARTITION" + export IGT_TEST_LAUNCHER="salloc -n 8 --mem=20GB --time=60 $ACCOUNT $PARTITION" +fi diff --git a/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 b/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 index b78586bf..60ddb6af 100644 --- a/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 +++ b/ifs-source/arpifs/chem/bascoetm5_chem_ini.F90 @@ -60,7 +60,7 @@ SUBROUTINE BASCOETM5_CHEM_INI(YGFL,YDCHEM,YDCOMPO) USE PARKIND1 ,ONLY : JPIM, JPRM, JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK USE BASCOETM5_MODULE, ONLY : NBC, BASCOE_BCVAL, BASCOE_BCNAME - +USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI IMPLICIT NONE @@ -403,264 +403,6 @@ SUBROUTINE TRACER_IDX_CHECK_BASCOETM5(YGFL,YDCOMPO) END SUBROUTINE TRACER_IDX_CHECK_BASCOETM5 -! Initialize new photolysis routine -! ----------------------------------------------------------- -SUBROUTINE PHOTOLYSIS_INI -USE TM5_PHOTOLYSIS , ONLY : WAVE_FULL, DWAVE_FULL, WAVE, DWAVE, MAXWAV, & - & NWAV_NO2,NWAV_CO,NWAV_HNO3,NWAV_O3,NWAV_PAN,NWAV_H2O2,NWAV_N2O5,NWAV_CH2O,& - & NWAV_NO3,NWAV_ACET, & - & CS_RAY, PHI0, RD, FLUX, NTEMP_MAX, & - & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & - & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & - & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & - & SCA,ABS_EFF, GFAC, EXT , PN_REF - -USE YOMLUN , ONLY : NULOUT -USE PARKIND1 , ONLY : JPIM ,JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK - -IMPLICIT NONE - -! Local parameters -INTEGER(KIND=JPIM), PARAMETER :: IUTMP=77 -INTEGER(KIND=JPIM) :: IK, IWAV, JL -REAL(KIND=JPRB) :: ZWL,ZX -LOGICAL :: LLFILEOK -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - -!TM5 photolysis info file -CHARACTER(LEN=27) :: CL_TM5_PHOTO_LOOKUP='tropo_look_up_cbmhybrid.dat' -!TM5 extraterrestrial flux: -CHARACTER(LEN=21) :: CL_TM5_EXTRATERRESTRIAL='OMI.data.extraterrest' -!TM5 aerosol: -CHARACTER(LEN=18) :: CL_TM5_AEROSOL='aerosol_reduce.dat' -#include "abor1.intfb.h" - - -IF (LHOOK) CALL DR_HOOK('BASCOETM5_CHEM_INI:PHOTOLYSIS_INI',0,ZHOOK_HANDLE) - -DO IK=1,13 - WAVE_FULL(IK)=1._JPRB/(56250._JPRB-500._JPRB*IK) -ENDDO - -DO IK=14,45 - WAVE_FULL(IK)=1._JPRB/(49750._JPRB-(IK-13)*500._JPRB) -ENDDO - -DO IK=46,68 - WAVE_FULL(IK)=(266._JPRB+(IK-13))*1.E-7_JPRB -ENDDO - -DO IK=69,71 - WAVE_FULL(IK)=(320.5_JPRB+2.*(IK-68))*1.E-7_JPRB -ENDDO -DO IK=72,176 - WAVE_FULL(IK)=(325._JPRB+5._JPRB*(IK-71))*1.E-7_JPRB -ENDDO - -DO IK=2,MAXWAV-1 - DWAVE_FULL(IK)=0.5_JPRB*(WAVE_FULL(IK+1)-WAVE_FULL(IK-1)) -ENDDO -DWAVE_FULL(1) = DWAVE_FULL(2) -DWAVE_FULL(MAXWAV) = DWAVE_FULL(MAXWAV-1) -! select a subset from the full spctral grid to remove the first band -WAVE=WAVE_FULL(14:135) -DWAVE=DWAVE_FULL(14:135) - - -!--------------------------------------------------------------------- -! Rayleigh scattering cross sections -! emp. formula of Nicolet plan. space sci.32, 1467f (1984) -!--------------------------------------------------------------------- - -DO IK=1,MAXWAV - ZWL=WAVE(IK)*1.E4_JPRB - ZX=0.389*ZWL+0.09426_JPRB/ZWL-0.3228_JPRB - CS_RAY(IK)=4.02E-28_JPRB/ZWL**(4._JPRB+ZX) -ENDDO - -!--------------------------------------------------------------------- -! QUANTUM YIELD OF METHYGLYOXAL S. KOCH and G. K. MOORTGAT -! J Phys Chem, 102, 9142-9153, 1998. -! -! JEW: the qy_ch3cocho array has been reduced to 52 bins to represent the pressure. -! dep. spectral bins ONLY !! -!--------------------------------------------------------------------- - -! Calculate co-efficients for METHYGLYOXAL qy outside loop -PHI0 = 1. -RD = 0. - -! for wave < 380nm qy is essentially = 1.0. -DO IK = 1,39 - IF(IK<32) THEN - PHI0(IK) = 1 - ELSEIF(IK>=32) THEN - PHI0(IK) = 8.15E-9_JPRB * EXP(7131._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - ENDIF - RD(IK) = 7.34E-9_JPRB * EXP(8793._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -DO IK = 40,52 - PHI0(IK) = 3.63E-7_JPRB * EXP(5693._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - RD(IK) = 1.93E4_JPRB*EXP(-5639._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -!-------------------------------------------------------------- -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_PHOTO_LOOKUP),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR bascoetm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - CALL ABOR1('tm5_chem_ini: photo inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_PHOTO_LOOKUP)) - -READ(IUTMP,*) -READ(IUTMP,*) -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_O3_LOOK(IWAV,IK),IWAV=1,MAXWAV) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_HNO3_LOOK(IWAV,IK),IWAV=1,NWAV_HNO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_H2O2_LOOK(IWAV,IK),IWAV=1,NWAV_H2O2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_N2O5_LOOK(IWAV,IK),IWAV=1,NWAV_N2O5) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_CH2O_LOOK(IWAV,IK),IWAV=1,NWAV_CH2O) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_PAN_LOOK(IWAV,IK),IWAV=1,NWAV_PAN) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO3_LOOK(IWAV,IK),IWAV=1,NWAV_NO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (QY_O3_LOOK(IWAV,IK),IWAV=1,NWAV_O3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_CO_LOOK(IWAV,IK),IWAV=1,NWAV_CO) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A1_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A2_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A3_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A4_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -CLOSE(IUTMP) - -ENDIF - -! put constants in correct units -A1_ACET=A1_ACET*1E-18_JPRB -A2_ACET=A2_ACET*1E-17_JPRB -A4_ACET=A4_ACET*1E-15_JPRB - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -! -!----- extraterrestrial flux from input file ------------------ -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_EXTRATERRESTRIAL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR bascoectm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - CALL ABOR1('tm5_chem_ini: extraterrestrial inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_EXTRATERRESTRIAL)) - READ(IUTMP,*) - READ(IUTMP,*) FLUX - CLOSE(IUTMP) -ENDIF - -!************************************************************************** -! aerosol data from: "Models for Aerosols of the Lower Atmosphere -! and the Effects of Humidity Variations on their Optical Properties -! E. P. Shettle and R. W. Fenn (1979), Environmental Research Paper -! No. 676 -!************************************************************************** -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_AEROSOL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR bascoetm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_AEROSOL) - CALL ABOR1('tm5_chem_ini: aerosol inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_AEROSOL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_AEROSOL)) - DO JL = 1,4 - READ(IUTMP,*) - DO IK = 1,8 - READ(IUTMP,*) - READ(IUTMP,'(6(1X,F7.5))')(EXT(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(ABS_EFF(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(GFAC(IWAV,IK,JL),IWAV=1,MAXWAV) - DO IWAV=1,MAXWAV - SCA(IWAV,IK,JL) = EXT(IWAV,IK,JL) - ABS_EFF(IWAV,IK,JL) - ENDDO - ENDDO - ENDDO - CLOSE(IUTMP) - - DO IWAV=1,MAXWAV - DO IK=1,8 - DO JL=1,4 - SCA(IWAV,IK,JL) = SCA(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ABS_EFF(IWAV,IK,JL) = ABS_EFF(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ENDDO - ENDDO - ENDDO - -ENDIF - -!VH - file format(6(1X,F7.5)) - -WRITE(NULOUT,*) 'INFO bascoetm5_chem_ini: Finished reading TM5 photolysis input files ' - - -IF (LHOOK) CALL DR_HOOK('BASCOETM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) - - -END SUBROUTINE PHOTOLYSIS_INI - - - - SUBROUTINE BASCOETM5_INI_BUDGET(YGFL,YDCHEM) !** DESCRIPTION diff --git a/ifs-source/arpifs/chem/chem_bascoetm5.F90 b/ifs-source/arpifs/chem/chem_bascoetm5.F90 index fff33ead..d512f1cb 100644 --- a/ifs-source/arpifs/chem/chem_bascoetm5.F90 +++ b/ifs-source/arpifs/chem/chem_bascoetm5.F90 @@ -538,10 +538,10 @@ SUBROUTINE CHEM_BASCOETM5 & ! Compute here 'roundoff' number - there is a paralellization ! issue when calling WLMACH as part of kpp-code. -IF ( KSTEP == 0_JPIM ) THEN +!IF ( KSTEP == 0_JPIM ) THEN ! a more robust test on YDRIP%NSTADD instead of kstep, and done in a setup routine, should be devised CALL CIFS_KPP_WLAMCH(ROUNDOFF_BASCOE , 'E') ROUNDOFF_TM5=ROUNDOFF_BASCOE -ENDIF +!ENDIF ! 1.0 Initialize output tendencies to 0. PTENC1(KIDIA:KFDIA,:,:)=0.0_JPRB diff --git a/ifs-source/arpifs/chem/chem_init.F90 b/ifs-source/arpifs/chem/chem_init.F90 index 0591de77..c115ce80 100644 --- a/ifs-source/arpifs/chem/chem_init.F90 +++ b/ifs-source/arpifs/chem/chem_init.F90 @@ -159,9 +159,13 @@ SUBROUTINE CHEM_INIT(YDGEOMETRY,YDML_GCONF,YDDYNA,YDML_CHEM) CALL ARPCLIM_CHEM_INI(YDGEOMETRY,YGFL,YDCHEM) + CASE ("SimChem") + + ! Nothing to do + CASE DEFAULT - CALL ABOR1(" NO KNOWN CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) + CALL ABOR1(" NO KNOWN CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) END SELECT diff --git a/ifs-source/arpifs/chem/chem_main.F90 b/ifs-source/arpifs/chem/chem_main.F90 index fdcafa00..82f02d60 100644 --- a/ifs-source/arpifs/chem/chem_main.F90 +++ b/ifs-source/arpifs/chem/chem_main.F90 @@ -82,7 +82,7 @@ SUBROUTINE CHEM_MAIN & ! OUTPUTS: ! ------- ! PTENC (KLON,KLEV,KTRAC) : TENDENCY OF CONCENTRATION OF TRACERS including chemistry(kg/kg s-1) -! PCHEM2AER (KLON,KLEV,4) : TENDENCY OF Selected TRACERS because specific reactions (kg/kg s-1) +! PCHEM2AER (KLON,KLEV,NCHEM2AER) : TENDENCY OF Selected TRACERS because specific reactions (kg/kg s-1) ! PCHEM2GHG (KLON,KLEV,NCHEM2GHG) : TENDENCY OF Selected TRACERS because specific reactions. ! 1. Field 1 containing CH4 loss rate ( s-1) ! 2. tropospheric CO2 production tendency due to CO oxidation [kg CO2/kg/s] @@ -146,9 +146,6 @@ SUBROUTINE CHEM_MAIN & & ISO2_BASCOETM5=>ISO2, ISO4_BASCOETM5=>ISO4, INH4_BASCOETM5=>INH4 USE BASCOE_MODULE, ONLY : BASCOE_BC, NBC - - - USE TM5_PHOTOLYSIS, ONLY : NPHOTO USE UKCA_MODE_SETUP, ONLY: NMODES USE YOM_GRIB_CODES, ONLY : NGRBGHG @@ -223,8 +220,10 @@ SUBROUTINE CHEM_MAIN & INTEGER(KIND=JPIM) :: JK, JL, JT, INO, IN2O, IJOUT, IPOS, ILI, IICH4, IIHNO3 INTEGER(KIND=JPIM) :: ICO,IGHGCH4,FCO2,FCO2NOBIO,FCO2NOFLX INTEGER(KIND=JPIM) :: IPCH4, ISAD +INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS ! SimChem + REAL(KIND=JPRB) :: ZDELP(KLON,KLEV) -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE REAL(KIND=JPRB) :: ZCON(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM) REAL(KIND=JPRB) :: ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM) REAL(KIND=JPRB) :: ZTENC1(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM) @@ -255,6 +254,9 @@ SUBROUTINE CHEM_MAIN & REAL(KIND=JPRB) :: ZCOTRA(KLON,KLEV,3) ! 3 traceurs contrails, parametrisation à implementer REAL(KIND=JPRB) :: ZEMIS(KLON,KLEV,3) ! 3 especes emises par l'aviation, parametrisation à implementer REAL(KIND=JPRB) :: ZAREAD_NAT(KLON,KLEV),ZAREAD_ICE(KLON,KLEV),ZAREAD_SUL(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO4_LPROD(KLON,KLEV) +REAL(KIND=JPRB) :: ZTSO2(KLON,KLEV), ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV), ZITSO2(KLON,KLEV), ZSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZFSO2(KLON), ZFSO4_AQ(KLON), ZFSO4(KLON) LOGICAL :: LLCHECK_METEO, LLTENDUPDT !------------------------------------------------------------------------ !------------------------------------------------------------------------ @@ -273,15 +275,11 @@ SUBROUTINE CHEM_MAIN & #include "troplev.intfb.h" #include "chem_rnpb.intfb.h" #include "chem_nwpo3.intfb.h" - - - - - +#include "aer_so2so4_v2.intfb.h" IF (LHOOK) CALL DR_HOOK('CHEM_MAIN',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NCHEM=>YGFL%NCHEM, NCHEM_DV=>YGFL%NCHEM_DV, & & NCHEM_SCV=>YGFL%NCHEM_SCV, NDIM=>YGFL%NDIM, NDIM1=>YGFL%NDIM1, NGFL_EXT=>YGFL%NGFL_EXT, & & YCHEM=>YGFL%YCHEM, YGHG=>YGFL%YGHG, NGHG=>YGFL%NGHG, YEXT=>YGFL%YEXT, YLRCH4=>YGFL%YLRCH4,& @@ -293,7 +291,7 @@ SUBROUTINE CHEM_MAIN & & LCHEM_TROPO=>YDCOMPO%LCHEM_TROPO, RCH4CONST=>YDCHEM%RCH4CONST, & & LCHEM_ARPCLIM=>YDCHEM%LCHEM_ARPCLIM, & & LAERCHEM=>YGFL%LAERCHEM, LAERNITRATE => YDCOMPO%LAERNITRATE, KCHEM_WETDEP =>YDCHEM%KCHEM_WETDEP, & - & LAERSOA=>YDCOMPO%LAERSOA,LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED ) + & LAERSOA=>YDCOMPO%LAERSOA,LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED,AERO_SCHEME=>YDCOMPO%AERO_SCHEME ) ! LLTENDUPDT=.TRUE. @@ -390,9 +388,11 @@ SUBROUTINE CHEM_MAIN & ENDIF ENDDO -!Initialize PCHEM2GHG to zero +!Initialize PCHEM2GHG/PCHEM2AER to zero PCHEM2GHG(KIDIA:KFDIA,1:KLEV,1:NCHEM2GHG)=0.0_JPRB - +IF (NACTAERO > 0 ) THEN + PCHEM2AER(KIDIA:KFDIA,1:KLEV,1:NCHEM2AER)=0.0_JPRB +ENDIF ! copy meto input in local arrays ZALB(KIDIA:KFDIA) = PALB(KIDIA:KFDIA) @@ -445,7 +445,6 @@ SUBROUTINE CHEM_MAIN & WHERE (ZCSZA(KIDIA:KFDIA) < -1._JPRB) ZCSZA(KIDIA:KFDIA) = -1.0_JPRB ENDIF - !* 2.0 Chemistry ! --------------- ! initialise zbudr to prevent fpe in openifs-test @@ -536,12 +535,23 @@ SUBROUTINE CHEM_MAIN & ! output for aerosol scheme IF (NACTAERO > 0 .AND. LAERCHEM) THEN + ! BASCOE not supported at the moment with HAMM7 + ! BASCOETM5 does not have separated Gas-phase and Aqueous phase SO4, which will most probably lead to crash/incorrect results. PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_BASCOETM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_BASCOETM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_BASCOETM5) - - ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) - + ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_BASCOETM5) ! this will be added to incoming tendency + + SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("aer") + PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + + CASE ("hamm7") + CALL ABOR1(" HAMM7 not supported for BASCOETM5 yet " ) + !!!!!! + !BASCOETM5 does not have LPROD yet, uncomment when added!!! + !!!!!! + !PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = ZSO4_LPROD(KIDIA:KFDIA,1:KLEV) + END SELECT ENDIF IF (NACTAERO > 0 .AND. LAERNITRATE) THEN PCHEM2AER(KIDIA:KFDIA,1:KLEV,4) = ZTENC1(KIDIA:KFDIA,1:KLEV,INH4_BASCOETM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,INH4_BASCOETM5) @@ -612,22 +622,30 @@ SUBROUTINE CHEM_MAIN & CASE ("tm5") CALL CHEM_TM5(YDVAB,YDDIMV,YDMODEL,NSTEP, KIDIA , KFDIA , KLON, KLEV , KVCLIS, NACTAERO ,& - & PTSTEP ,ZDELP, PRS1, PRSF1, PGEOH, ZQP, PTP,& - & ZLP, ZIP, ZAP, ZPTROP, ZALB, PWND, PLSM, ZCSZA, PGELAT, PGELAM,& - & PGEMU, PKOZO, IKLEVTROP, PDV, ZCON, ZTENC1, ZBUDR, ZBUDJ, ZBUDX, ZOUT,& - & PAEROC,PWETDIAM, PWETVOL,PND, PAERAOT, PAERAAOT, PAERASY, ZSOGTOSOA, & - & PCHEM2GHG) + & PTSTEP ,ZDELP, PRS1, PRSF1, PGEOH, ZQP, PTP,& + & ZLP, ZIP, ZAP, ZPTROP, ZALB, PWND, PLSM, ZCSZA, PGELAT, PGELAM,& + & PGEMU, PKOZO, IKLEVTROP, PDV, ZCON, ZTENC1, ZBUDR, ZBUDJ, ZBUDX, ZOUT,& + & PAEROC,PWETDIAM, PWETVOL,PND, PAERAOT, PAERAAOT, PAERASY, ZSOGTOSOA, & + & PCHEM2GHG, ZSO4_LPROD) CALL CHEM_DECAY(YGFL,KIDIA,KFDIA,KLON,KLEV,PTSTEP, PRSF1, PGELAT, ZCON,ZTENC1) ! output for aerosol scheme IF (NACTAERO > 0 .AND. LAERCHEM) THEN - PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) ! leave this for diagnostics + ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) ! this will be added to incoming tendency + + SELECT CASE (TRIM(AERO_SCHEME)) + CASE ("aer") + PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + + CASE ("hamm7") + PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = ZSO4_LPROD(KIDIA:KFDIA,1:KLEV) + END SELECT ENDIF + IF (NACTAERO > 0 .AND. LAERNITRATE) THEN PCHEM2AER(KIDIA:KFDIA,1:KLEV,4) = ZTENC1(KIDIA:KFDIA,1:KLEV,INH4_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,INH4_TM5) ZTENC1(KIDIA:KFDIA,1:KLEV,INH4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,INH4_TM5) @@ -639,7 +657,7 @@ SUBROUTINE CHEM_MAIN & PCHEM2AER(KIDIA:KFDIA,1:KLEV,6) = ZSOGTOSOA(KIDIA:KFDIA,1:KLEV,2) ENDIF - IICH4=ICH4_TM5 + IICH4=ICH4_TM5 ! Diagnostics in 3d extra fields IF (LCHEM_DIA) THEN ! chemistry tendencies @@ -805,6 +823,70 @@ SUBROUTINE CHEM_MAIN & CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NCHEM, & & KLEVX,ZDELP,PTSTEP,ZTENC1,ZTENC0,PEXTRA(:,:, IEXTR_CH)) ENDIF + + ! Simplified sulfur scheme V2 - here only for M7 aerosols scheme + CASE ("SimChem") + + IF(NCHEM.NE.2) THEN + CALL ABOR1(" NCHEM IS NOT EQUAL TO 2 " ) + ENDIF + + DO JT=1,NCHEM + IF (TRIM (YCHEM(JT)%CNAME) == 'SO2' ) ISSO2=JT + IF (TRIM (YCHEM(JT)%CNAME) == 'H2SO4' ) ISSO4=JT + ENDDO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + !ZTSO2(JL,JK) = PTENC(JL,JK,ISSO2) + !ZTSO4(JL,JK) = PTENC(JL,JK,ISSO4) + !ZTSO4_AQ(JL,JK) = PTENC(JL,JK,ISSO4_ACS)! liquid phase + !ZSO2(JL,JK) = PAEROP(JL,JK,ISSO2) + ZSO2(JL,JK) = ZCON(JL,JK,ISSO2) ! SO2 concentration + + ZITSO2(JL,JK) = ZTENC0(JL,JK,ISSO2)! SO2 tendecny at previous time step + !ZITSO2(JL,JK) = PTENC(JL,JK,KCHEM(ISSO2))! SO2 tendecny at previous time step + END DO + END DO + CALL AER_SO2SO4_V2( YDRIP, & + & KIDIA , KFDIA , KLON , KLEV , & + & PTSTEP, PTP , PRSF1 , ZAP, ZLP, PGELAT, PGELAM, & + & ZSO2 , ZITSO2, & + & PGFL(:,:,YGFL%YAEROCLIM(1)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(2)%MP), & + & PGFL(:,:,YGFL%YAEROCLIM(3)%MP), & + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDELP) + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! ZTSO2 + !ZTENC1(JL,JK,ISSO2) = ZTENC1(JL,JK,ISSO2)+ZTSO2(JL,JK) + ZTENC1(JL,JK,ISSO2) = ZTSO2(JL,JK) ! + ZTENC1(JL,JK,ISSO4)= ZTSO4(JL,JK) ! index ISSO4 + !ZTENC1(JL,JK,ISSO2) = ZTENC0(JL,JK,ISSO2) + !ZTENC1(JL,JK,ISSO4) = ZTENC0(JL,JK,ISSO4) + !! SO4 formed in clouds is applied to Accumulati + PCHEM2AER(JL,JK,1) = ZTSO4(JL,JK) ! gas phase + PCHEM2AER(JL,JK,2) = ZTSO4_AQ(JL,JK)!liquid (AQueous) phase + + END DO + END DO + + ! output for aerosol scheme + !IF (NACTAERO > 0 .AND. LAERCHEM) THEN + + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,1) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) -ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + ! ZTENC1(KIDIA:KFDIA,1:KLEV,ISO4_TM5) = ZTENC0(KIDIA:KFDIA,1:KLEV,ISO4_TM5) + ! + ! SELECT CASE (TRIM(AERO_SCHEME)) + ! CASE ("aer") + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = -1.0_JPRB*ZBUDR(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,3) = ZTENC1(KIDIA:KFDIA,1:KLEV,ISO2_TM5) - ZTENC0(KIDIA:KFDIA,1:KLEV,ISO2_TM5) + + ! CASE ("hamm7") + ! PCHEM2AER(KIDIA:KFDIA,1:KLEV,2) = ZSO4_LPROD(KIDIA:KFDIA,1:KLEV) + ! END SELECT + !ENDIF + CASE DEFAULT CALL ABOR1(" NO CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) @@ -813,7 +895,7 @@ SUBROUTINE CHEM_MAIN & IF (LLTENDUPDT ) THEN DO JT=1,NCHEM - ! WRITE(NULOUT,*) ' Species ', JT , YCHEM(JT)%CNAME, + ! WRITE(NULOUT,*) ' Species ', JT , YCHEM(JT)%CNAME, ! loop over levels DO JK=1,KLEV ! loop over points diff --git a/ifs-source/arpifs/chem/chem_tm5.F90 b/ifs-source/arpifs/chem/chem_tm5.F90 index 24b94280..ffe0c0c1 100644 --- a/ifs-source/arpifs/chem/chem_tm5.F90 +++ b/ifs-source/arpifs/chem/chem_tm5.F90 @@ -12,7 +12,7 @@ SUBROUTINE CHEM_TM5& & PLP, PIP, PAP, PPTROPO, PALB, PWND, PLSM, PCSZA, PGELAT,& & PGELAM, PGEMU, PKOZO, KLEVTROP, PDV, PCEN , PTENC1, PBUDR, PBUDJ, PBUDX, POUT,& & PAEROP,PWETDIAM, PWETVOL,PND,PAERAOT, PAERAAOT, PAERASY,PSOGTOSOA, & - & PCHEM2GHG) + & PCHEM2GHG, PSO4_LPROD) !** DESCRIPTION @@ -133,6 +133,7 @@ SUBROUTINE CHEM_TM5& USE TM5_PHOTOLYSIS , ONLY : NPHOTO,NBANDS_TROP,NGRID, JNO2 USE YOMCST , ONLY : RD, RMD, RG , RPI, RMCO2 USE YOMRIP0 , ONLY : NINDAT +USE TM5M7_DATA, ONLY: IACS_N, ICOS_N, ISO4COS, ISO4ACS, ISO4NUS, ISO4AIS ! TM5 chemistry ... USE TM5_KPP_Parameters, ONLY : NREACT, NVAR @@ -189,6 +190,7 @@ SUBROUTINE CHEM_TM5& REAL(KIND=JPRB) ,INTENT(IN) :: PAERASY(KLON,KLEV,6) REAL(KIND=JPRB) ,INTENT(OUT):: PSOGTOSOA(KLON,KLEV,2) REAL(KIND=JPRB) ,INTENT(OUT):: PCHEM2GHG(KLON,KLEV,NCHEM2GHG) +REAL(KIND=JPRB) ,INTENT(OUT):: PSO4_LPROD(KLON,KLEV) !----------------------------------------------------------------------- @@ -272,10 +274,14 @@ SUBROUTINE CHEM_TM5& INTEGER(KIND=JPIM), DIMENSION(3) :: JAER_TRACER INTEGER(KIND=JPIM), DIMENSION(2) :: JRATE_TRACER +!HAMM7-related +REAL(KIND=JPRB), DIMENSION(KLON) :: ZFACTOR_NUMCM3 +REAL(KIND=JPRB), DIMENSION(KLON,KAERO) :: ZAEROI,ZAEROP REAL(KIND=JPRB) :: ZTAU_NUDGE REAL(KIND=JPRB) :: ZRGI, ZDELP, ZT0NO, ZT0NO2, ZCONC_HO2 LOGICAL :: LLCOD_TM5 + ! Switch for selection of aerosol parameterization for photolysis INTEGER(KIND=JPIM), PARAMETER :: ITAU_MACC=0 ! Switch for selection of HNO3 BC parameterization. 1=updated @@ -316,6 +322,7 @@ SUBROUTINE CHEM_TM5& #include "tm5_stratbc_ch4.intfb.h" #include "tm5_sundis.intfb.h" #include "tm5_wetchem.intfb.h" +#include "tm5_wetchem_m7.intfb.h" #include "cod_op_tm5.intfb.h" #include "o3chem.intfb.h" ! KPP code - TROP - Code already included in chem_tm5bascoe.F90... @@ -369,9 +376,9 @@ SUBROUTINE CHEM_TM5& ! Compute here 'roundoff' number - there is a paralellization ! issue when calling WLMACH as part of kpp-code. -IF ( KSTEP == 0_JPIM ) THEN +!IF ( KSTEP == 0_JPIM ) THEN ! a more robust test on YDRIP%NSTADD instead of kstep, and done in a setup routine, should be devised CALL CIFS_KPP_WLAMCH(ROUNDOFF_STORE , 'E') -ENDIF +!ENDIF JAER_TRACER(1)=ISO4 JAER_TRACER(2)=IMSA @@ -402,6 +409,7 @@ SUBROUTINE CHEM_TM5& POUT(KIDIA:KFDIA,:,:) = 0.0_JPRB PSOGTOSOA(KIDIA:KFDIA,:,:) = 0.0_JPRB +PSO4_LPROD(KIDIA:KFDIA,:) = 0.0_JPRB ! Lat / Lon DO JL=KIDIA,KFDIA @@ -428,7 +436,7 @@ SUBROUTINE CHEM_TM5& ! 1.2 Calculate integrated cloud cover above level - adapted from cldpp.f90 -ZCC=0.0_JPRB +ZCC(KIDIA:KFDIA,1:KLEV)=0.0_JPRB DO JL=KIDIA,KFDIA ZCC(JL,1)=1.0_JPRB-MIN(MAX(PAP(JL,1),REPCLC),1.0_JPRB-REPCLC) @@ -495,7 +503,7 @@ SUBROUTINE CHEM_TM5& ! ITAU_MACC = 2_JPIM ! Use simple (but wrong) climatology for aerosol optical depth if no prognostic MACC aerosol is used IF ( LCHEM_AEROI ) THEN - IF (TRIM(AERO_SCHEME)=="aer" )THEN + IF (TRIM(AERO_SCHEME)=="aer") THEN !FIXME: M7 and LCHEM_AEROI - see OIFS-568 ! * from MACC fields CALL TM5_MACC_AEROSOL(KIDIA,KFDIA,KLON,KLEV, KAERO, & & PRS1 , PAEROP , ZRHCL , & @@ -615,9 +623,20 @@ SUBROUTINE CHEM_TM5& ENDDO IF (LAERCHEM) THEN + + SELECT CASE (TRIM(AERO_SCHEME)) + + CASE ("aer") !* use aerosol scheme SO4 for WETCHEM and EQSAM - ISSO4 = SUM(NTYPAER(1:4)) + 1 - ZCVM0(JL,ISO4) = MAX(PAEROP(JL,JK,ISSO4) / YCHEM(ISO4)%RMOLMASS *ZAIRDM(JL), 0._JPRB) + ISSO4 = SUM(NTYPAER(1:4)) + 1 + ZCVM0(JL,ISO4) = MAX(PAEROP(JL,JK,ISSO4) / YCHEM(ISO4)%RMOLMASS *ZAIRDM(JL), 0._JPRB) + + CASE ("hamm7") +!* identify corresponding tracer in M7 aero scheme + ZCVM0(JL,ISO4) = MAX((PAEROP(JL,JK,ISO4NUS)+ PAEROP(JL,JK,ISO4AIS) +PAEROP(JL,JK,ISO4ACS) +PAEROP(JL,JK,ISO4COS)) / YCHEM(ISO4)%RMOLMASS *ZAIRDM(JL) ,0._JPRB) + + END SELECT + ENDIF IF (LAERNITRATE) THEN @@ -675,7 +694,7 @@ SUBROUTINE CHEM_TM5& ZDT_EBI=PTSTEP/ITEREBI DO IB=1_JPIM,ITEREBI - + !PLS-2024-09-09 THE EBI IS INCOMPLETE (missing M7 case and more) !3.1 wet sulphur/ammonia chemistry CALL TM5_WETCHEM(YGFL,KIDIA,KFDIA,KLON,ZDT_EBI,PTP(:,JK),PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM) @@ -717,7 +736,37 @@ SUBROUTINE CHEM_TM5& ITEREBI = 1_JPIM ! select KPP... !3.1 wet sulphur/ammonia chemistry - CALL TM5_WETCHEM(YGFL, KIDIA, KFDIA, KLON,PTSTEP,PTP(:,JK),PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM) + + IF (LAERCHEM .AND. TRIM(AERO_SCHEME) == "hamm7") THEN + + ! conversion factor for aerosol number [#/kg] to [# /cm3].. + ZFACTOR_NUMCM3(KIDIA:KFDIA) = 1E-6_JPRB*ZCVM(KIDIA:KFDIA,IAIR) + + DO JT=1,KAERO + !* For now only initialize fields that are required in wetchem + IF (ANY( (/ ISO4COS,ISO4ACS,ISO4NUS,ISO4AIS /) == JT) ) THEN + ZAEROI(KIDIA:KFDIA,JT) = MAX(PAEROP(KIDIA:KFDIA,JK,JT) / 96. *ZAIRDM(KIDIA:KFDIA) ,0._JPRB) + !* initialize final (ZAEROP) concentrations + ZAEROP(KIDIA:KFDIA,JT) = ZAEROI(KIDIA:KFDIA,JT) + ELSEIF (ANY( (/IACS_N,ICOS_N/) == JT ) ) THEN + ZAEROI(KIDIA:KFDIA,JT) = MAX(PAEROP(KIDIA:KFDIA,JK,JT) * ZFACTOR_NUMCM3(KIDIA:KFDIA) , 0._JPRB) + !* initialize final (ZAEROP) concentrations + ZAEROP(KIDIA:KFDIA,JT) = ZAEROI(KIDIA:KFDIA,JT) + ! ELSE + ! ZAEROI(KIDIA:KFDIA,JT) = 0._JPRB + ENDIF + ENDDO + + CALL TM5_WETCHEM_M7(KIDIA, KFDIA, KLON, KAERO, PTSTEP, PTP(1:KLON,JK), & + & PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM, & + & ZAEROP, PSO4_LPROD(:,JK)) + + PSO4_LPROD(KIDIA:KFDIA,JK) = PSO4_LPROD(KIDIA:KFDIA,JK)*96._JPRB /(ZAIRDM(KIDIA:KFDIA) * PTSTEP) + + ELSE + ! All cases except M7 scheme + CALL TM5_WETCHEM(YGFL, KIDIA, KFDIA, KLON,PTSTEP,PTP(:,JK),PAP(:,JK),PRSF1(:,JK),PLP(:,JK),ZCVM1,ZHPLUS,ZCVM) + ENDIF !3.2 Call selected kpp solver DO JL=KIDIA,KFDIA @@ -1098,7 +1147,9 @@ SUBROUTINE CHEM_TM5& ! Change units from kg/kg/sec to sec-1. Loss term is positive. DO JLEV=1,KLEV DO JL=KIDIA,KFDIA - PCHEM2GHG(JL,JLEV,1) = - PTENC1(JL,JLEV,ICH4) / PCEN(JL,JLEV,ICH4) + IF(PCEN(JL,JLEV,ICH4)> 0._JPRB ) THEN + PCHEM2GHG(JL,JLEV,1) = - PTENC1(JL,JLEV,ICH4) / PCEN(JL,JLEV,ICH4) + ENDIF ENDDO ENDDO ! ENDIF diff --git a/ifs-source/arpifs/chem/tm5_chem_ini.F90 b/ifs-source/arpifs/chem/tm5_chem_ini.F90 index e6df0636..de2010a8 100644 --- a/ifs-source/arpifs/chem/tm5_chem_ini.F90 +++ b/ifs-source/arpifs/chem/tm5_chem_ini.F90 @@ -51,6 +51,7 @@ SUBROUTINE TM5_CHEM_INI(YGFL,YDCHEM,YDCOMPO) USE YOMCOMPO , ONLY : TCOMPO USE PARKIND1 ,ONLY : JPIM, JPRM, JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE TM5_PHOTOLYSIS, ONLY : PHOTOLYSIS_INI IMPLICIT NONE @@ -280,262 +281,6 @@ SUBROUTINE TRACER_IDX_CHECK(YGFL,YDCHEM, YDCOMPO) END SUBROUTINE TRACER_IDX_CHECK -! Initialize new photolysis routine -! ----------------------------------------------------------- -SUBROUTINE PHOTOLYSIS_INI -USE TM5_PHOTOLYSIS , ONLY : WAVE_FULL, DWAVE_FULL, WAVE, DWAVE, MAXWAV, & - & NWAV_NO2,NWAV_CO,NWAV_HNO3,NWAV_O3,NWAV_PAN,NWAV_H2O2,NWAV_N2O5,NWAV_CH2O,& - & NWAV_NO3,NWAV_ACET, & - & CS_RAY, PHI0, RD, FLUX, NTEMP_MAX, & - & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & - & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & - & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & - & SCA,ABS_EFF, GFAC, EXT , PN_REF - -USE YOMLUN , ONLY : NULOUT -USE PARKIND1 , ONLY : JPIM ,JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK - -IMPLICIT NONE - -! Local parameters -INTEGER(KIND=JPIM), PARAMETER :: IUTMP=77 -INTEGER(KIND=JPIM) :: IK, IWAV, JL -REAL(KIND=JPRB) :: ZWL,ZX -LOGICAL :: LLFILEOK -REAL(KIND=JPHOOK) :: ZHOOK_HANDLE - -!TM5 photolysis info file -CHARACTER(LEN=27) :: CL_TM5_PHOTO_LOOKUP='tropo_look_up_cbmhybrid.dat' -!TM5 extraterrestrial flux: -CHARACTER(LEN=21) :: CL_TM5_EXTRATERRESTRIAL='OMI.data.extraterrest' -!TM5 aerosol: -CHARACTER(LEN=18) :: CL_TM5_AEROSOL='aerosol_reduce.dat' -#include "abor1.intfb.h" - -IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',0,ZHOOK_HANDLE) - -DO IK=1,13 - WAVE_FULL(IK)=1._JPRB/(56250._JPRB-500._JPRB*IK) -ENDDO - -DO IK=14,45 - WAVE_FULL(IK)=1._JPRB/(49750._JPRB-(IK-13)*500._JPRB) -ENDDO - -DO IK=46,68 - WAVE_FULL(IK)=(266._JPRB+(IK-13))*1.E-7_JPRB -ENDDO - -DO IK=69,71 - WAVE_FULL(IK)=(320.5_JPRB+2.*(IK-68))*1.E-7_JPRB -ENDDO -DO IK=72,176 - WAVE_FULL(IK)=(325._JPRB+5._JPRB*(IK-71))*1.E-7_JPRB -ENDDO - -DO IK=2,MAXWAV-1 - DWAVE_FULL(IK)=0.5_JPRB*(WAVE_FULL(IK+1)-WAVE_FULL(IK-1)) -ENDDO -DWAVE_FULL(1) = DWAVE_FULL(2) -DWAVE_FULL(MAXWAV) = DWAVE_FULL(MAXWAV-1) -! select a subset from the full spctral grid to remove the first band -WAVE=WAVE_FULL(14:135) -DWAVE=DWAVE_FULL(14:135) - - -!--------------------------------------------------------------------- -! Rayleigh scattering cross sections -! emp. formula of Nicolet plan. space sci.32, 1467f (1984) -!--------------------------------------------------------------------- - -DO IK=1,MAXWAV - ZWL=WAVE(IK)*1.E4_JPRB - ZX=0.389*ZWL+0.09426_JPRB/ZWL-0.3228_JPRB - CS_RAY(IK)=4.02E-28_JPRB/ZWL**(4._JPRB+ZX) -ENDDO - -!--------------------------------------------------------------------- -! QUANTUM YIELD OF METHYGLYOXAL S. KOCH and G. K. MOORTGAT -! J Phys Chem, 102, 9142-9153, 1998. -! -! JEW: the qy_ch3cocho array has been reduced to 52 bins to represent the pressure. -! dep. spectral bins ONLY !! -!--------------------------------------------------------------------- - -! Calculate co-efficients for METHYGLYOXAL qy outside loop -PHI0 = 1. -RD = 0. - -! for wave < 380nm qy is essentially = 1.0. -DO IK = 1,39 - IF(IK<32) THEN - PHI0(IK) = 1 - ELSEIF(IK>=32) THEN - PHI0(IK) = 8.15E-9_JPRB * EXP(7131._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - ENDIF - RD(IK) = 7.34E-9_JPRB * EXP(8793._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -DO IK = 40,52 - PHI0(IK) = 3.63E-7_JPRB * EXP(5693._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) - RD(IK) = 1.93E4_JPRB*EXP(-5639._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) -ENDDO - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -!-------------------------------------------------------------- -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_PHOTO_LOOKUP),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - CALL ABOR1('tm5_chem_ini: photo inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_PHOTO_LOOKUP)) - -READ(IUTMP,*) -READ(IUTMP,*) -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_O3_LOOK(IWAV,IK),IWAV=1,MAXWAV) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_HNO3_LOOK(IWAV,IK),IWAV=1,NWAV_HNO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_H2O2_LOOK(IWAV,IK),IWAV=1,NWAV_H2O2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_N2O5_LOOK(IWAV,IK),IWAV=1,NWAV_N2O5) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_CH2O_LOOK(IWAV,IK),IWAV=1,NWAV_CH2O) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_PAN_LOOK(IWAV,IK),IWAV=1,NWAV_PAN) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (XS_NO3_LOOK(IWAV,IK),IWAV=1,NWAV_NO3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*) (QY_O3_LOOK(IWAV,IK),IWAV=1,NWAV_O3) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(QY_CO_LOOK(IWAV,IK),IWAV=1,NWAV_CO) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A1_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A2_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A3_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -READ(IUTMP,*) -DO IK=1,NTEMP_MAX - READ(IUTMP,*)(A4_ACET(IWAV,IK),IWAV=1,NWAV_ACET) -ENDDO -CLOSE(IUTMP) - -ENDIF - -! put constants in correct units - -A1_ACET=A1_ACET*1E-18_JPRB -A2_ACET=A2_ACET*1E-17_JPRB -A4_ACET=A4_ACET*1E-15_JPRB - -!-------------------------------------------------------------- -! Read and store temperature dependent cross-section values -! -!----- extraterrestrial flux from input file ------------------ -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_EXTRATERRESTRIAL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - CALL ABOR1('tm5_chem_ini: extraterrestrial inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_EXTRATERRESTRIAL)) - READ(IUTMP,*) - READ(IUTMP,*) FLUX - CLOSE(IUTMP) -ENDIF - - -!************************************************************************** -! aerosol data from: "Models for Aerosols of the Lower Atmosphere -! and the Effects of Humidity Variations on their Optical Properties -! E. P. Shettle and R. W. Fenn (1979), Environmental Research Paper -! No. 676 -!************************************************************************** -LLFILEOK=.FALSE. -INQUIRE(FILE=TRIM(CL_TM5_AEROSOL),EXIST=LLFILEOK ) -IF(.NOT. LLFILEOK)THEN - WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_AEROSOL) - CALL ABOR1('tm5_chem_ini: aerosol inputfile does not exist.') -ELSE - WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_AEROSOL) - OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & - & FILE=TRIM(CL_TM5_AEROSOL)) - DO JL = 1,4 - READ(IUTMP,*) - DO IK = 1,8 - READ(IUTMP,*) - READ(IUTMP,'(6(1X,F7.5))')(EXT(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(ABS_EFF(IWAV,IK,JL),IWAV=1,MAXWAV) - READ(IUTMP,'(6(1X,F7.5))')(GFAC(IWAV,IK,JL),IWAV=1,MAXWAV) - DO IWAV=1,MAXWAV - SCA(IWAV,IK,JL) = EXT(IWAV,IK,JL) - ABS_EFF(IWAV,IK,JL) - ENDDO - ENDDO - ENDDO - CLOSE(IUTMP) - - DO IWAV=1,MAXWAV - DO IK=1,8 - DO JL=1,4 - SCA(IWAV,IK,JL) = SCA(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ABS_EFF(IWAV,IK,JL) = ABS_EFF(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB - ENDDO - ENDDO - ENDDO - -ENDIF - -!VH - file format(6(1X,F7.5)) - -WRITE(NULOUT,*) 'INFO tm5_chem_ini: Finished reading TM5 photolysis input files ' - - -IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) -END SUBROUTINE PHOTOLYSIS_INI - - - SUBROUTINE IFS_INI_BUDGET(YGFL,YDCHEM) !** DESCRIPTION diff --git a/ifs-source/arpifs/climate/updclie_aerclim.F90 b/ifs-source/arpifs/climate/updclie_aerclim.F90 new file mode 100644 index 00000000..27023a99 --- /dev/null +++ b/ifs-source/arpifs/climate/updclie_aerclim.F90 @@ -0,0 +1,624 @@ +SUBROUTINE UPDCLIE_AERCLIM(YDGEOMETRY, YDDYNA, YDMCC, YDGFL, YDML_GCONF, PTSTEP) + +!**** *UPDCLIE_AERCLIM* + +! PURPOSE. +! -------- + +! Updates the SO2 oxidants climatology fields every month; +! interpolation in time in between +! (ECMWF version, distributed or shared memory) + +!** INTERFACE. +! ---------- + +! CALL UPDCLIE_AERCLIM(...) + +! Explicit arguments : +! -------------------- +! PTSTEP: TIME STEP + +! METHOD. +! ------- + +! Reads the time-varying 3D fields for SO2 oxidants (OH, H2O2, O3) a/k/a "aerosol climatology". +! Uses time interpolation if LMCCIEC_AERCLIM=true (tested, assumes +! that monthly data are in the middle of the month), otherwise the +! most recent fields are used (untested). +! +! Note that reading is sequential and, to be correct, detection of the first field is crucial. + +! EXTERNALS. +! ---------- + +! UPDCAL + +! AUTHORS. +! -------- +! V Huijnen (KNMI) Oct 2022 (based on routine UPDCLIE_COMPO) +! P Le Sager (KNMI) Sept 2025 - Fix reading + +! MODIFICATIONS. +! -------------- +! ------------------------------------------------------------------ + +USE MODEL_GENERAL_CONF_MOD , ONLY : MODEL_GENERAL_CONF_TYPE +USE GEOMETRY_MOD , ONLY : GEOMETRY +USE YOMGFL , ONLY : TGFL +USE PARKIND1 , ONLY : JPIM, JPRB, JPRD +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOERAD , ONLY : YRERAD +USE YOMCST , ONLY : RDAY +USE YOMCT0 , ONLY : CNMEXP +USE YOMLUN , ONLY : NULOUT, NULERR +USE YOMMCC , ONLY : TMCC +USE YOMMP0 , ONLY : MYPROC +USE YOMRIP0 , ONLY : NINDAT +USE YOM_YGFL , ONLY : YGFL +USE YOMDYNA , ONLY : TDYNA +USE MPL_MODULE, ONLY : MPL_BROADCAST, MPL_BARRIER +USE DISGRID_MOD, ONLY : DISGRID_SEND, DISGRID_RECV +USE GRIB_API, ONLY : GRIB_OPEN_FILE, GRIB_SUCCESS, GRIB_NEW_FROM_FILE, GRIB_END_OF_FILE, GRIB_GET, GRIB_SET,& + & GRIB_RELEASE, GRIB_CLOSE_FILE +! ------------------------------------------------------------------ + +IMPLICIT NONE + +TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY +TYPE(TDYNA) ,INTENT(IN) :: YDDYNA +TYPE(TMCC) ,INTENT(INOUT) :: YDMCC +TYPE(MODEL_GENERAL_CONF_TYPE),INTENT(INOUT):: YDML_GCONF +TYPE(TGFL) ,INTENT(INOUT) :: YDGFL +REAL(KIND=JPRB) ,INTENT(IN) :: PTSTEP +! ------------------------------------------------------------------ +INTEGER(KIND=JPIM) :: ILMOIS(12),IDM(3) +INTEGER(KIND=JPIM) :: IINFO(10000,YGFL%NAEROCLIM) +INTEGER(KIND=JPIM) :: ILOENG(YDGEOMETRY%YRDIM%NDGLG) +REAL(KIND=JPRB) :: ZBUF(YDGEOMETRY%YRGEM%NGPTOTG) +REAL(KIND=JPRB) :: ZBUF_2D(YDGEOMETRY%YRGEM%NGPTOTG,YDGEOMETRY%YRDIMV%NFLEVG) +CHARACTER :: CLNOMF*13 +CHARACTER :: CLEVTY*20,CLREPRT*20 + +INTEGER(KIND=JPIM) :: IA, IA0, IADD, IAE, IAN, ICCYY0, ICCYYE,& + & ICOU, ID, IDIF, IDIFD, IDUMY, IEND,& + & IFIRST, IGRIB, ICOUNT, IDGNH,& + & IIM1, IIM2, IJ0, IJDCR, IJE, IJOUR,& + & IJT1, IJT2, IJUL, IJUL0, IJUL1, IJUL2, IJULE,& + & IM, IM0, IME, IMM0, IMME, IMOIS, IMT1,& + & IPARAM, IPARMAL,& + & IBL,& + & IRET, IST, ISTADDE,& + & ITAG, ITIM, ITIME,& + & IYYM0, IYYMD, IZTE, J, JCL, JLEV, JF, JGL,& + & JM, JROF, JSTGLO, JTIM, JY, ISECND + +LOGICAL :: LLFIRST, LLFOUND, LLREAD +INTEGER(KIND=JPIM), SAVE :: IDATEREF=0, IUNITAERCLIM +INTEGER(KIND=JPIM) :: IDATE, IBITMAP, IYSDMP,ILEVEL + +REAL(KIND=JPRB) :: ZPOID1, ZPOID2 +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +! LCLIMATO allows us to use the same file regardless of the date. +! +! It is then assumed that a full year of data is needed. +! +! To account for any start date, the oxidants file must contain 2 +! years of data with an extra month before and after. For example: +! monthly data from 1989-12-15 to 1992-01-15 (use IYEARCLIMATO=1990 +! then). +! +LOGICAL, PARAMETER :: LCLIMATO=.TRUE. +INTEGER(KIND=JPIM), PARAMETER :: IYEARCLIMATO=1990 + +! ------------------------------------------------------------------ + +#include "abor1.intfb.h" +#include "updcal.intfb.h" +#include "fcttim.func.h" + +! ------------------------------------------------------------------ +IF (LHOOK) CALL DR_HOOK('UPDCLIE_AERCLIM',0,ZHOOK_HANDLE) + +ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP,YDRIP=>YDML_GCONF%YRRIP) +ASSOCIATE(NDGLG=>YDDIM%NDGLG, NDGNH=>YDDIM%NDGNH, NDLON=>YDDIM%NDLON, & + & NPROMA=>YDDIM%NPROMA, & + & LPERPET=>YRERAD%LPERPET, & + & NGPTOT=>YDGEM%NGPTOT, NGPTOTG=>YDGEM%NGPTOTG, NHTYP=>YDGEM%NHTYP, & + & NLOENG=>YDGEM%NLOENG, & + & CLIMRAER=>YDMCC%CLIMRAER, LMCCIEC_AERCLIM=>YDMCC%LMCCIEC_AERCLIM, & + & NCLIGC_AERCLIM=>YDMCC%NCLIGC_AERCLIM, NAERCLIM=>YGFL%NAEROCLIM, & + & NDIFC_AERCLIM=>YDMCC%NDIFC_AERCLIM, NJDCR_AERCLIM=>YDMCC%NJDCR_AERCLIM,NYSDMP_AERCLIM=>YDMCC%NYSDMP_AERCLIM, & + & NPAERCLIM_1=>YDMCC%NPAERCLIM_1, NPAERCLIM_2=>YDMCC%NPAERCLIM_2, & + & NUNITCAERCLIM=>YDMCC%NUNITCAERCLIM, & + & NSTADD=>YDRIP%NSTADD, NSTOP=>YDRIP%NSTOP, & + & NFLEVG=>YDDIMV%NFLEVG) + +! ------------------------------------------------------------------ +!* +LLFIRST = YDMCC%LFIRSTUPDAERCLIM +YDMCC%LFIRSTUPDAERCLIM=.FALSE. + +!* 1.1 Calendar + +IJ0=NDD(NINDAT) +IM0=NMM(NINDAT) +IA0=NCCAA(NINDAT) +CALL UPDCAL(IJ0,IM0,IA0,NSTADD,IJOUR,IMOIS,IAN,ILMOIS,NULOUT) ! Current date +IF(IJOUR > 15)THEN + IMT1=IMOIS + IJT1=15 + IJT2=15+ILMOIS(IMT1) +ELSE + IMT1=1+MOD(IMOIS+10,12) + IJT1=15-ILMOIS(IMT1) + IJT2=15 +ENDIF + +IF (LCLIMATO) THEN + IAN = IYEARCLIMATO +ENDIF + +!* +! 2. OPEN AND SCAN THE FILE, IF CLIMATE FIELDS REQUIRED +! ----------------------------------------------------- + +!* 2.1 OPEN CLIMATE FILE + +SCANIF:IF(NAERCLIM >= 1.AND.LLFIRST) THEN + + MYPROCIF: IF (MYPROC == 1) THEN + +! ONLY PROCESSOR 1 SHOULD OPEN + + CLNOMF='aeroclim.grib' + WRITE(NULOUT,*) ' READ AER_CLIMATE FIELDS FROM GRIB ' + WRITE(NULOUT,*) ' INITIAL DATA TO BE READ FROM FILE ',CLNOMF + CALL GRIB_OPEN_FILE(IUNITAERCLIM,CLNOMF,'r',IRET) + IF(IRET /= GRIB_SUCCESS) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_OPEN_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_OPEN_FILE') + ENDIF + + +!* 2.2 READ, DECODE HEADERS, CHECK THE FIELDS AND POSITIONS THE FILE + + SCAN: DO JTIM=1,10000 + DO JCL=1,NAERCLIM + DO JLEV=1,NFLEVG + CALL GRIB_NEW_FROM_FILE(IUNITAERCLIM,IGRIB,IRET) + IF(IRET == GRIB_END_OF_FILE) THEN + ITIM=JTIM-1 + EXIT SCAN + ELSEIF(IRET /= GRIB_SUCCESS) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE') + ENDIF + CALL GRIB_GET(IGRIB,'ifsParam',IPARAM) + CALL GRIB_GET(IGRIB,'dataDate',IYYMD) + CALL GRIB_GET(IGRIB,'typeOfLevel',CLEVTY) + CALL GRIB_GET(IGRIB,'gridType',CLREPRT) + CALL GRIB_GET(IGRIB,'level',ILEVEL) + CALL GRIB_GET(IGRIB,'N',IDGNH) + WRITE(NULOUT,'(A,I6,A,I4,A,I8.8,A)')& + & 'UPDCLIE_AERCLIM: PARAMETER ',IPARAM, ' Level ' ,ILEVEL,' FOR DATE ',IYYMD,' FOUND IN CLIMATE FILE' + +! check some parameters + + IF (TRIM(CLREPRT) /= 'regular_gg' .AND. TRIM(CLREPRT) /= 'reduced_gg') THEN + WRITE(NULERR,*) 'UPDCLIE_AERCLIM: UNEXPECTED DATA REPRESENTATION TYPE',CLREPRT + CALL ABOR1(' UPDCLIE_AERCLIM:INVALID DATA REPRESENTATION TYPE') + ENDIF + IF(IDGNH /= NDGNH) THEN + WRITE(NULERR,*) 'UPDCLIE_AERCLIM: RESOLUTION OF MODEL ',NDGNH,', OF INITIAL DATA ',IDGNH + CALL ABOR1(' UPDCLIE_AERCLIM : INVALID DATA RESOLUTION') + ENDIF + IF(TRIM(CLEVTY) /= 'hybrid') THEN + WRITE(NULERR,*) 'UDPCLIE_AERCLIM: UNEXPECTED LEVEL TYPE ', CLEVTY + CALL ABOR1(' UPDCLIE_AERCLIM : INVALID LEVEL TYPE') + ENDIF + + IF( NHTYP /= 0 )THEN + CALL GRIB_GET(IGRIB,'pl',ILOENG) + DO JGL=1,NDGLG + IF( NLOENG(JGL) /= ILOENG(JGL) )THEN + WRITE(NULERR,*) ' UPDCLIE_AERCLIM :' + WRITE(NULERR,*) ' INCONSISTENT REDUCED GRID' + WRITE(NULERR,*) ' IN MODEL ',(NLOENG(J),J=1,NDGLG) + WRITE(NULERR,*) ' IN FILE ',(ILOENG(J),J=1,NDGLG) + CALL ABOR1(' UPDCLIE_AERCLIM : INCONSISTENT REDUCED GRID') + ENDIF + ENDDO + ENDIF + + CALL GRIB_RELEASE(IGRIB) + +! record/communicate field index + + IF( NCLIGC_AERCLIM(JCL) == IPARAM )THEN + IINFO(JTIM,JCL)=IYYMD + ELSE + WRITE(NULERR,'("UPDCLIE_AERCLIM: SKIPPING OVER FIELD,",& + & "GRIB CODE=",I6,", date=",I8)') IPARAM,IYYMD + WRITE(NULERR,'("UPDCLIE_AERCLIM: EXPECTED FIELD,",& + & "GRIB CODE=",I6)') NCLIGC_AERCLIM(JCL) + ! CALL ABOR1(' UPDCLIE_AERCLIM : UNEXPECTED FIELD') + ENDIF + ENDDO ! JLEV + ENDDO ! JCL + ENDDO SCAN + +! Check fields come in a consistent order and position file at the +! right place + + ! -- End date of current integration ('leg' in EC-Earth vocab) + IF (LCLIMATO) THEN + ! Assume that an entire year will be simulated + IJE = IJOUR + IME = IMOIS + IF ((IME == 2).AND.(IJE == 29 )) IJE=28 ! to avoid error in IJULE below + IAE = IYEARCLIMATO + 1 + ELSE + ITIME=NINT(PTSTEP) + IF (YDDYNA%LTWOTL) THEN + IZTE=NINT(PTSTEP*(REAL(NSTOP,JPRB)+0.5_JPRB)) + ELSE + IZTE=ITIME*NSTOP + ENDIF + + IF (LPERPET) THEN + ISECND=IZTE/NINT(RDAY) + IZTE=IZTE-ISECND*NINT(RDAY) + ENDIF + + ISTADDE=IZTE/NINT(RDAY) + CALL UPDCAL(IJ0,IM0,IA0,ISTADDE,IJE,IME,IAE,ILMOIS,NULOUT) + ENDIF + + IF (LMCCIEC_AERCLIM) THEN + IF (IJOUR > 15) THEN ! which month is needed first: current or... + ICCYY0=IAN + IMM0=IMOIS + ELSE + IMM0=1+MOD(IMOIS+10,12) ! ...previous month + IF (IMM0 == 12) THEN + ICCYY0=IAN-1 + ELSE + ICCYY0=IAN + ENDIF + ENDIF + IF (IJE > 15) THEN ! which month is needed last + IMME=1+MOD(IME,12) + IF (IMME == 1) THEN + ICCYYE=IAE+1 + ELSE + ICCYYE=IAE + ENDIF + ELSE + ICCYYE=IAE + IMME=IME + ENDIF + + ! Locates the first field needed (check only YYYY and MM) + + IYYM0=IMM0+100*ICCYY0 + LLFOUND=.FALSE. + DO J=1,ITIM + IF (IYYM0 == IINFO(J,1)/100) THEN + IFIRST=J + IADD=IINFO(J,1) + LLFOUND=.TRUE. + EXIT + ENDIF + ENDDO + IF (.NOT.LLFOUND) THEN + WRITE(NULERR,'(A,I6,A)')& + & 'UPDCLIE_AERCLIM: FIRST FIELD FOR ',IYYM0,' (YYYYMM) NOT FOUND' + CALL ABOR1(' UPDCLIE_AERCLIM : FIRST FIELD NOT FOUND') + ELSE + WRITE(NULOUT,'(A,I6)') 'UPDCLIME_AERCLIM: FOUND FIRST FIELD FOR ',IYYM0 + ENDIF + + ! Check all fields in the right time order + + ICOU=IFIRST + DO JY=ICCYY0,ICCYYE + IF (JY == ICCYY0) THEN + IIM1=IMM0 + ELSE + IIM1=1 + ENDIF + IF (JY == ICCYYE) THEN + IIM2=IMME + ELSE + IIM2=12 + ENDIF + DO JM=IIM1,IIM2 + IDUMY=JM+100*JY + DO JCL=1,NAERCLIM + IF (IDUMY /= IINFO(ICOU,JCL)/100) THEN + WRITE(NULERR,'(A,I4,A,I6.6,A)')& + & 'UPDCLIE_AERCLIM: FIELD ',NCLIGC_AERCLIM(JCL),' NOT FOUND FOR ',& + & IDUMY,'00' + CALL ABOR1(' UPDCLIE_AERCLIM : FIELD NOT FOUND') + ENDIF + ENDDO + ICOU=ICOU+1 + ENDDO + ENDDO + IDIF=-999 + IJDCR=-999 + + ELSE +! Locates the first field needed + + IJUL0=RJUDAT(IAN,IMOIS,IJOUR) + DO J=1,ITIM + IA=NCCAA(IINFO(J,1)) + IM=NMM(IINFO(J,1)) + ID=NDD(IINFO(J,1)) + IJUL=RJUDAT(IA,IM,ID) + IF (IJUL > IJUL0) THEN + IF (J == 1) THEN + WRITE(NULERR,'(A,I8.8)')& + & 'UPDCLIE_AERCLIM: FIRST FILE IS FOR ',IINFO(J,1) + CALL ABOR1(' UPDCLIE_AERCLIM : FIRST FILE NEEDED NOT FOUND') + ENDIF + IFIRST=J-1 + IADD=IINFO(IFIRST,1) + EXIT + ENDIF + ENDDO + +! Check all fields in the right time order + + IA=NCCAA(IINFO(IFIRST,1)) + IM=NMM(IINFO(IFIRST,1)) + ID=NDD(IINFO(IFIRST,1)) + IJUL1=RJUDAT(IA,IM,ID) + IJDCR=IJUL1 + IA=NCCAA(IINFO(IFIRST+1,1)) + IM=NMM(IINFO(IFIRST+1,1)) + ID=NDD(IINFO(IFIRST+1,1)) + IJUL2=RJUDAT(IA,IM,ID) + IDIF=IJUL2-IJUL1 + IF (NAERCLIM > 1) THEN + DO JCL=2,NAERCLIM + IA=NCCAA(IINFO(IFIRST,JCL)) + IM=NMM(IINFO(IFIRST,JCL)) + ID=NDD(IINFO(IFIRST,JCL)) + IJUL1=RJUDAT(IA,IM,ID) + IA=NCCAA(IINFO(IFIRST+1,JCL)) + IM=NMM(IINFO(IFIRST+1,JCL)) + ID=NDD(IINFO(IFIRST+1,JCL)) + IJUL2=RJUDAT(IA,IM,ID) + IDIFD=IJUL2-IJUL1 + IF (IDIFD /= IDIF) THEN + WRITE(NULERR,'(A,2I20,A,I8)')& + & 'UPDCLIE_AERCLIM: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& + & ,NCLIGC_AERCLIM(JCL) + WRITE(NULERR,'(A,I8)')'UPDCLIE_AERCLIM: DIFFERENCE EXPECTED ',IDIF + CALL ABOR1(' UPDCLIE_AERCLIM : IRREGULARLY SPACED FIELDS') + ENDIF + ENDDO + ENDIF + DO J=IFIRST+1,ITIM-1 + DO JCL=1,NAERCLIM + IA=NCCAA(IINFO(J,JCL)) + IM=NMM(IINFO(J,JCL)) + ID=NDD(IINFO(J,JCL)) + IJUL1=RJUDAT(IA,IM,ID) + IA=NCCAA(IINFO(J+1,JCL)) + IM=NMM(IINFO(J+1,JCL)) + ID=NDD(IINFO(J+1,JCL)) + IJUL2=RJUDAT(IA,IM,ID) + IDIFD=IJUL2-IJUL1 + IF (IDIFD /= IDIF) THEN + WRITE(NULERR,'(A,2I20,A,I8)')& + & 'UPDCLIE_AERCLIM: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& + & ,NCLIGC_AERCLIM(JCL) + WRITE(NULERR,'(A,I8)')'UPDCLIE_AERCLIM: DIFFERENCE EXPECTED ',IDIF + CALL ABOR1(' UPDCLIE_AERCLIM : IRREGULARLY SPACED FIELDS') + ENDIF + ENDDO + ENDDO + IJULE=RJUDAT(IAE,IME,IJE) + DO JCL=1,NAERCLIM + IA=NCCAA(IINFO(ITIM,JCL)) + IM=NMM(IINFO(ITIM,JCL)) + ID=NDD(IINFO(ITIM,JCL)) + IJUL2=RJUDAT(IA,IM,ID) + IDIFD=IJULE-IJUL2 + IF (IDIFD > IDIF) THEN + WRITE(NULERR,'(A)')'UPDCLIE_AERCLIM: FILE TOO SHORTJULIAN DAYS ' + WRITE(NULERR,'(A,I20)')'UPDCLIE_AERCLIM: FORECAST ENDS ',IJULE + WRITE(NULERR,'(A,I20)')'UPDCLIE_AERCLIM: CLIMATE DATA ENDS ',IJUL2 + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: DIFFERENCE EXPECTED ',IDIF + CALL ABOR1(' UPDCLIE_AERCLIM : IRREGULARLY SPACED FIELDS') + ENDIF + ENDDO + + ENDIF + + ! Position the file to the first field needed + + CALL GRIB_CLOSE_FILE(IUNITAERCLIM,IRET) + IF( IRET /= GRIB_SUCCESS )THEN + CALL ABOR1(' UPDCLIE_AERCLIM: ERROR ON GRIB_CLOSE_FILE') + ENDIF + CALL GRIB_OPEN_FILE(IUNITAERCLIM,CLNOMF,'r') + DO JTIM=1,10000*(NAERCLIM) + CALL GRIB_NEW_FROM_FILE(IUNITAERCLIM,IGRIB,IRET) + IF(IRET /= GRIB_SUCCESS) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE') + ENDIF + CALL GRIB_GET(IGRIB,'dataDate',IYYMD) + IF (IYYMD == IADD) THEN + EXIT + ELSE + CALL GRIB_RELEASE(IGRIB) + ENDIF + ENDDO + + ! Pack message + + IDM(1)=IDIF + IDM(2)=IJDCR + IDM(3)=IUNITAERCLIM + ENDIF MYPROCIF + + ! Broadcast + + ITAG=19591214 + CALL MPL_BROADCAST(IDM,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') + + NDIFC_AERCLIM=IDM(1) + NJDCR_AERCLIM=IDM(2) + NUNITCAERCLIM=IDM(3) + +ENDIF SCANIF + +!* 3. READ THE FILE, IF NEEDED. +! ----------------------------- + +READIF: IF(NAERCLIM >= 1) THEN + +!* Decide if reading time + IDATE=-999 + IF (LMCCIEC_AERCLIM) THEN + IF (LLFIRST) THEN + IDATEREF=0 + LLREAD=.TRUE. + IFIRST=2 + ELSE + IDATE=IAN*10000+IMOIS*100+IJOUR + IF (IJOUR == 16 .AND. IDATE > IDATEREF) THEN + LLREAD=.TRUE. + IFIRST=1 + ELSE + LLREAD=.FALSE. + IFIRST=1 + ENDIF + ENDIF + WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ',IDATE, IDATEREF, LLREAD, IFIRST + ELSE + IF (LLFIRST) THEN + LLREAD=.TRUE. + IFIRST=1 + ELSE + IFIRST=1 + IJUL=RJUDAT(IAN,IMOIS,IJOUR) + LLREAD=NJDCR_AERCLIM == IJUL + ENDIF + WRITE(NULOUT,*) 'UPDCLIME_AERCLIM IDATE INFO: ', IDATE, IDATEREF, LLREAD, NJDCR_AERCLIM, NDIFC_AERCLIM + ENDIF + +!* 3.1 READ, DECODE AND SELECT THE FIELDS + + IF (LLREAD) THEN + FIRST: DO JF=1,IFIRST + IF (LMCCIEC_AERCLIM) THEN + NPAERCLIM_1=3-NPAERCLIM_1 + NPAERCLIM_2=3-NPAERCLIM_2 + ELSE + NJDCR_AERCLIM=NJDCR_AERCLIM+NDIFC_AERCLIM + NPAERCLIM_1=1 + NPAERCLIM_2=1 + ENDIF + READ: DO JCL=1,NAERCLIM + IPARAM=NCLIGC_AERCLIM(JCL) + IF (MYPROC == 1) THEN + DO JLEV=1,NFLEVG + IF (.NOT. (LLFIRST.AND.JF==1.AND.JCL==1.AND.JLEV==1)) THEN + CALL GRIB_NEW_FROM_FILE(IUNITAERCLIM,IGRIB,IRET) + IF(IRET /= GRIB_SUCCESS ) THEN + WRITE(NULERR,'(A,I2)')'UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET + CALL ABOR1('UPDCLIE_AERCLIM: PROBLEM IN GRIB_NEW_FROM_INDEX') + ENDIF + ! ELSE + ! WRITE(NULOUT,*) 'UPDCLIME_AERCLIM : use igrib from last position in scan above' + ENDIF + CALL GSTATS(1703,0) + CALL GRIB_GET(IGRIB,'values',ZBUF) + CALL GSTATS(1703,1) + CALL GRIB_GET(IGRIB,'bitmapPresent',IBITMAP) + CALL GRIB_GET(IGRIB,'numberOfValues',ICOUNT) + CALL GRIB_GET(IGRIB,'level',ILEVEL) + CALL GRIB_GET(IGRIB,'dataDate',IYYMD) + CALL GRIB_RELEASE(IGRIB) + + WRITE(NULOUT,'(A,I6,A,I8.8,A, I4, A)')& + & 'UPDCLIE_AERCLIM: PARAMETER ',IPARAM, ' FOR DATE ',& + & IYYMD,', LEVEL ',ILEVEL,' READ FROM FILE' + + IDATEREF=IYYMD + ZBUF_2D(:,JLEV)=ZBUF + ENDDO + ENDIF + + !! ! DEBUG INFO + !! WRITE(NULERR,"(A,4I6)"),'SHAPE ZBUF_2D:',SHAPE(ZBUF_2D) + !! WRITE(NULERR,"(A,4I6)"),'SHAPE CLIMRAER:',SHAPE(CLIMRAER(:,1:NFLEVG,NPAERCLIM_2,JCL)) + !! WRITE(NULERR,"(A,2I6)"),'other dims:',YDGEOMETRY%YRGEM%NGPTOTG, YDGEOMETRY%YRGEM%NGPTOT + + ! DM communications. + IF (MYPROC == 1) THEN + CALL DISGRID_SEND(YDGEOMETRY,NFLEVG,ZBUF_2D,JCL,CLIMRAER(:,1:NFLEVG,NPAERCLIM_2,JCL)) + ELSE + CALL DISGRID_RECV(YDGEOMETRY,1,NFLEVG,CLIMRAER(:,1:NFLEVG,NPAERCLIM_2,JCL),JCL) + ENDIF + CALL MPL_BARRIER(CDSTRING='UPDCLIE_AERCLIM') + + ! Synchronize IDATEREF + ITAG=19591204 + CALL MPL_BROADCAST(IDATEREF,KTAG=ITAG,KROOT=1,CDSTRING='UPDCLIE_AERCLIM') + + ENDDO READ + ENDDO FIRST + ENDIF + + IF (LMCCIEC_AERCLIM) THEN + ZPOID1=REAL(IJT2-IJOUR,JPRB)/REAL(IJT2-IJT1,JPRB) + ZPOID2=1.0_JPRB-ZPOID1 + ENDIF + + ! Fill GFL array + DO IPARMAL=1,NAERCLIM + IYSDMP=NYSDMP_AERCLIM(IPARMAL) + IF (LMCCIEC_AERCLIM) THEN + DO JLEV=1,NFLEVG + DO JSTGLO=1,NGPTOT,NPROMA + IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) + IST=1 + IBL=(JSTGLO-1)/NPROMA+1 + DO JROF =1,IEND + YDGFL%GFL(JROF,JLEV,IYSDMP,IBL) = CLIMRAER(JSTGLO+JROF-1,JLEV,NPAERCLIM_1,IPARMAL)*ZPOID1 & + & +CLIMRAER(JSTGLO+JROF-1,JLEV,NPAERCLIM_2,IPARMAL)*ZPOID2 + ENDDO + ENDDO + ENDDO + ELSE + DO JLEV=1,NFLEVG + DO JSTGLO=1,NGPTOT,NPROMA + IEND=MIN(NPROMA,NGPTOT-JSTGLO+1) + IST=1 + IBL=(JSTGLO-1)/NPROMA+1 + DO JROF =1,IEND + YDGFL%GFL(JROF,JLEV,IYSDMP,IBL) = CLIMRAER(JSTGLO+JROF-1,JLEV,NPAERCLIM_2,IPARMAL) + ENDDO + ENDDO + ENDDO + ENDIF + ENDDO + +ENDIF READIF + +WRITE(NULOUT,*) 'UPDCLIE_AERCLIM finished' +CALL FLUSH(NULOUT) + +! ------------------------------------------------------------------ +END ASSOCIATE +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('UPDCLIE_AERCLIM',1,ZHOOK_HANDLE) +END SUBROUTINE UPDCLIE_AERCLIM diff --git a/ifs-source/arpifs/climate/updclie_compo.F90 b/ifs-source/arpifs/climate/updclie_compo.F90 index 5ab5dea7..e15852a3 100644 --- a/ifs-source/arpifs/climate/updclie_compo.F90 +++ b/ifs-source/arpifs/climate/updclie_compo.F90 @@ -135,7 +135,9 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON & SD_VF=>YDSURF%SD_VF, YSD_VF=>YDSURF%YSD_VF) ! ------------------------------------------------------------------ !* -LLFIRST = YDMCC%LFIRSTUPD +LLFIRST = YDMCC%LFIRSTUPDCOMPO +YDMCC%LFIRSTUPDCOMPO=.FALSE. + !* 1.1 Calendar IJ0=NDD(NINDAT) @@ -377,7 +379,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON & 'UPDCLIE_COMPO: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& & ,NCLIGC_COMPO(JCL) WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: DIFFERENCE EXPECTED ',IDIF - CALL ABOR1(' UPDCLIE_COMPO : IRREGULARLY SPACED FIELDS') + CALL ABOR1(' UPDCLIE_COMPO (1) : IRREGULARLY SPACED FIELDS') ENDIF ENDDO ENDIF @@ -397,7 +399,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON & 'UPDCLIE_COMPO: JULIAN DAYS ',IJUL1,IJUL2,' FOR FIELD '& & ,NCLIGC_COMPO(JCL) WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: DIFFERENCE EXPECTED ',IDIF - CALL ABOR1(' UPDCLIE_COMPO : IRREGULARLY SPACED FIELDS') + CALL ABOR1(' UPDCLIE_COMPO (2) : IRREGULARLY SPACED FIELDS') ENDIF ENDDO ENDDO @@ -429,7 +431,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) IF(IRET /= GRIB_SUCCESS) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET - CALL ABOR1('UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_FILE') + CALL ABOR1('UPDCLIE_COMPO (3): PROBLEM IN GRIB_NEW_FROM_FILE') ENDIF CALL GRIB_GET(IGRIB,'dataDate',IYYMD) IF (IYYMD == IADD) THEN @@ -511,7 +513,7 @@ SUBROUTINE UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDCOMPO,YDMCC,YDERAD,YDML_GCON CALL GRIB_NEW_FROM_FILE(IUNITCOMPO,IGRIB,IRET) IF(IRET /= GRIB_SUCCESS ) THEN WRITE(NULERR,'(A,I2)')'UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_FILE, IRET=',IRET - CALL ABOR1('UPDCLIE_COMPO: PROBLEM IN GRIB_NEW_FROM_INDEX') + CALL ABOR1('UPDCLIE_COMPO (4): PROBLEM IN GRIB_NEW_FROM_INDEX') ENDIF ENDIF CALL GRIB_SET(IGRIB,'missingValue',19591204.0_JPRB) diff --git a/ifs-source/arpifs/control/cnt4.F90 b/ifs-source/arpifs/control/cnt4.F90 index bde29021..40fadb45 100644 --- a/ifs-source/arpifs/control/cnt4.F90 +++ b/ifs-source/arpifs/control/cnt4.F90 @@ -254,11 +254,6 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y #include "abor1.intfb.h" #include "save_merr_tend.intfb.h" - - - - - #include "cormass2.intfb.h" #include "cormass3b.intfb.h" #include "cormassdry.intfb.h" @@ -295,9 +290,8 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y !#include "couplo4_definitions.intfb.h" #include "fullpos_drv.intfb.h" #include "chem_init.intfb.h" - - - +#include "tm5m7_init.intfb.h"!m7 +#include "hamm7_init.intfb.h"!m7 #include "chem_massdia.intfb.h" #include "couplnemo.intfb.h" @@ -328,9 +322,11 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y & YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) ASSOCIATE(NCHEM=>YGFL%NCHEM, NDIM=>YGFL%NDIM, NUMFLDS=>YGFL%NUMFLDS, & + & NAERO=>YGFL%NAERO, & & YCOMP=>YGFL%YCOMP, & & GFUBUF=>YDCFU%GFUBUF, XFUBUF=>YDXFU%XFUBUF, & & LCHEM_DIA=>YDCOMPO%LCHEM_DIA, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & NPROMA=>YDDIM%NPROMA, & & NFLEVG=>YDDIMV%NFLEVG, & & NGPTOT=>YDGEM%NGPTOT, & @@ -397,7 +393,7 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y IF (.NOT. LNF) THEN TDT=TSTEP NSTEP=0 - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,0,TDT,TSTEP,.FALSE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,0,TDT,TSTEP,.FALSE.) ENDIF IF ((NCONF == 1.OR.NCONF == 302).AND.NSTOP > 0 .AND. LNF .AND. .NOT.FP_SERV_C001%LFP_SERVER) THEN @@ -503,6 +499,27 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y END IF ENDIF +! Initialize aerosol indices (tm5m7 - if active) +! moving the CASE-clause that tests AERO_SCHEME from +! ./src/ifs/phys_ec/tm5m7_init.F90 here +IF (NAERO > 0 .AND. NCONF /= 131 ) THEN + SELECT CASE (TRIM(AERO_SCHEME)) + + CASE ("aer") + ! Setup of 'aer' configuration is done in su_aerw.F90 + CASE ("hamm7") + ! HAM-M7 only calculates aerosol micro-physics, + ! all other processes are dealt with in TM5-M7 + ! therefore we also have to initialize TM5-M7 + CALL TM5M7_INIT(YDGEOMETRY, YDMODEL%YRML_CHEM, YGFL, YDMODEL%YRML_PHY_RAD%YRERAD) + CALL HAMM7_INIT(YGFL, YDRIP, YDMODEL%YRML_CHEM%YRCHEM%CHEM_SCHEME) !requires stuff which is defined in TM5M7_INIT + + CASE DEFAULT + ! Option not implemented + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME)) + END SELECT +ENDIF + !IF (LCOUPLO4_ENV) THEN ! CALL COUPLO4_DEFINITIONS !ENDIF @@ -629,9 +646,9 @@ SUBROUTINE CNT4(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTCV,YDGOM5,Y LLFOUND = .FALSE. ENDIF IF (LLFOUND) THEN - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.,PI05=ZI05) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.,PI05=ZI05) ELSE - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,JSTEP,TDT,TSTEP,.TRUE.) ENDIF ! Update ocean fields from if previus time step was a coupled time step ! or we are at the beginning of the run. diff --git a/ifs-source/arpifs/control/stepx.F90 b/ifs-source/arpifs/control/stepx.F90 index 9908bbe6..e32b2a96 100644 --- a/ifs-source/arpifs/control/stepx.F90 +++ b/ifs-source/arpifs/control/stepx.F90 @@ -132,7 +132,7 @@ SUBROUTINE STEPX(YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL) CALL OPDIS(CLCONF,'STEPX ',ZCT,ZVT,ZWT,RSTART,RTIMEF,NSTEP,YDDYNA%LNHDYN) ENDIF - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,0,YDRIP%TSTEP,YDRIP%TSTEP,.FALSE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,0,YDRIP%TSTEP,YDRIP%TSTEP,.FALSE.) #ifdef WITH_NEMO IF(YDMODEL%YRML_AOC%YRMCC%LMCC04.AND.YDMODEL%YRML_AOC%YRMCC%LNEMOCOUP) THEN CALL GSTATS(33,0) diff --git a/ifs-source/arpifs/dia/sucddh.F90 b/ifs-source/arpifs/dia/sucddh.F90 index b8fcdc01..e260743d 100644 --- a/ifs-source/arpifs/dia/sucddh.F90 +++ b/ifs-source/arpifs/dia/sucddh.F90 @@ -84,7 +84,7 @@ SUBROUTINE SUCDDH(YDMODEL) ASSOCIATE(YDCDDH=>YDMODEL%YRML_DIAG%YRCDDH,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDMDDH=>YDMODEL%YRML_DIAG%YRMDDH, & & YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NGHG=>YGFL%NGHG, & +ASSOCIATE(LAEROSFC=>YDCOMPO%LAEROSFC, NACTAERO=>YGFL%NACTAERO, NGHG=>YGFL%NGHG, & & YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, & & LEFLAKE=>YDEPHY%LEFLAKE, & & NDHFFS=>YDMDDH%NDHFFS, NDHFIIS=>YDMDDH%NDHFIIS, NDHFSSS=>YDMDDH%NDHFSSS, & @@ -294,6 +294,7 @@ SUBROUTINE SUCDDH(YDMODEL) CLTXT(6)='NGT' CLTXT(7)='TAU' +! looks like LAEROSFC equals to NACTAERO>0 DO JVAR=1,NACTAERO DO JFLX=1,7 YDCDDH%CADHFSS(NDHVFS+IFSFLX_ECMWF+(JVAR-1)*7+JFLX)='SFGF'//TRIM(YAERO(JVAR)%CNAME)//CLTXT(JFLX) diff --git a/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 new file mode 100644 index 00000000..bb89df8c --- /dev/null +++ b/ifs-source/arpifs/m7/chem/tm5_wetchem_m7.F90 @@ -0,0 +1,258 @@ +SUBROUTINE TM5_WETCHEM_M7(KIDIA, KFDIA, KLON,KAERO,PDT,PTEMP,PAP,PRS,PLP,PY0,PHPLUS,PY, & + & PAEROP, PSO4_LPROD ) +!********************************************************************** +! +!TM5_WETCHEM_M7 - aqueous phase chemistry of sulfur (and other) +!programmed by Ad Jeuken (KNMI) and Frank Dentener (IMAU) +!adapted for TM5 by Maarten Krol (IMAU) 1-2002 +! +!purpose +!------- +!oxidation of SO2 and uptake of other gases in the aqueous phase +! +!interface +!--------- +!PY0 initial concentration - at the end of this routine PY0 will be updated +! with the final concentrations 'PY' because otherwise the conc.changes due +! to wet chemistry will be 'forgotten' in TM5_DO_EBI. +!PDT chemistry timestep +!PY concentrations at time is t +! +!method +!------ +!implicit solution of oxidation of SO2 +! +!external +!-------- +!none +! +!reference +!--------- +!- +!********************************************************************** + +USE PARKIND1 , ONLY : JPIM, JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMCST , ONLY : RNAVO,RMD +USE YOM_YGFL , ONLY : YGFL +USE TM5_CHEM_MODULE,ONLY: NREACW,NTLOW,NTEMP,KSO2HP,KSO2O3, & + & HENRY,IMSA,ISO4,IHNO3,INH4,IH2O2,IO3,ISO2,INH3,INO3_A +USE TM5M7_DATA, ONLY: IACS_N,ICOS_N,ISO4COS,ISO4ACS,ISO4NUS,ISO4AIS + +IMPLICIT NONE + +! input/output + +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA , KFDIA , KLON,KAERO +REAL(KIND=JPRB),INTENT(IN) :: PDT +REAL(KIND=JPRB), INTENT(INOUT) :: PY0(KLON,YGFL%NCHEM) +REAL(KIND=JPRB), INTENT(IN) :: PTEMP(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PRS(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PLP(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON) ! cloud cover +REAL(KIND=JPRB), INTENT(OUT) :: PHPLUS(KLON) ! concentration H+ +REAL(KIND=JPRB), INTENT(INOUT) :: PY(KLON,YGFL%NCHEM+3) +REAL(KIND=JPRB), INTENT(INOUT) :: PAEROP(KLON,KAERO) +REAL(KIND=JPRB), INTENT(INOUT) :: PSO4_LPROD(KLON) + +! * LOCAL +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +INTEGER(KIND=JPIM) :: ITEMP,ITER,JL +REAL(KIND=JPRB) :: ZX1,ZX2,ZX3,ZB1,ZB2,ZSO2X,ZDSO2,ZDISC,ZDNH3,ZXSO2O3A,ZXSO2O3B +REAL(KIND=JPRB),PARAMETER :: ZCO2=3.90E-4 ! approx Global mean CO2 mixing ratio, 2000-2010 period +REAL(KIND=JPRB),PARAMETER :: ZRG=0.08314 +REAL(KIND=JPRB) :: ZAIRD +REAL(KIND=JPRB),DIMENSION(KLON) :: ZXLIQ ! liquid water content +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKSO2 ! Henry's constant for sulfur dioxide +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKH2O2 ! Henry's constant for hydroperoxide +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKO3 ! Henry's constant for ozone +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKSO2 ! Dissociation constant for SO2 +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKHSO3 ! Dissociation constant for HSO3- +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKH2O ! dissociation constant water +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKNH3 ! dissociation constant ammonia +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKNH3 ! Henry's constant ammonia +REAL(KIND=JPRB),DIMENSION(KLON) :: ZHKCO2 ! Henry's constant CO2 +REAL(KIND=JPRB),DIMENSION(KLON) :: ZDKCO2 ! Dissociation constant CO2 +REAL(KIND=JPRB) :: ZPHS4 ! effective dissolvation of S(IV) +REAL(KIND=JPRB) :: ZPHSO2 ! effective dissolvation of SO2 +REAL(KIND=JPRB) :: ZPHH2O2 ! effective dissolvation of H2O2 +REAL(KIND=JPRB) :: ZPHOZONE ! effective dissolvation of O3 +REAL(KIND=JPRB),DIMENSION(KLON) :: ZPH ! pH +REAL(KIND=JPRB) :: ZA1,ZA2,ZA,ZB,ZC,ZZ ! help variables +REAL(KIND=JPRB) :: ZSULPH(KLON),ZFT +REAL(KIND=JPRB) :: ZXCOV,ZXLIQR,ZXL,ZTEMP,ZRT,ZTR ! meteo +REAL(KIND=JPRB),DIMENSION(KLON,NREACW) :: ZRW ! reaction rates +LOGICAL,DIMENSION(KLON):: LLCLOUDY + +! --- begin -------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5_WETCHEM_M7',0,ZHOOK_HANDLE ) + +!----------------------------- +! wet phase reactions +!----------------------------- +DO JL=KIDIA,KFDIA + LLCLOUDY(JL)=.FALSE. + + ZTEMP=PTEMP(JL) + ZAIRD = 7.24291E16_JPRB*PRS(JL)/ZTEMP + ! zx1: kg water to m3 water (m3 water/ kg air) + ZX1=PLP(JL)*1.E-3_JPRB + ZX2=RMD*1.E3_JPRB*ZAIRD/RNAVO ! kg/m3 (air) + ZXLIQ(JL) = ZX1/ZX2 ! dimensionless number (m^3/m^3) + ! avoid negatives and artificial values(1e-10 is about 0.0001 g/m3) + IF ( ZXLIQ(JL) < 1E-10_JPRB ) ZXLIQ(JL)=0._JPRB + + ! lwc is dimensionless + IF ((ZXLIQ(JL) > 1E-10_JPRB).AND.(PAP(JL) > 0.01_JPRB)) THEN + LLCLOUDY(JL)=.TRUE. + ZTR=(1._JPRB/ZTEMP-1._JPRB/298_JPRB) + ZRT=ZTEMP*ZRG + ITEMP=MIN(NTEMP,MAX(1_JPIM, NINT(ZTEMP-FLOAT(NTLOW)))) + ! + ! Henry and dissociation equilibria + ! + ZDKH2O(JL) =1.01E-14_JPRB*EXP(-6706.0_JPRB *ZTR) !h2o<=>hplus+so3-- + ZHKCO2(JL) =3.4E-2_JPRB*EXP(2420._JPRB*ZTR) ! is already dimensionless + !CMK BUG 092005 hkco2(JL) =3.4e-2*(2420.*ZTR) ! is already dimensionless + ZDKCO2(JL) =4.5E-7_JPRB*EXP(-1000._JPRB*ZTR) !co2aq<=>hco3- + hplus + ZHKSO2(JL) =HENRY(ISO2,ITEMP)*ZRT !dimensionless + ZDKNH3(JL) =1.8E-5_JPRB*EXP(-450._JPRB*ZTR) !nh3<=>nh4+ + OH- + ZHKNH3(JL) =HENRY(INH3,ITEMP)*ZRT !dimensionless + ZHKH2O2(JL)=HENRY(IH2O2,ITEMP)*ZRT !dimensionless + ZHKO3(JL) =HENRY(IO3,ITEMP)*ZRT !dimensionless + ZDKSO2(JL) =1.7E-2_JPRB*EXP(2090._JPRB*ZTR) !so2<=>hso3m+hplus + ZDKHSO3(JL)=6.6E-8_JPRB*EXP(1510._JPRB*ZTR) !hso3m<=>so3-- + hplus + ! + ! calculate H+ from initial sulfate, ammonium, hno3, and nh3 + ! if solution is strongly acidic no further calculations are performed + ! + + ZXL=ZXLIQ(JL)*RNAVO*1E-3_JPRB/PAP(JL) + !ZX1 is initial strong acidity from SO4 and NO3 + ! + !acidity from strong acids alone + ! + ! Stelios: small contributions from nucleation and Aitken mode + ! as well as gas-phase should be added for pH calculation + ZSULPH(JL)=PY0(JL,ISO4)+PAEROP(JL,ISO4COS)+PAEROP(JL,ISO4ACS)+PAEROP(JL,ISO4NUS)+PAEROP(JL,ISO4AIS) + + PHPLUS(JL)=(2._JPRB*ZSULPH(JL)+PY0(JL,IMSA)-PY0(JL,INH4)+ & + & PY0(JL,IHNO3)+PY0(JL,INO3_A))/ZXL + PHPLUS(JL)=MAX(PHPLUS(JL),1E-20_JPRB) + + ENDIF +ENDDO +DO ITER=1,10 + DO JL=KIDIA,KFDIA + ! only if solution pH>4.5 + IF ( LLCLOUDY(JL) ) THEN + IF ( (PHPLUS(JL) < 3E-5_JPRB) ) THEN + ZXL=ZXLIQ(JL)*RNAVO*1E-3_JPRB/PAP(JL) + ZX1=(2._JPRB*ZSULPH(JL)+PY0(JL,IMSA)+PY0(JL,IHNO3)+PY0(JL,INO3_A))/ZXL + !ZX2 is initial total NHx + ZX2=(PY0(JL,INH3)+PY0(JL,INH4))/ZXL + !ZX3 is combined dissolution and solubility const for CO2 + ZX3=ZDKCO2(JL)*ZHKCO2(JL)*ZCO2 + ZA1=ZDKH2O(JL)/ZDKNH3(JL)*(1._JPRB+1._JPRB/ZHKNH3(JL)) ! integration constant + ZA2=PY0(JL,ISO2)/ZXL !initial SO2 + ZZ =ZA2/(PHPLUS(JL)/ZDKSO2(JL)*(1._JPRB+1._JPRB/ZHKSO2(JL))+ & + & ZDKHSO3(JL)/PHPLUS(JL)+1._JPRB) + ZA=1._JPRB+ZX2/(ZA1+PHPLUS(JL)) + ZB=-ZX1-ZZ + ZC=-ZX3-2._JPRB*ZDKHSO3(JL)*ZZ + ZZ=MAX(0._JPRB,(ZB*ZB-4._JPRB*ZA*ZC)) + PHPLUS(JL)=MAX(1.E-10_JPRB,(-ZB+SQRT(ZZ))/(2._JPRB*ZA)) + ENDIF + ENDIF + ENDDO ! +ENDDO !iter +DO JL=KIDIA,KFDIA + IF (LLCLOUDY(JL)) THEN + ZTEMP=PTEMP(JL) + ZTR=(1._JPRB/ZTEMP-1._JPRB/298_JPRB) + ZXLIQR=ZXLIQ(JL)/PAP(JL) + ZXL=ZXLIQ(JL)*RNAVO*1E-3_JPRB/PAP(JL) + ZPH(JL)=-LOG10(PHPLUS(JL)) ! pH for diagnostics + + ! phase factor ratio of aqueous phase to gas phase concentration + + ZPHS4 = ZHKSO2(JL) *(1._JPRB+ZDKSO2(JL)/PHPLUS(JL)+ & + & ZDKSO2(JL)*ZDKHSO3(JL)/PHPLUS(JL)/PHPLUS(JL))*ZXLIQR + ZPHSO2 =ZHKSO2(JL) *ZXLIQR + ZPHH2O2 =ZHKH2O2(JL) *ZXLIQR + ZPHOZONE=ZHKO3(JL) *ZXLIQR + + ! the original rate equations could be partly in look-up table + + ZRW(JL,KSO2HP) =8E4_JPRB *EXP(-3560._JPRB*ZTR)/(0.1_JPRB+PHPLUS(JL)) + ZXSO2O3A =4.39E11_JPRB*EXP(-4131._JPRB/ZTEMP)+2.56E3_JPRB*EXP(-966._JPRB/ZTEMP) !S(IV) + ZXSO2O3B =2.56E3_JPRB *EXP(-966._JPRB /ZTEMP)/PHPLUS(JL) + !divide by [H+]!S(IV) + + ! make rate constants dimensionless by multiplying + ! by (1./ZXLIQR/avo=6e20) + ! multiply with the fractions of concentrations residing + ! in the aqueous phase + + ZRW(JL,KSO2HP)=ZRW(JL,KSO2HP)/ZXL*ZPHSO2/(1._JPRB+ZPHS4)*ZPHH2O2/(1._JPRB+ZPHH2O2) + ZRW(JL,KSO2O3)=(ZXSO2O3A+ZXSO2O3B)/ZXL*ZPHS4/(1._JPRB+ZPHS4)*ZPHOZONE/ & + & (1._JPRB+ZPHOZONE) + ENDIF !cloudy +ENDDO ! JL LOOP + + +DO JL=KIDIA,KFDIA + ! + ! only cloud chemistry if substantial amount of clouds are present + ! + IF (LLCLOUDY(JL)) THEN + ! + ! oxidation of S(IV) by O3 + ! + ZSO2X=PY0(JL,ISO2) + ZXCOV=PAP(JL) + ZX1=MIN(100._JPRB,ZRW(JL,KSO2O3)*PY0(JL,IO3)*PDT) + ZDSO2=PY0(JL,ISO2)*ZXCOV*(EXP(-ZX1)-1._JPRB) + !only applied to ZXCOV part of cloud + ZDSO2=MAX(-PY0(JL,IO3)*ZXCOV,ZDSO2)! limit to o3 availability + + PSO4_LPROD(JL)=-ZDSO2 + PY(JL,ISO2) = PY(JL,ISO2)+ZDSO2 ! dso2 is loss of SO2 and H2O2 + PY(JL,IO3) = PY0(JL,IO3)+ZDSO2 + + ! + ! oxidation of S(IV) by H2O2 + ! + !*** here we explicitly solve the dv: + ! y'=P-Q*y-R*y*y (P and Q are 0=>b3=0.) + ! + ZSO2X=PY(JL,ISO2) + IF ( ZSO2X > TINY(ZSO2X) ) THEN + ZB1=ZRW(JL,KSO2HP) + ZB2=ZB1*(PY0(JL,IH2O2)-ZSO2X) + ZDISC=MIN(100._JPRB,SQRT(ZB2*ZB2)) ! disc is b2 for b3=0.0 + ZX1=(ZB2-ZDISC)/(-2._JPRB*ZB1) ! in this case ZX1 =0. + ZX2=(ZB2+ZDISC)/(-2._JPRB*ZB1) + ZX3=(ZSO2X-ZX1)/(ZSO2X-ZX2)*EXP(-ZDISC*PDT) + ZSO2X=(ZX1-ZX2*ZX3)/(1.-ZX3) + ZDSO2=(ZSO2X-PY(JL,ISO2))*ZXCOV + ZDSO2=MAX(ZDSO2,-PY0(JL,IH2O2)*ZXCOV) + PSO4_LPROD(JL)=-ZDSO2 + PY(JL,ISO2) = PY(JL,ISO2)+ZDSO2 ! dso2 is loss of SO2 and H2O2 + PY(JL,IH2O2) = PY0(JL,IH2O2)+ZDSO2 + ENDIF + + ! Finally also update PY0 concentrations + PY0(JL,ISO2)=PY(JL,ISO2) + PY0(JL,IO3) =PY(JL,IO3) + PY0(JL,IH2O2)=PY(JL,IH2O2) + else + !write(3399,*)'no clouds',JL,llcloudy(JL),zdso2 + + ENDIF !cloudy +ENDDO + + +IF (LHOOK) CALL DR_HOOK('TM5_WETCHEM_M7',1,ZHOOK_HANDLE ) +END SUBROUTINE TM5_WETCHEM_M7 diff --git a/ifs-source/arpifs/m7/hamm7_diag_pm.F90 b/ifs-source/arpifs/m7/hamm7_diag_pm.F90 new file mode 100644 index 00000000..fc918838 --- /dev/null +++ b/ifs-source/arpifs/m7/hamm7_diag_pm.F90 @@ -0,0 +1,221 @@ +SUBROUTINE HAMM7_DIAG_PM & + &( YDMODEL, KIDIA , KFDIA , KLON , KLEV , NAERO, & + & PAEROP,PAEPM1,PAEPM25,PAEPM10,PRHO, PDRYRADIUS, PWETRADIUS, PRHOP) + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ │ +! │ Purpose : │ +! │ ------- │ +! │ *hamm7_diag_pm* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *HAMM7_DIAG_PM* is called from HAMM7_INTERFACE │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ Dimensions │ +! │ Aerosol mass mixing │ +! │ aerosol mode sizes │ +! │ aerosol densitities │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ PAEPM1 PM1 consentration │ +! │ PAEPM25 PM2.5 consentration │ +! │ PAEPM10 PM10 consentration │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ Calcluate particulate concentration for given │ +! │ aerosol size limits. Takes into account that observations. │ +! │ select particles with aerodynmic diameter while mass is calculated │ +! │ from dry mass. │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ Tommi Bergman (FMI) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ +USE TYPE_MODEL, ONLY : MODEL +USE MO_HAM, ONLY : sigma_fine, sigma_coarse, nsol, nclass +USE PARKIND1, ONLY : JPIM, JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE mo_ham_m7ctl, ONLY : cmedr2mmedr + +IMPLICIT NONE + +TYPE(MODEL) , INTENT(IN) :: YDMODEL ! For finding tracer indices +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM), INTENT(IN) :: NAERO ! Number of active aerosol species +REAL(KIND=JPRB), INTENT(IN) :: PAEROP(KLON,KLEV,NAERO) ! aerosol mass mixing ratios + +REAL(KIND=JPRB), INTENT(OUT) :: PAEPM1(KLON),PAEPM25(KLON),PAEPM10(KLON) ! PM output variables +REAL(KIND=JPRB), INTENT(IN) :: PDRYRADIUS(KLON,KLEV,NSOL) ! Dry radii of particles (only for soluble classes) +REAL(KIND=JPRB), INTENT(IN) :: PWETRADIUS(KLON,KLEV,NCLASS) ! Wet radii of particles (actually dry for insoluble) +REAL(KIND=JPRB), INTENT(IN) :: PRHOP(KLON,KLEV,NCLASS) ! Particle density +REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) ! Air density Kg(air)/M3 for unit conversion + +!* 0.1 LOCAL VARIABLES + +INTEGER(KIND=JPIM) :: JAER, JL + +! inidices for modes in local ZMASSDRYDIAMETER (also in pwetradius and dryradius (1-4)) + +INTEGER(KIND=JPIM), PARAMETER :: I_NS = 1 ! Nucleation mode +!INTEGER(KIND=JPIM), PARAMETER :: I_KS = 2 ! Aitken soluble (not needed at the moment) +INTEGER(KIND=JPIM), PARAMETER :: I_AS = 3 ! accumulation soluble +INTEGER(KIND=JPIM), PARAMETER :: I_CS = 4 ! coarse soluble +INTEGER(KIND=JPIM), PARAMETER :: I_KI = 5 ! Aitken insoluble +INTEGER(KIND=JPIM), PARAMETER :: I_AI = 6 ! accumulation insoluble +INTEGER(KIND=JPIM), PARAMETER :: I_CI = 7 ! coarse insoluble + +INTEGER(KIND=JPIM) :: ICLASS ! loop index +INTEGER(KIND=JPIM) :: IPM ! loop index + +REAL(KIND=JPRB) :: ZPM_FRACTION(3) ! Fraction of mass in the PM range temporary for a mode +REAL(KIND=JPRB) :: ZPM_LIMIT(3) ! diameter limits for the three PM +REAL(KIND=JPRB) :: ZDRYRADIUS(KLON,KLEV,NCLASS) ! count median dry radii of the M7 classes (modes) +REAL(KIND=JPRB) :: ZMASSDRYDIAMETER(KLON,KLEV,NCLASS) ! mass median dry diameters + +REAL(KIND=JPRB) :: ZHR ! Temporary variable +REAL(KIND=JPRB) :: ZTMP ! Temporary variable + +INTRINSIC ERF + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('HAMM7_DIAG_PM',0,ZHOOK_HANDLE) +ASSOCIATE( YAERO_NL => YDMODEL%YRML_GCONF%YGFL%YAERO_NL ) + +!* 0.5 Initialisations + +! output +PAEPM1(:) = 0.0_JPRB +PAEPM25(:) = 0.0_JPRB +PAEPM10(:) = 0.0_JPRB + +! local variables +ZDRYRADIUS(:,:,:) = 0.0_JPRB +ZMASSDRYDIAMETER(:,:,:) = 0.0_JPRB + +! Size limits +ZPM_LIMIT(1) = 1.0e-6_JPRB ! sizelimit for PM1 +ZPM_LIMIT(2) = 2.5e-6_JPRB ! sizelimit for PM2.5 +ZPM_LIMIT(3) = 1.0e-5_JPRB ! sizelimit for PM10 +ZPM_FRACTION(:) = 0.0_JPRB + +! dry radii into one array +ZDRYRADIUS(KIDIA:KFDIA, 1:KLEV, I_NS:I_CS) = PDRYRADIUS(KIDIA:KFDIA, 1:KLEV, I_NS:I_CS) ! Dry radius defined only for soluble modes +ZDRYRADIUS(KIDIA:KFDIA, 1:KLEV, I_KI:I_CI) = PWETRADIUS(KIDIA:KFDIA, 1:KLEV, I_KI:I_CI) ! for Insoluble WET=DRY + +! change count median radii to mass median diameter +do iclass=1,nclass + ZMASSDRYDIAMETER(KIDIA:KFDIA, 1:KLEV, iclass) = 2.0_JPRB * ZDRYRADIUS(KIDIA:KFDIA, 1:KLEV, iclass) * cmedr2mmedr(iclass) +ENDDO + +! determine PMs +DO JAER=1,NAERO + IF ((INDEX(YAERO_NL(JAER)%CNAME ,'NS')>0 ) .or. (INDEX(YAERO_NL(JAER)%CNAME ,'KS')>0) .or.& + & (INDEX(YAERO_NL(JAER)%CNAME ,'KI')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN + DO JL=KIDIA,KFDIA + PAEPM1(JL) = PAEPM1(JL) + PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDDO + ENDIF + ELSEIF((INDEX(YAERO_NL(JAER)%CNAME ,'AS')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_AS))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_AS))**0.5)) & + & - log(ZMASSDRYDIAMETER(JL,KLEV,I_AS) ) ) / log(sigma_fine) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + ENDIF + ELSEIF((INDEX(YAERO_NL(JAER)%CNAME ,'AI')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_AI))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_AI))**0.5)) & + & - log(ZMASSDRYDIAMETER(JL,KLEV,I_AI) ) ) / log(sigma_fine) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + ENDIF + ELSEIF((INDEX(YAERO_NL(JAER)%CNAME ,'CS')>0 ) ) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_CS))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_CS))**0.5)) & + & - log( ZMASSDRYDIAMETER(JL,KLEV,I_CS) ) ) / log(sigma_coarse) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + ENDIF + ELSEIF (INDEX(YAERO_NL(JAER)%CNAME ,'CI')>0) THEN + ! exclude Number concentrations e.g. "xxxAS_N" + IF(INDEX(YAERO_NL(JAER)%CNAME ,'_N') ==0 ) THEN ! exclude number mixing ratios + DO JL=KIDIA,KFDIA + if ((ZMASSDRYDIAMETER(JL,KLEV,I_CI))>1e-20_JPRB) then + ZHR = 0.5 * SQRT(2.0) + DO IPM=1,3 + ! the limit is multiplied to account for aerodynamic diameter (in contrast to geometric mean diameter) + ZTMP = ( log(ZPM_LIMIT(IPM)*((1000./prhop(JL,KLEV,I_CI))**0.5)) & + & - log( ZMASSDRYDIAMETER(JL,KLEV,I_CI) ) ) / log(sigma_coarse) + ZPM_FRACTION(IPM) = 0.5 + 0.5 * ERF(ZTMP * ZHR) + ENDDO + PAEPM1(JL) = PAEPM1(JL) + ZPM_FRACTION(1) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM25(JL) = PAEPM25(JL) + ZPM_FRACTION(2) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + PAEPM10(JL) = PAEPM10(JL) + ZPM_FRACTION(3) * PAEROP(JL,KLEV,JAER) * PRHO(JL,KLEV) + ENDIF + ENDDO + + ENDIF + ENDIF +ENDDO + + + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('HAMM7_DIAG_PM',1,ZHOOK_HANDLE) +END SUBROUTINE HAMM7_DIAG_PM diff --git a/ifs-source/arpifs/m7/hamm7_init.F90 b/ifs-source/arpifs/m7/hamm7_init.F90 new file mode 100644 index 00000000..a6d0a670 --- /dev/null +++ b/ifs-source/arpifs/m7/hamm7_init.F90 @@ -0,0 +1,544 @@ +SUBROUTINE hamm7_init(YGFL, YRRIP, CHEM_SCHEME) + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 14-MAY-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ init routine HAM-M7 aerosol in OpenIFS │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *hamm7_init* is called from *CNT4*. │ +! │ REMARK: the code assumes that TM5M7_INIT has already been called! │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ 2020-11-11 - Thomas Kuehn (FMI/UEF) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ ? - Eemeli Holopainen (FMI) : ? │ +! │ May. 2024 - R. Checa-Garcia (KNMI) : revision for CY48r1 │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ + +!---------------------------------------------------------------------- +!* 0.0 USE STATEMENTS +! --------------- + +! IFS/OPENIFS modules --------------------------------------------------------- +USE PARKIND1, ONLY : JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMRIP, ONLY : TRIP +USE YOM_YGFL, ONLY : TYPE_GFLD ! Gives type for YGFL +USE YOMMP0, ONLY : MYPROC +USE YOMLUN, ONLY : NULOUT + +! --- M7 modules -------------------------------------------------------------- +USE MO_KIND, ONLY: THRESHOLD +USE MO_TIME_CONTROL, ONLY: init_mo_time_control +USE MO_SPECIES, ONLY: speclist ! tracer species in HAM +USE MO_HAM, ONLY: & + sizeclass, & ! aerosol classes in HAM + nclass, & ! number of aerosol classes in HAM + aerocomp, & ! aerosol compounds by size class in HAM + naerocomp, & ! amount of aerosol mass tracers in HAM + subm_gasspec, & ! gas phase species in HAM + subm_ngasspec ! number of gas phase species in HAM + +USE OIFS_to_HAM, ONLY: init_ind_oifs_ham, & ! init index list for OIFS and HAM + & ind_oifs_ham ! index list type + !ind_class_OIFS, & ! index list for aerosol sizeclasses from OIFS + !ind_class_HAM, & ! index list for aerosol sizeclasses from HAM + !ind_mass_OIFS, & ! index list for aerosol masses from OIFS + !ind_mass_HAM, & ! index list for aerosol masses from HAM + !ind_gas_OIFS, & ! index list for gases from OIFS + !ind_gas_HAM, & ! index list for gases from HAM + !ind_cloud_OIFS, & ! index list for cloud variables from OIFS + !ind_cloud_HAM ! index list for cloud variables from HAM + +USE MO_TRACDEF, ONLY: GAS, AEROSOL, & ! species type identifiers + & GAS_OR_AEROSOL, ntrac, trlist + +USE MO_HAM_M7_TRAC, ONLY: idt_cdnc_ham, & !index for HAM CDNC + & idt_icnc_ham !index for HAM ICNC + +USE MO_HAM_INIT, ONLY: & + start_ham, & + ham_initialize, & + ham_define_tracer !eehol: added ham_define_tracer + +USE MO_ADVECTION, ONLY: & !eehol: added for advection initialization + iadvec, tpcore + +USE MO_SUBMODEL, & + ONLY: & !eehol: added mo_submodel routines + lham, id_ham + +USE MO_SPECIES, & + ONLY: speclist, init_splist !eehol: added initialization for species list + +USE MO_HAM_SOA, & + ONLY: soaprop + +!eehol: activation initialization +USE MO_ACTIV, & + ONLY: activ_initialize, idt_cdnc, idt_icnc + +USE MO_PARAM_SWITCHES, & + ONLY: ncd_activ, nactivpdf, lcdnc_progn + + +IMPLICIT NONE +TYPE(TYPE_GFLD), INTENT(IN) :: YGFL +TYPE(TRIP), INTENT(IN) :: YRRIP +CHARACTER(len=20), INTENT(IN) :: CHEM_SCHEME + +!---------------------------------------------------------------------- +!* 0.5 LOCAL VARIABLES +! --------------- +INTEGER :: & ! looping indices + & j_yaero, j_ychem, & ! IFS + & j_class, j_mass, j_spec, j_gas, j_cloud, & ! HAM + & kt, znclass, znaerocomp, zsubm_ngasspec, zcloudind ! eehol: indices for OIFS to HAM + +CHARACTER(len=64) :: int_str, int_str_ham ! eehol: integer as string +LOGICAL, PARAMETER :: LLDEBUG=.FALSE. ! Debug flag + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE ! return status + +!---------------------------------------------------------------------- +!* 1.0 EXECUTABLE CODE +! --------------- +!ASSOCIATE(NACTAERO=>YGFL%NACTAERO, LAERCHEM=>YGFL%LAERCHEM) + +IF (LHOOK) CALL DR_HOOK('HAMM7_INIT',0,ZHOOK_HANDLE) + +! getting the correct time step: +CALL init_mo_time_control(YRRIP) + +!eehol: set advection scheme +iadvec = tpcore !comes from ECHAM mo_control.f90 +!eehol: activation initialization +nactivpdf = 1 !eehol: using PDF to calculate updraft. Hardcoded for now.. need to check this later (add setphys to oifs?) +ncd_activ = 2 !eehol: Abdul-Razzak and Ghan activation scheme. Hardcoded for now.. need to check this later (add setphys to oifs?) +lcdnc_progn = .TRUE. + +!eehol: set submodel parameters and flags +CALL init_splist !eehol: added init for splist + +CALL start_ham + +id_ham=1 +CALL ham_define_tracer + +CALL ham_initialize +! ham_init_memory calls: +! ham_nucl_initialize, if nsnucl+nonucl > 0 +!CALL ham_init_memory !eehol: this is not needed now + +CALL activ_initialize + +!eehol: set cdnc and icnc indices for HAM +idt_cdnc = idt_cdnc_ham +idt_icnc = idt_icnc_ham + +!<--eehol: initialize index lists for OIFS and HAM +znclass = nclass +znaerocomp = naerocomp +zsubm_ngasspec = subm_ngasspec + +! RCHG -> for consistency I would define zcloudind in the MO_HAM like the similar +! definitions rather than here. +zcloudind = 2 !eehol CDNC and ICNC + +CALL init_ind_oifs_ham(znclass, znaerocomp, zsubm_ngasspec, zcloudind) ! RCHG -> allocates and initialize to zero. +!-->eehol + +! assigning tracer indices as found in YGFL to the +! corresponding metadata fields in HAM +ASSOCIATE(& + NAERO=>YGFL%NAERO, YAERO=>YGFL%YAERO, & ! aerosol tracer meta-data + NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, LAERCHEM=>YGFL%LAERCHEM & ! chemistry tracer meta-data +) + +! The following code tries to identify the dynamically generated tracers +! in OpenIFS to the independently generated metadata generated in HAM. +! The point of this procedure is to be able to directly access the +! tracer data stored in PCEN and PTENC in the HAM routines without +! having to copy the data into new fields. +! The naming conventions in IFS and HAM are somewhat different, so +! tracer naming is somewhat hard-coded. As a first instance to troubleshooting, +! check the logfile 'fort.2001' in the run directory and see which tracers +! are not recognised by HAM. Then check the file +! AC-experiments/ctrl/Table/bins_hamm7ver1.csv and compare the names you get +! in the files. + +! aerosol tracers +LABEL_IFS_AERO: DO j_yaero = 1,NAERO + + ! looping over the number tracers in HAM + LABEL_CLASS: DO j_class = 1,nclass + + ! sizeclass names in HAM-M7 are two-letter (xy) combinations: + ! x: N,K,A,C = nucleation, Aitken, accumulation, and coarse, respectively, while + ! y: S,I = soluble, insoluble, respectively. + ! In the IFS-csv table, these combinations are suffixed with '_N' + + IF (TRIM(YAERO(j_yaero)%CNAME) == TRIM(sizeclass(j_class)%shortname)//'_N') THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !sizeclass(j_class)%idt_no = j_yaero + + kt = sizeclass(j_class)%idt_no + ind_oifs_ham%ind_class_OIFS(j_class) = j_yaero !eehol: take indices for sizeclass to a vector for OIFS + ind_oifs_ham%ind_class_HAM(j_class) = kt !eehol: take indices for sizeclass to a vector for HAM + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt !sizeclass(j_class)%idt_no + WRITE(2000+MYPROC,'(a)') 'sizeclass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'OIFS size: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(3000+MYPROC,'(a)') 'HAM size: '//TRIM(trlist%ti(sizeclass(j_class)%idt_no)%fullname) + WRITE(3000+MYPROC,'(a)') 'sizeclass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified, we can check the next one + CYCLE LABEL_IFS_AERO + END IF + END DO LABEL_CLASS + + ! looping over the aerosol compound tracers in HAM + LABEL_MASS: DO j_mass = 1,naerocomp + ! aerosol compound names in HAM-M7 are combinations of the chemical species + ! and the sizeclass. The format is zzz_xy, where x and y are as in the sizeclass + ! and zzz is a 2- or 3-letter abbreviation + ! standard names are OC, BC, SO4, DU, and SS for organic carbon, black carbon + ! sulfate, mineral dust and seasalt, respectively. Other species may be + ! included as well, depending on the HAM setup. + + j_class = aerocomp(j_mass)%iclass ! index to size class + j_spec = aerocomp(j_mass)%spid ! index to species + + IF (TRIM(YAERO(j_yaero)%CNAME) == (TRIM(speclist(j_spec)%shortname)//'_'//TRIM(sizeclass(j_class)%shortname))) THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !aerocomp(j_mass)%idt = j_yaero + !ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector + !ind_mass_HAM(j_mass) = aerocomp(j_mass)%idt !eehol: take indices for masses to a vector + kt = aerocomp(j_mass)%idt + ind_oifs_ham%ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector for OIFS + ind_oifs_ham%ind_mass_HAM(j_mass) = kt !eehol: take indices for masses to a vector for HAM + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'OIFS mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(6000+MYPROC,'(a)') 'HAM mass: '//TRIM(trlist%ti(aerocomp(j_mass)%idt)%fullname) + WRITE(6000+MYPROC,'(a)') 'mass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_AERO + + ELSE IF ( (TRIM(YAERO(j_yaero)%CNAME) == 'POM_'//TRIM(sizeclass(j_class)%shortname)) .AND. (TRIM(speclist(j_spec)%shortname) == 'OC') ) THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !aerocomp(j_mass)%idt = j_yaero + + kt = aerocomp(j_mass)%idt + ind_oifs_ham%ind_mass_OIFS(j_mass) = j_yaero !eehol: take indices for masses to a vector for OIFS + ind_oifs_ham%ind_mass_HAM(j_mass) = kt !eehol: take indices for masses to a vector for HAM + + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'OIFS mass: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(6000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(6000+MYPROC,'(a)') 'HAM mass: '//TRIM(trlist%ti(aerocomp(j_mass)%idt)%fullname) + WRITE(6000+MYPROC,'(a)') 'mass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_AERO + END IF + + END DO LABEL_MASS + + !eehol: looping over cloud compounds + LABEL_CLOUD: DO j_cloud = idt_cdnc,idt_icnc !eehol: only CDNC and ICNC + + IF (TRIM(YAERO(j_yaero)%CNAME) == TRIM(trlist%ti(j_cloud)%fullname)) THEN + + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !sizeclass(j_class)%idt_no = j_yaero + kt = j_cloud + ind_oifs_ham%ind_cloud_OIFS(j_cloud-idt_cdnc+1) = j_yaero !eehol: take indices for sizeclass to a vector for OIFS + ind_oifs_ham%ind_cloud_HAM(j_cloud-idt_cdnc+1) = kt !eehol: take indices for sizeclass to a vector for HAM + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(int_str,*) j_yaero + WRITE(int_str_ham,*) kt !sizeclass(j_class)%idt_no + WRITE(2000+MYPROC,'(a)') 'cloud class: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'OIFS size: '//TRIM(YAERO(j_yaero)%CNAME) + WRITE(3000+MYPROC,'(a)') 'j_yaero ='//TRIM(int_str) + WRITE(3000+MYPROC,'(a)') 'HAM size: '//TRIM(trlist%ti(kt)%fullname) + WRITE(3000+MYPROC,'(a)') 'sizeclass idt_no ='//TRIM(int_str_ham) + END IF + + ! once the tracer is identified, we can check the next one + CYCLE LABEL_IFS_AERO + END IF + + END DO LABEL_CLOUD + + ! If we end up here, the tracer is not a sizeclass or mass + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(2000+MYPROC,'(a)') 'neither mass nor sizeclass in HAM: '//TRIM(YAERO(j_yaero)%CNAME) + END IF + +END DO LABEL_IFS_AERO + +! chemistry tracers +! chemistry tracers in HAM do not have separate metadata, because there is only one +! tracer per species. Therefore we have to check the HAM species metadata and +! make sure that the metadata actually describes a gas. +IF (LAERCHEM.AND.(TRIM(CHEM_SCHEME)=="tm5".OR.TRIM(CHEM_SCHEME)=="SimChem"))THEN + LABEL_IFS_CHEM: DO j_ychem = 1,NCHEM + + ! looping over the gas phase tracers in HAM + LABEL_GAS: DO j_gas = 1,subm_ngasspec + j_spec = subm_gasspec(j_gas) + + ! If the species does not exist in gas form in HAM, we don't consider it further + IF ((speclist(j_spec)%nphase == GAS) .OR. (speclist(j_spec)%nphase == GAS_OR_AEROSOL)) THEN + IF (TRIM(YCHEM(j_ychem)%CNAME) == TRIM(speclist(j_spec)%shortname)) THEN + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + !speclist(j_spec)%idt = j_ychem + kt = speclist(j_spec)%idt + ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS + ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM + + ! turn wetdep off for gases if LAERCHEM=.true. + trlist%ti(kt)%nwetdep=0 + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(int_str,*) j_ychem + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) + WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) + WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) + ! RCHG -> line below printed non string characters. Probably issue with dimensions + ! strings, so commented. FIXME + !WRITE(7000+MYPROC,'(a)') 'wetdep',trlist%ti(kt) + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_CHEM + + END IF + ! sulfuric acid is special, because in HAM it is tagged as H2SO4, while in IFS it + ! is called SO4 ('tm5' case) 'H2SO4' or ('SimChem' case ) + IF ( (TRIM(speclist(j_spec)%shortname) == 'H2SO4') .AND. & + & ( ( TRIM(YCHEM(j_ychem)%CNAME) == 'H2SO4' .AND. TRIM(CHEM_SCHEME)=="SimChem" ) & + & .OR. ( TRIM(YCHEM(j_ychem)%CNAME) == 'SO4' .AND. TRIM(CHEM_SCHEME)=="tm5" ) ) ) THEN + ! In case of a match, we set the tracer index in the HAM meta data to the + ! according IFS-index and write a note into the logfile + kt = speclist(j_spec)%idt + ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS + ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM + ! turn wetdep off for SO4 if LAERCHEM=.true. + trlist%ti(kt)%nwetdep=0 + + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(int_str,*) j_ychem + WRITE(int_str_ham,*) kt + WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) + WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) + WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) + WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) + WRITE(7000+MYPROC,'(a)') 'wetdep=',trlist%ti(kt)%nwetdep + END IF + + ! once the tracer is identified we can check the next one + CYCLE LABEL_IFS_CHEM + END IF + END IF + END DO LABEL_GAS + + ! If we end up here, the tracer is not a sizeclass or mass + IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(2000+MYPROC,'(a)') 'not a gas in HAM: '//TRIM(YCHEM(j_ychem)%CNAME) + END IF + + END DO LABEL_IFS_CHEM + +!ELSE IF (LAERCHEM.AND.TRIM(CHEM_SCHEME)=="SimChem") THEN +! Write(9191,*)'simple SO4 in development' +! +! LABEL_IFS_CHEM_SO4: DO j_ychem = 1,NAERO +! +! ! looping over the gas phase tracers in HAM +! LABEL_GAS_SO4: DO j_gas = 1,subm_ngasspec +! j_spec = subm_gasspec(j_gas) +! ! If the species does not exist in gas form in HAM, we don't consider it further +! IF ((speclist(j_spec)%nphase == GAS) .OR. (speclist(j_spec)%nphase == GAS_OR_AEROSOL)) THEN +! IF(MYPROC==1)THEN +! write(4001,*)TRIM(YAERO(j_ychem)%CNAME),TRIM(speclist(j_spec)%shortname) +! END IF +! IF (TRIM(YAERO(j_ychem)%CNAME) == TRIM(speclist(j_spec)%shortname)) THEN +! ! In case of a match, we set the tracer index in the HAM meta data to the +! ! according IFS-index and write a note into the logfile +! !speclist(j_spec)%idt = j_ychem +! kt = speclist(j_spec)%idt +! ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS +! ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM +! ! turn wetdep on for gases if LAERCHEM=.false. +! trlist%ti(kt)%nwetdep=1 +! IF (LLDEBUG .AND. MYPROC == 1) THEN +! WRITE(int_str,*) j_ychem +! WRITE(int_str_ham,*) kt +! WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) +! WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) +! WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) +! END IF +! ! once the tracer is identified we can check the next one +! CYCLE LABEL_IFS_CHEM_SO4 +! END IF +! +! ! sulfuric acid is special, because in HAM it is tagges as H2SO4, while in IFS it +! ! is called SO4 -- hard-coding for now +! !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN +! !WRITE(*,*)"j_spec:",j_spec +! !WRITE(*,*)"j_ychem:",j_ychem +! !WRITE(*,*)"YAERO(j_ychem)%CNAME:",YAERO(j_ychem)%CNAME +! !WRITE(*,*)"speclist(j_spec)%shortname:",speclist(j_spec)%shortname +! !IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4_gas') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN +! IF ( (TRIM(YAERO(j_ychem)%CNAME) == 'SO4') .AND. (TRIM(speclist(j_spec)%shortname) == 'H2SO4') ) THEN +! ! In case of a match, we set the tracer index in the HAM meta data to the +! ! according IFS-index and write a note into the logfile +! kt = speclist(j_spec)%idt +! ind_oifs_ham%ind_gas_OIFS(j_gas) = j_ychem !eehol: take indices for gases to a vector for OIFS +! ind_oifs_ham%ind_gas_HAM(j_gas) = kt !eehol: take indices for gases to a vector for HAM +! ! turn wetdep on for gases if LAERCHEM=.false. +! trlist%ti(kt)%nwetdep=1 +! IF (LLDEBUG .AND. MYPROC == 1) THEN +! WRITE(int_str,*) j_ychem +! WRITE(int_str_ham,*) kt +! WRITE(2000+MYPROC,'(a)') 'gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'OIFS gas: '//TRIM(YCHEM(j_ychem)%CNAME) +! WRITE(7000+MYPROC,'(a)') 'j_ychem ='//TRIM(int_str) +! WRITE(7000+MYPROC,'(a)') 'HAM gas: '//TRIM(trlist%ti(speclist(j_spec)%idt)%fullname) +! WRITE(7000+MYPROC,'(a)') 'gas idt_no ='//TRIM(int_str_ham) +! END IF +! +! ! once the tracer is identified we can check the next one +! CYCLE LABEL_IFS_CHEM_SO4 +! END IF +! END IF +! END DO LABEL_GAS_SO4 +! END DO LABEL_IFS_CHEM_SO4 + +ELSE + ! Note that here we are checking that: + ! - LAERCHEM is true (should always be the case with M7). It was used to distinguish between chem_scheme='tm5' and "no chemistry" in 43r3/AC with M7 activated (and still the case in 48r1 with AER!). + ! - CHEM_SCHEME is either 'tm5' or 'SimChem' + CALL ABOR1(" hamm7_init: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) +END IF + +! -- LOG +WRITE(NULOUT,'("====== HAMM7_INIT ===== ")') + +WRITE(NULOUT,*) "TOLERANCE (EPS): ", THRESHOLD + +WRITE(NULOUT,'("Number of size classes:", I3)') znclass +WRITE(NULOUT,'(" class# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_CLASS = 1,NCLASS + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_CLASS, & + & IND_OIFS_HAM%IND_CLASS_OIFS(J_CLASS), & + & IND_OIFS_HAM%IND_CLASS_HAM(J_CLASS), & + & TRIM(YAERO(IND_OIFS_HAM%IND_CLASS_OIFS(J_CLASS))%CNAME), & + & TRIM(trlist%ti(sizeclass(J_CLASS)%idt_no)%fullname) +ENDDO + +WRITE(NULOUT,'("Number of mass tracers:", I3)') znaerocomp +WRITE(NULOUT,'(" mass# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_MASS = 1,NAEROCOMP + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_MASS, & + & IND_OIFS_HAM%IND_MASS_OIFS(J_MASS), & + & IND_OIFS_HAM%IND_MASS_HAM(J_MASS), & + & TRIM(YAERO(IND_OIFS_HAM%IND_MASS_OIFS(J_MASS))%CNAME), & + & TRIM(trlist%ti(aerocomp(J_MASS)%idt)%fullname) +ENDDO + +WRITE(NULOUT,'("Number of gas tracers:", I3)') zsubm_ngasspec +WRITE(NULOUT,'(" gas# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_GAS = 1,SUBM_NGASSPEC + J_SPEC = SUBM_GASSPEC(J_GAS) + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_GAS, & + & IND_OIFS_HAM%IND_GAS_OIFS(J_GAS), & + & IND_OIFS_HAM%IND_GAS_HAM(J_GAS), & + & TRIM(YCHEM(IND_OIFS_HAM%IND_GAS_OIFS(J_GAS))%CNAME), & + & TRIM(TRLIST%TI(SPECLIST(J_SPEC)%IDT)%FULLNAME) +ENDDO + +WRITE(NULOUT,'("Number of cloud tracers:", I3)') zcloudind +WRITE(NULOUT,'(" cloud# / IFS id / HM7 id / IFSNAME / M7NAME ")') +DO J_CLOUD = IDT_CDNC,IDT_ICNC + WRITE(NULOUT,'(1x,I6,3x,I6,3x,I6,3x,A,2x,A)') & + & J_CLOUD-IDT_CDNC+1, & + & IND_OIFS_HAM%IND_CLOUD_OIFS(J_CLOUD-IDT_CDNC+1), & + & IND_OIFS_HAM%IND_CLOUD_HAM(J_CLOUD-IDT_CDNC+1), & + & TRIM(YAERO(IND_OIFS_HAM%IND_CLOUD_OIFS(J_CLOUD-IDT_CDNC+1))%CNAME), & + & TRIM(trlist%ti(IND_OIFS_HAM%IND_CLOUD_HAM(J_CLOUD-IDT_CDNC+1))%fullname) +ENDDO + +IF (LLDEBUG .AND. MYPROC == 1) THEN + WRITE(5001+MYPROC,*) 'HAM class idts =', ind_oifs_ham%ind_class_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS class idts =', ind_oifs_ham%ind_class_OIFS(:) + WRITE(5001+MYPROC,*) 'HAM mass idts =', ind_oifs_ham%ind_mass_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS mass idts =', ind_oifs_ham%ind_mass_OIFS(:) + WRITE(5001+MYPROC,*) 'HAM gas idts =', ind_oifs_ham%ind_gas_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS gas idts =', ind_oifs_ham%ind_gas_OIFS(:) + WRITE(5001+MYPROC,*) 'HAM cloud idts =', ind_oifs_ham%ind_cloud_HAM(:) + WRITE(5001+MYPROC,*) 'OIFS cloud idts =', ind_oifs_ham%ind_cloud_OIFS(:) +END IF + +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('HAMM7_INIT',1,ZHOOK_HANDLE) +!END ASSOCIATE +END SUBROUTINE hamm7_init diff --git a/ifs-source/arpifs/m7/module/m7_data.F90 b/ifs-source/arpifs/m7/module/m7_data.F90 new file mode 100755 index 00000000..958b4bbd --- /dev/null +++ b/ifs-source/arpifs/m7/module/m7_data.F90 @@ -0,0 +1,203 @@ +MODULE M7_DATA + +USE PARKIND1, ONLY : JPIM , JPRB + + ! *M7_DATA* contains phyiscal switches and parameters + ! for the ECHAM/HAM aerosol model. + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 12/2002 + ! + +USE TM5M7_DATA, ONLY: nmod + +IMPLICIT NONE + + !--- 0) Submodel ID: + + INTEGER(KIND=JPIM) :: id_ham + + !--- 1) Switches: + + !--- 1.1) Physical: + + !--- Define control variables and pre-set with default values: + + LOGICAL :: lm7 = .TRUE. ! Aerosol dynamics and thermodynamics scheme M7 + + + INTEGER(KIND=JPIM) :: ncdnc = 0, & ! CDNC activation scheme: + ! + ! ncdnc = 0 OFF => standard ECHAM5 + ! + ! = 1 Lohmann et al. (1999) + Lin and Leaitch (1997) + ! = 2 Lohmann et al. (1999) + Abdul-Razzak and Ghan (2000) + ! = 3 Lohmann et al. (1999) + ( Nenes et al. (2003) ) + ! + nicnc = 0, & ! ICNC scheme: + ! + ! ncdnc = 0 OFF + ! = 1 Kaercher and Lohmann (2002) + ! + nauto = 1, & ! Autoconversion scheme: + ! + ! nauto = 1 Beheng (1994) - ECHAM5 Standard + ! = 2 Khairoutdinov and Kogan (2000) + ! + ndust = 2, & ! Dust emission scheme: + ! + ! ndust = 1 Balkanski et al. (2002) + ! = 2 Tegen et al. (2002) + ! +!mo_ham.f90 is used nseasalt = 2, & ! Sea Salt emission scheme: +!mo_ham.f90 is used ! +!mo_ham.f90 is used ! nseasalt = 1 Monahan (1986) +!mo_ham.f90 is used ! = 2 Schulz et al. (2002) +!mo_ham.f90 is used ! + npist = 3, & ! DMS emission scheme: + ! + ! npist = 1 Liss & Merlivat (1986) + ! = 2 Wanninkhof (1992) + ! = 3 Nightingale (2000) + ! + nemiss = 1, & ! Emission inventory + ! + ! nemiss =1 old version + ! nemiss =2 AEROCOM emissions 2000 + ! + nsoa = 2 ! SOA formation scheme: + ! + ! nsoa = 0 POM mass emission into both Aitken modes (standard TM5) + ! 1 POM mass emission + distribution according to volatility assumptions to 5 modes + ! 2 atmospheric formation from precursors + distribution according to volatility assumptions to 5 modes + + LOGICAL :: lodiag = .FALSE. ! Extended diagnostics + + LOGICAL :: laero_rad = .FALSE. ! Radiation calculation + + LOGICAL :: lorad(nmod) = .FALSE. ! switch for each mode + + LOGICAL :: lodiagrad = .FALSE. ! Extended radiation diagnostics + + INTEGER(KIND=JPIM) :: nwv = 0 ! nwv: number of additional wavelengths + ! for the radiation calculations + ! (max currently set to 10) + + REAL(KIND=JPRB) :: cwv(10) = 0. ! cwv: array of additional wavelengths + ! for the radiation calculations [m] + + LOGICAL :: lomassfix = .TRUE. ! Mass fixer in convective scheme + + !--- 1.2) Technical: + +!!$ INTEGER(KIND=JPIM) :: NFILETYPE = GRIB ! Output stream filetypes + + + !--- 2) Parameters: + + !-- 2.1) Number of aerosol compounds: (needs to be harmonized with nmode in mo_aero_m7) + + INTEGER(KIND=JPIM), PARAMETER :: ntype=6 + + !--- 2.2) Mode names: + + CHARACTER(LEN=2), PARAMETER :: cmode(nmod)=(/'NS','KS','AS','CS','KI','AI','CI'/) + + !--- 2.3) Compound names: + + CHARACTER(LEN=3), PARAMETER :: ctype(ntype)=(/'SO4','BC ','OC ','SS ','DU ','WAT'/) + + !--- 2.4) Index field of tracer indices for the aerosol numbers in each mode: + + INTEGER(KIND=JPIM) :: nindex(nmod) + + !--- 2.5) Emissions: + + !--- Carbon Emissions + + +! REAL(KIND=JPRB), PARAMETER :: zbb_wsoc_perc = 0.65, & ! Biom. Burn. Percentage of Water Soluble OC (WSOC) [1] + ! (M.O. Andreae; Talk: Smoke and Climate) + + REAL(KIND=JPRB), PARAMETER :: zbb_wsoc_perc = 0.95, & ! TB: + ! To reduce the AOD over china and outflow region of + ! Africa the water soluble fraction was increasde to 95% + ! in preparation for CMIP6. + ! + ! Some basis for the choice can be found here: + ! e (e.g. Janhall et al., 2010; + ! https://doi.org/10.5194/acp-10-1427-2010 ; Winijkul et al., 2015; + ! https://doi.org/10.1016/j.atmosenv.2015.02.037; Li et al., 2009; + ! https://pubs.acs.org/doi/abs/10.1021/es803330j). + + + zbge_wsoc_perc = 0.65, & ! Assume same Percentage of WSOC for biogenic OC + !>>> TvN + ! The value of 1.4 for the POM to OC mass ratio is an outdated estimate. + ! In the current code we can apply different ratios + ! for emissions from different sources. + ! For further details, see comment in emission_data.F90. + ! The use of a single constant value, on the other hand, + ! would have the advantage that the simulated POM concentrations + ! can easily be converted to OC. + ! An average value of 1.8 seems reasonable. + ! Assuming that there are no substantial contributions from + ! elements other than H and O, a value of 1.8 can be obtained + ! with an H:C atomic ratio of 1.6 and and O:C ratio of 0.5, + ! which are well within the range of oxidation states + ! presented by Heald et al. (GRL, 2010). + ! According to the model of Kuwata et al. (Environ. Sci. Technol., 2012), + ! the resulting particle density would be close to the value + ! assumed in the model (doc = 1.3 g/cm3 in mo_aero_m7.F90). + !zom2oc = 1.4, & ! Mass ratio organic species to organic carbon + ! (Seinfeld and Pandis, 1998, p709; + ! Ferek et al., JGR, 1998) + ! + ! The emission radii for carbonaceous aerosols of the original code below + ! correspond to the values recommended by AeroCom (Dentener et al., ACP, 2006), + ! but adapted to sigma = 1.59 as used in M7 (Stier et al., ACP, 2005). + cmr_ff = 0.03E-6, & ! Fossil fuel emissions: + ! assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Aitken mode for the current setup! + cmr_bb = 0.075E-6, & ! Biomass burning emissions: + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Accumulation mode for the current setup! + cmr_bg = 0.03E-6, &! Biogenic secondary particle formation: + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Aitken mode for the current setup! + cmr_sk = 0.03E-6, &! SO4 primary emission ---> aitken mode + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Aitken mode for the current setup! + cmr_sa = 0.075E-6, &! SO4 primary emission ---> accumulation mode + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Accumulation mode for the current setup! + cmr_sc = 0.75E-6, &! SO4 primary emission ---> coarse mode + ! Assumed number median radius of the emitted + ! particles with the standard deviation given + ! in mo_aero_m7 [m]. Has to lie within the + ! Coarse mode for the current setup! + facso2 = 0.975, &! factor to scale primary SO4 emissions + ! AEROCOM assumption 2.5 % of the SO2 emissions + ! in the from of SO4 + so2ts = 1./1.998 ! conversion factor SO2 to S + + REAL(KIND=JPRB), PUBLIC :: zm2n_bcki_ff, zm2n_bcki_bb, & + zm2n_bcks_bb, zm2n_ocki_ff, & + zm2n_ocki_bb, zm2n_ocki_bg, & + zm2n_ocks_bb, zm2n_ocks_bg, & + zm2n_s4ks_sk, zm2n_s4as_sa, & + zm2n_s4cs_sc + + +END MODULE M7_DATA diff --git a/ifs-source/arpifs/m7/module/mo_activ.F90 b/ifs-source/arpifs/m7/module/mo_activ.F90 new file mode 100644 index 00000000..8abdda47 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_activ.F90 @@ -0,0 +1,727 @@ +MODULE mo_activ + + USE mo_kind, ONLY: dp + +#ifdef HAMMOZ + USE mo_linked_list, ONLY: t_stream + USE mo_submodel_diag, ONLY: vmem3d +#endif + + IMPLICIT NONE + + PUBLIC activ_initialize + PUBLIC activ_updraft +#ifdef HAMMOZ + PUBLIC activ_lin_leaitch + PUBLIC construct_activ_stream +#endif + + PRIVATE + + INTEGER, PUBLIC :: idt_cdnc, idt_icnc, nfrzmod + +#ifdef HAMMOZ + TYPE (t_stream), PUBLIC, POINTER :: activ +#endif + + INTEGER, PUBLIC :: nw ! actual number of updraft velocity (w) bins + ! (can be 1 if characteristic updraft is used) +#ifndef HAMMOZ + TYPE :: vmem3d + REAL(dp), POINTER :: ptr(:,:,:) + END TYPE vmem3d +#endif + +#ifdef HAMMOZ + REAL(dp), PUBLIC, POINTER :: swat(:,:,:) + REAL(dp), PUBLIC, POINTER :: w_cape(:,:) + REAL(dp), PUBLIC, POINTER :: w_sigma(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffl(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffi(:,:,:) + REAL(dp), PUBLIC, POINTER :: w_large(:,:,:) + REAL(dp), PUBLIC, POINTER :: w_turb(:,:,:) +#else + !REAL(dp), PUBLIC, ALLOCATABLE :: reffl(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: reffi(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: w_large(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: w_turb(:,:,:) +#endif + REAL(dp), PUBLIC, POINTER :: na(:,:,:) + REAL(dp), PUBLIC, POINTER :: qnuc(:,:,:) + REAL(dp), PUBLIC, POINTER :: qaut(:,:,:) + REAL(dp), PUBLIC, POINTER :: qacc(:,:,:) + REAL(dp), PUBLIC, POINTER :: qfre(:,:,:) + REAL(dp), PUBLIC, POINTER :: qeva(:,:,:) + REAL(dp), PUBLIC, POINTER :: qmel(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdnc(:,:,:) + REAL(dp), PUBLIC, POINTER :: icnc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: icnc(:,:,:) + REAL(dp), PUBLIC, POINTER :: icnc_instantan(:,:,:) ! Ice crystal number concentration (ICNC), actual instantaneous value [1/m3] + REAL(dp), PUBLIC, POINTER :: lwc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: iwc_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: cloud_time(:,:,:) + REAL(dp), PUBLIC, POINTER :: cliwc_time(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_burden_acc(:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_burden(:,:) + REAL(dp), PUBLIC, POINTER :: icnc_burden_acc(:,:) + REAL(dp), PUBLIC, POINTER :: icnc_burden(:,:) + REAL(dp), PUBLIC, POINTER :: burden_time(:,:) + REAL(dp), PUBLIC, POINTER :: burdic_time(:,:) + REAL(dp), PUBLIC, POINTER :: reffl_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffi_acc(:,:,:) + REAL(dp), PUBLIC, POINTER :: cloud_cover_duplic(:,:,:) + REAL(dp), PUBLIC, POINTER :: sice(:,:,:) + REAL(dp), PUBLIC, POINTER :: reffl_ct(:,:) + REAL(dp), PUBLIC, POINTER :: reffl_time(:,:) + REAL(dp), PUBLIC, POINTER :: cdnc_ct(:,:) + REAL(dp), PUBLIC, POINTER :: reffi_tovs(:,:) + REAL(dp), PUBLIC, POINTER :: reffi_time(:,:) + REAL(dp), PUBLIC, POINTER :: iwp_tovs(:,:) + + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: w(:) + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: w_pdf(:) + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: swat_max_strat(:) + TYPE(vmem3d), PUBLIC, ALLOCATABLE :: swat_max_conv(:) + + REAL(dp) :: w_min = 0.0_dp ! minimum characteristic w for activation [m s-1] + REAL(dp), PARAMETER :: w_sigma_min = 0.1_dp ! minimum value of w standard deviation [m s-1] + + !--- Subroutines: + +CONTAINS + + SUBROUTINE activ_updraft(kproma, kbdim, klev, krow, & + ptkem1, pwcape, pvervel, prho, & + pw, pwpdf ) + + ! *activ_updraft* calculates the updraft vertical velocity + ! as sum of large scale and turbulent velocities + ! + ! Author: + ! ------- + ! Philip Stier, University of Oxford 2008 + ! + ! References: + ! ----------- + ! Lohmann et al., ACP, (2008) + ! + + USE mo_physical_constants, ONLY: grav + !>>SF #345 +#ifdef HAMMOZ + USE mo_cloud_utils, ONLY: fact_tke +#endif + USE mo_param_switches, ONLY: ncd_activ + !<0.0) [m s-1] + REAL(dp), INTENT(out) :: pwpdf(kbdim,klev,nw) ! stratiform updraft velocity PDF + + + REAL(dp), INTENT(in) :: prho(kbdim,klev), & ! air density + ptkem1(kbdim,klev), & ! turbulent kinetic energy + pvervel(kbdim,klev), & ! large scale vertical velocity [Pa s-1] + pwcape(kbdim) ! CAPE contribution to convective vertical velocity [m s-1] +#ifndef HAMMOZ + REAL(dp) :: fact_tke = 0.7_dp !SF #345 +#endif + REAL(dp) :: w_turb(kbdim,klev, 1) ! zkrow =1 + REAL(dp) :: zwlarge(kbdim, klev), & ! large-scale vertical velocity [m s-1] + zwturb(kbdim, klev) ! TKE-derived vertical velocity or st. dev. thereof [m s-1] + + !--- Large scale vertical velocity in SI units: + + zwlarge(1:kproma,:) = -1._dp* pvervel(1:kproma,:)/(grav*prho(1:kproma,:)) + !w_large(1:kproma,:,krow) = zwlarge(1:kproma,:) + + !--- Turbulent vertical velocity: + + w_turb(1:kproma,:,krow) = fact_tke*SQRT(ptkem1(1:kproma,:)) + + !>>SF #345: correction for the TKE prefactor, in case of Lin & Leaitch scheme only + IF (ncd_activ == 1) THEN ! Lin & Leaitch scheme + w_turb(1:kproma,:,krow) = 1.33_dp*SQRT(ptkem1(1:kproma,:)) + ENDIF + !< HK: Lin & Leaitch only to be used with HAMMOZ +#ifdef HAMMOZ + SUBROUTINE activ_lin_leaitch(kproma, kbdim, klev, krow, & + pw, pcdncact ) + + ! *activ_lin_leaitch* calculates the number of activated aerosol + ! particles from the aerosol number concentration + !SF now independent of HAM, since HAM-specific calculation are computed in mo_ham_activ + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 2004 + ! + ! Method: + ! ------- + ! The parameterisation follows the simple empirical relations of + ! Lin and Leaitch (1997). + ! Updraft velocity is parameterized following Lohmann et al. (1999). + ! + + USE mo_kind, ONLY: dp + USE mo_conv, ONLY: na_cv, cdncact_cv + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + + REAL(dp), INTENT(IN) :: pw(kbdim,klev) ! stratiform updraft velocity, large-scale+TKE (>0.0) [m s-1] + REAL(dp), INTENT(out) :: pcdncact(kbdim,klev) ! number of activated particles + + REAL(dp), PARAMETER :: c2=2.3E-10_dp, & ! [m4 s-1] + c3=1.27_dp ! [1] + + INTEGER :: jl, jk + REAL(dp) :: zNmax, zeps + + zeps=EPSILON(1.0_dp) + + pcdncact(:,:) = 0._dp + cdncact_cv(:,:,krow) = 0._dp + + !--- Aerosol activation: + + DO jk=1, klev + DO jl=1, kproma + + !--- Stratiform clouds: + + ! Activation occurs only in occurrence of supersaturation + + !>>SF note: + ! The previous temperature restriction (temp > homogeneous freezing temp) + ! has been removed because it was preventing to diagnose the number of + ! dust and BC particules in soluble modes where temp < hom. freezing. + ! The rationale behind is that diagnosing this allows further + ! devel to implement concurrent homogeneous vs heterogenous freezing processes + ! (which is not yet part of this version, though). + ! + !IMPORTANT: + ! This temperature condition removal is completely transparent for the sanity + ! of the current code, since relevant temperature ranges are now safely checked + ! directly in cloud_cdnc_icnc + !<zeps .AND. na(jl,jk,krow)>zeps) THEN + + !--- Maximum number of activated particles [m-3]: + + zNmax=(na(jl,jk,krow)*pw(jl,jk))/(pw(jl,jk)+c2*na(jl,jk,krow)) + + ! Average number of activated particles [m-3]: + ! zNmax need to be converted to [cm-3] and the + ! result to be converted back to [m-3]. + + pcdncact(jl,jk)=0.1E6_dp*(1.0E-6_dp*zNmax)**c3 + + END IF + + !--- Convective clouds: + + IF(pw(jl,jk)>zeps .AND. na_cv(jl,jk,krow)>zeps) THEN + + zNmax=(na_cv(jl,jk,krow)*pw(jl,jk))/(pw(jl,jk)+c2*na_cv(jl,jk,krow)) + cdncact_cv(jl,jk,krow)=0.1E6_dp*(1.0E-6_dp*zNmax)**c3 + + ENDIF + + END DO + END DO + + END SUBROUTINE activ_lin_leaitch +#endif +!<-- HK + + SUBROUTINE activ_initialize + + USE mo_control, ONLY: nlev, nn +#ifdef HAMMOZ + USE mo_control, ONLY: lcouple + USE mo_exception, ONLY: message, em_param + USE mo_submodel, ONLY: print_value, lham, lhammoz, lccnclim + USE mo_echam_cloud_params, ONLY: ccsaut, ccraut + USE mo_tracer, ONLY: get_tracer + USE mo_param_switches, ONLY: icover, nauto, nic_cirrus +#endif + USE mo_param_switches, ONLY: ncd_activ, nactivpdf, lcdnc_progn, & + cdnc_min_fixed + USE mo_ham, ONLY: nham_subm, HAM_SALSA, HAM_M7 + + CHARACTER(len=24) :: csubmname + + !--- Set number of updraft bins: + + SELECT CASE(ABS(nactivpdf)) + CASE(0) + nw = 1 + CASE(1) + nw = 20 + CASE DEFAULT + nw = ABS(nactivpdf) + END SELECT + +!--> HK: HAMMOZ related variables +#ifdef HAMMOZ + IF (nactivpdf <= 0) THEN + ! These are used either if not using a PDF, or if per-bin + ! diagnostics are requested. + ALLOCATE(w(nw)) + ALLOCATE(w_pdf(nw)) + ALLOCATE(swat_max_strat(nw)) + ALLOCATE(swat_max_conv(nw)) + END IF + + ! + !-- overwrite values for coupled CDNC/ICNC cloud scheme + ! + IF (lcdnc_progn) THEN + IF (nlev == 31) THEN + IF (nn == 63) THEN + SELECT CASE (ncd_activ) + CASE(1) ! LL activtion + !SF: updated on 2015.02.25 (David Neubauer / Katty Huang, pure atm run, HAM-M7, LL activation) + ccsaut = 1200._dp + ccraut = 3.5_dp + CASE(2) !AR&G activation + SELECT CASE(cdnc_min_fixed) + CASE(10) + !SF: updated on 2017.02.14 (David Neubauer, pure atm run, HAM-M7) + ccsaut = 900._dp + ccraut = 2.8_dp + CASE(40) + !SF: updated on 2017.02.14 (David Neubauer, pure atm run, HAM-M7) + ccsaut = 900._dp + ccraut = 10.6_dp + END SELECT + END SELECT + ENDIF + ENDIF + + IF (nlev == 47) THEN + IF (nn == 63) THEN + SELECT CASE (ncd_activ) + CASE(1) ! LL activtion + !SF: updated on 2015.02.19 (David Neubauer, pure atm run, HAM-M7, LL activation) + ccsaut = 800._dp + ccraut = 5._dp + CASE(2) ! AR&G activtion + SELECT CASE(cdnc_min_fixed) + CASE(10) + !SF: updated on 2017.02.14 (David Neubauer, pure atm run, HAM-M7) + IF(nham_subm == HAM_M7) THEN + ccsaut = 900._dp + ccraut = 2.8_dp + END IF + !alaak: updated on 2019.02.xx (pure atm run, HAM-SALSA) + IF(nham_subm == HAM_SALSA) THEN + ccsaut = 1200._dp + ccraut = 4.0_dp + END IF + CASE(40) + !alaak: updated on 2019.02.xx (pure atm run, HAM-SALSA) + IF(nham_subm == HAM_M7) THEN + ccsaut = 900._dp + ccraut = 10.6_dp + END IF + IF(nham_subm == HAM_SALSA) THEN + ccsaut = 900._dp + ccraut = 15_dp + END IF + END SELECT + END SELECT + ENDIF + ENDIF + ENDIF +!#endif +!<-- HK + +!>>SF + !-- Define the cdnc and icnc tracer index to point to the correct tracer: + CALL get_tracer('CDNC',idx=idt_cdnc) + CALL get_tracer('ICNC',idx=idt_icnc) +!< HK: writing out only for HAMMOZ +!#ifdef HAMMOZ + ! + !-- Write out new parameters + ! + IF (ncd_activ>0 .OR. nic_cirrus>0) THEN + + csubmname = 'UNKNOWN' + IF (lham) csubmname = 'HAM' + IF (lhammoz) csubmname = 'HAMMOZ' + IF (lccnclim) csubmname = 'CCNCLIM' + + CALL message('','') + CALL message('','----------------------------------------------------------') + CALL message('activ_initialize','Parameter settings for the ECHAM-'//TRIM(csubmname) & + //' cloud microphysics scheme') + CALL message('','---') + CALL print_value(' ncd_activ = ', ncd_activ) + CALL print_value(' nic_cirrus = ', nic_cirrus) + CALL message('', ' => Parameter adjustments in mo_activ:', level=em_param) + CALL print_value(' ccsaut =', ccsaut) + CALL print_value(' ccraut =', ccraut) + CALL message('','---') + CALL message('','----------------------------------------------------------') + + ENDIF +#endif +!<--HK + + END SUBROUTINE activ_initialize + +!--> HK: Streams to be only used with HAMMOZ +#ifdef HAMMOZ + SUBROUTINE construct_activ_stream + + ! *construct_stream_activ* allocates output streams + ! for the activation schemes + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 2004 + ! + + USE mo_memory_base, ONLY: new_stream, add_stream_element, AUTO, & + default_stream_setting, add_stream_reference + USE mo_filename, ONLY: trac_filetype + USE mo_linked_list, ONLY: HYBRID + USE mo_param_switches, ONLY: ncd_activ, nactivpdf, nic_cirrus !SF + + IMPLICIT NONE + + INTEGER :: jw + CHARACTER(len=10) :: cbin + + + !--- Create new stream: + + CALL new_stream (activ ,'activ',filetype=trac_filetype) + + + !--- Add standard fields for post-processing: + + CALL add_stream_reference (activ, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (activ, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (activ, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (activ, 'gboxarea','geoloc',lpost=.TRUE.) + + CALL default_stream_setting (activ, lpost = .TRUE. , & + lrerun = .TRUE. , & + leveltype = HYBRID , & + table = 199, & + code = AUTO ) + !--- 1) Cloud Properties: + + CALL add_stream_element (activ, 'SWAT', swat, & + longname='ECHAM supersaturation over water', units='% [0-1]' ) + + IF (ncd_activ==2) THEN + + IF (nactivpdf == 0) THEN + CALL add_stream_element (activ, 'SWAT_MAX_STRAT', swat_max_strat(1)%ptr, & + longname='maximum supersaturation stratiform', units='% [0-1]' ) + + CALL add_stream_element (activ, 'SWAT_MAX_CONV', swat_max_conv(1)%ptr, & + longname='maximum supersaturation convective', units='% [0-1]' ) + ELSE IF (nactivpdf < 0) THEN + DO jw=1,nw + WRITE (cbin, "(I2.2)") jw + CALL add_stream_element (activ, 'SWAT_MAX_STRAT_'//TRIM(cbin), swat_max_strat(jw)%ptr, & + longname='maximum supersaturation stratiform, vertical velocity bin '//TRIM(cbin), & + units='% [0-1]' ) + + CALL add_stream_element (activ, 'SWAT_MAX_CONV_'//TRIM(cbin), swat_max_conv(jw)%ptr, & + longname='maximum supersaturation convective, vertical velocity bin '//TRIM(cbin), & + units='% [0-1]' ) + END DO + END IF + ENDIF + + IF (nactivpdf == 0) THEN + CALL add_stream_element (activ, 'W', w(1)%ptr, & + longname='total vertical velocity for activation',units='m s-1') + ELSE IF (nactivpdf < 0) THEN + DO jw=1, nw + WRITE (cbin, "(I2.2)") jw + CALL add_stream_element (activ, 'W_'//TRIM(cbin), w(jw)%ptr, & + longname='Vertical velocity bin '//TRIM(cbin)//' for activation', & + units='m s-1') + + CALL add_stream_element (activ, 'W_PDF_'//TRIM(cbin), w_pdf(jw)%ptr, & + longname='Vertical velocity PDF in bin '//TRIM(cbin)//' for activation', & + units='s m-1') + END DO + END IF + + CALL add_stream_element (activ, 'W_LARGE', w_large, & + longname='large scale vertical velocity', units='m s-1' ) + + IF (nactivpdf == 0) THEN + CALL add_stream_element (activ, 'W_TURB', w_turb, & + longname='turbulent vertical velocity', units='m s-1' ) + ELSE + CALL add_stream_element (activ, 'W_SIGMA', w_sigma, & + longname='sub-grid st. dev. of vertical velocity', units='m s-1' ) + END IF + + CALL add_stream_element (activ, 'W_CAPE', w_cape, & + longname='convective updraft velocity from CAPE', units='m s-1') + + CALL add_stream_element (activ, 'REFFL', reffl, & + longname='cloud drop effectiv radius', units='um' ) + + IF (nic_cirrus>0) THEN + + CALL add_stream_element (activ, 'REFFI', reffi, & + longname='ice crystal effectiv radius', units='um' ) + END IF + + CALL add_stream_element (activ, 'NA', na, & + longname='aerosol number for activation', units='m-3' ) + + CALL default_stream_setting (activ, laccu=.TRUE.) + + CALL add_stream_element (activ, 'QNUC', qnuc, & + longname='CD nucleation rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QAUT', qaut, & + longname='CD autoconversion rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QACC', qacc, & + longname='CD accretion rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QFRE', qfre, & + longname='CD freezing rate', units='m-3 s-1' ) + !>>dod deleted QEVA, not used anywhere + ! CALL add_stream_element (activ, 'QEVA', qeva, & + ! longname='CD evaporation rate', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'QMEL', qmel, & + longname='CD source rate from melting ice', units='m-3 s-1' ) + + CALL add_stream_element (activ, 'CDNC_ACC', cdnc_acc, & + longname='CDNC occurence acc.+ cloud weighted',units='m-3' ) + + CALL add_stream_element (activ, 'CDNC', cdnc, & + longname='CDNC',units='m-3' ) + + CALL add_stream_element (activ, 'CDNC_BURDEN_ACC',cdnc_burden_acc, & + longname='CDNC burden occurence accumulated', units='m-2' ) + + CALL add_stream_element (activ, 'CDNC_BURDEN',cdnc_burden, & + longname='CDNC burden', units='m-2' ) + + CALL add_stream_element (activ, 'BURDEN_TIME',burden_time, & + longname='acc. cdnc burden occ.time fraction', units='1' ) + + CALL add_stream_element (activ, 'LWC_ACC', lwc_acc, & + longname='liq wat cont acc.+ cloud weighted', units='kg m-3' ) + + CALL add_stream_element (activ, 'CLOUD_TIME', cloud_time, & + longname='acc. cloud occurence time fraction', units='1' ) + + CALL add_stream_element (activ, 'REFFL_ACC', reffl_acc, & + longname='cloud drop effectiv radius weighted',units='um' ) + + CALL add_stream_element (activ, 'REFFL_CT', reffl_ct, & + longname='cloud top effectiv radius weighted',units='um' ) + + CALL add_stream_element (activ, 'REFFL_TIME', reffl_time, & + longname='cloud top effectiv radius occ.time',units='1' ) + + CALL add_stream_element (activ, 'CDNC_CT', cdnc_ct, & + longname='cloud top cloud droplet number conc.',units='cm-3' ) + + CALL add_stream_element (activ, 'IWC_ACC', iwc_acc, & + longname='ice wat cont acc.+ cloud weighted', units='kg m-3' ) + + CALL add_stream_element (activ, 'CLIWC_TIME', cliwc_time, & + longname='acc. cloud occurence time fraction', units='1' ) + + CALL default_stream_setting (activ, laccu=.FALSE., lpost=.FALSE.) + + CALL add_stream_element (activ, 'CLOUD_COVER_DUPLIC', cloud_cover_duplic, & + longname='cloud cover duplicate for record at t+1', units='1' ) + + + IF (nic_cirrus>0) THEN + + CALL add_stream_element (activ, 'ICNC_instantaneous', icnc_instantan, & + longname='ICNC instantaneous', units='m-3', & + laccu=.FALSE., lpost=.TRUE., lrerun=.TRUE.) + + CALL default_stream_setting (activ, laccu=.TRUE., lpost=.TRUE.) + + CALL add_stream_element (activ, 'ICNC_ACC', icnc_acc, & + longname='ICNC occurence acc.+ cloud weighted',units='m-3' ) + + CALL add_stream_element (activ, 'ICNC', icnc, & + longname='ICNC',units='m-3' ) + + CALL add_stream_element (activ, 'ICNC_BURDEN_ACC',icnc_burden_acc, & + longname='ICNC burden occurence accumulated', units='m-2' ) + + CALL add_stream_element (activ, 'ICNC_BURDEN',icnc_burden, & + longname='ICNC burden', units='m-2' ) + + CALL add_stream_element (activ, 'BURDIC_TIME',burdic_time, & + longname='acc. icnc burden occ.time fraction', units='1' ) + + CALL add_stream_element (activ, 'REFFI_ACC', reffi_acc, & + longname='ice crystal effectiv radius weighted',units='um' ) + + CALL add_stream_element (activ, 'REFFI_TOVS', reffi_tovs, & + longname='semi-transparent cirrus effectiv radius',units='um' ) + + CALL add_stream_element (activ, 'REFFI_TIME', reffi_time, & + longname='accumulted semi-transp. cirrus time',units='1' ) + + CALL add_stream_element (activ, 'IWP_TOVS', iwp_tovs, & + longname='IWP sampled a la TOVS',units='kg m-2' ) + + CALL default_stream_setting (activ, laccu=.FALSE.) + + CALL add_stream_element (activ, 'SICE', sice, & + longname='ECHAM supersaturation over ice', units='% [0-1]' ) + + END IF + + CALL default_stream_setting (activ, laccu=.FALSE.) + +END SUBROUTINE construct_activ_stream +#endif +!<-- HK + +END MODULE mo_activ diff --git a/ifs-source/arpifs/m7/module/mo_advection.F90 b/ifs-source/arpifs/m7/module/mo_advection.F90 new file mode 100644 index 00000000..7f4a2f83 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_advection.F90 @@ -0,0 +1,11 @@ +MODULE mo_advection + + IMPLICIT NONE + + PUBLIC + + INTEGER, PARAMETER :: no_advection = 0 + INTEGER :: iadvec + INTEGER :: tpcore + +END MODULE mo_advection diff --git a/ifs-source/arpifs/m7/module/mo_control.F90 b/ifs-source/arpifs/m7/module/mo_control.F90 new file mode 100644 index 00000000..f639992d --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_control.F90 @@ -0,0 +1,22 @@ +MODULE mo_control + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + SAVE + + INTEGER :: nn ! max meridional wave number for m=0. + INTEGER :: ngl ! number of gaussian latitudes. + INTEGER :: nlon ! max number of points on each latitude line. + INTEGER :: nlev ! number of vertical levels. + INTEGER :: nmp1 ! max zonal wave number + 1. + INTEGER :: nlevp1 ! *nlev+1. + INTEGER :: nsp ! number of spectral coefficients. + INTEGER :: nhgl ! (number of gaussian latitudes)/2. + INTEGER :: nvclev ! number of levels with vertical coefficients. + LOGICAL :: lrce = .FALSE. + LOGICAL :: ltimer = .FALSE. ! to use timer + LOGICAL :: ldebugio = .FALSE. ! to debug IO + +END MODULE mo_control diff --git a/ifs-source/arpifs/m7/module/mo_conv.F90 b/ifs-source/arpifs/m7/module/mo_conv.F90 new file mode 100644 index 00000000..869f7adb --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_conv.F90 @@ -0,0 +1,77 @@ +MODULE mo_conv + + ! U. Lohmann, ETHZ, 2007-01-24, additional cloud output + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_linked_list, ONLY: t_stream +#endif + IMPLICIT NONE + + PRIVATE +#ifdef HAMMOZ + PUBLIC :: construct_stream_conv + + TYPE (t_stream), PUBLIC, POINTER :: conv +#endif + REAL(dp), PUBLIC, POINTER :: na_cv(:,:,:) + REAL(dp), PUBLIC, POINTER :: cdncact_cv(:,:,:) + REAL(dp), PUBLIC, POINTER :: twc_conv(:,:,:) + REAL(dp), PUBLIC, POINTER :: conv_time(:,:,:) + +CONTAINS +#ifdef HAMMOZ + SUBROUTINE construct_stream_conv + + ! construct_stream_conv: allocates output streams + ! for the activation schemes + ! + ! Author: + ! ------- + ! Philip Stier, 2004 + ! + + USE mo_memory_base, ONLY: new_stream, add_stream_element, AUTO, & + default_stream_setting, add_stream_reference + USE mo_linked_list, ONLY: HYBRID + USE mo_filename, ONLY: out_filetype + + IMPLICIT NONE + + !--- Create new stream: + + CALL new_stream (conv ,'conv', filetype=out_filetype) + + ! add standard fields for post-processing: + + CALL add_stream_reference (conv, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (conv, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (conv, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (conv, 'gboxarea','geoloc',lpost=.TRUE.) + + CALL default_stream_setting (conv, & + lpost = .TRUE. , & + laccu = .TRUE. , & !>>dod<< + lrerun = .TRUE. , & + leveltype = HYBRID , & + table = 199, & + code = AUTO ) + + ! cloud Properties: + + CALL add_stream_element (conv, 'TWC_CONV', twc_conv, & + longname='LWC+IWC from detr.+ cloud weighted', units='kg m-3') + + CALL add_stream_element (conv, 'CONV_TIME', conv_time, & + longname='acc. cloud occ. conv time fraction', units='1' ) + + CALL add_stream_element (conv, 'CDNCACT_CV', cdncact_cv, lpost=.false., laccu=.false., & + longname='activated CDNC in conv', units='m-3' ) + + CALL add_stream_element (conv, 'NA_CV', na_cv, lpost=.false., laccu=.false., & + longname='aerosols for nucleation in conv', units='m-3' ) + + END SUBROUTINE construct_stream_conv +#endif +END MODULE mo_conv + diff --git a/ifs-source/arpifs/m7/module/mo_exception.F90 b/ifs-source/arpifs/m7/module/mo_exception.F90 new file mode 100644 index 00000000..afb698d7 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_exception.F90 @@ -0,0 +1,77 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_exception.F90 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + + +MODULE mo_exception + + USE mo_io_units, ONLY: nerr, nlog + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: message_text + PUBLIC :: message, finish + PUBLIC :: em_none, em_info, em_warn, em_error, em_param, em_debug + + INTEGER, PARAMETER :: em_none = 0 ! normal message + INTEGER, PARAMETER :: em_info = 1 ! informational message + INTEGER, PARAMETER :: em_warn = 2 ! warning message: number of warnings counted + INTEGER, PARAMETER :: em_error = 3 ! error message: number of errors counted + INTEGER, PARAMETER :: em_param = 4 ! report parameter value + INTEGER, PARAMETER :: em_debug = 5 ! debugging message + + CHARACTER(len=256) :: message_text = '' !++mgs + + LOGICAL :: l_log = .FALSE. + + INTEGER :: number_of_warnings = 0 + INTEGER :: number_of_errors = 0 + +#include "abor1.intfb.h" + +CONTAINS + + SUBROUTINE finish (name, text, exit_no) + + CHARACTER(len=*), INTENT(in) :: name + CHARACTER(len=*), INTENT(in), OPTIONAL :: text + INTEGER, INTENT(in), OPTIONAL :: exit_no + + INTEGER :: iexit + + CALL ABOR1(text) + + END SUBROUTINE finish + + SUBROUTINE message (name, text, out, level, all_print, adjust_right) + + CHARACTER (len=*), INTENT(in) :: name + CHARACTER (len=*), INTENT(in) :: text + INTEGER, INTENT(in), OPTIONAL :: out + INTEGER, INTENT(in), OPTIONAL :: level + LOGICAL, INTENT(in), OPTIONAL :: all_print + LOGICAL, INTENT(in), OPTIONAL :: adjust_right + + INTEGER :: iout + INTEGER :: ilevel + LOGICAL :: lprint + LOGICAL :: ladjustr !++mgs renamed from ladjust to ladjustr + + CHARACTER(len=32) :: prefix + + CHARACTER(len=LEN(message_text)) :: write_text + + WRITE(nlog,*) name, text + + END SUBROUTINE message + +END MODULE mo_exception diff --git a/ifs-source/arpifs/m7/module/mo_filename.F90 b/ifs-source/arpifs/m7/module/mo_filename.F90 new file mode 100644 index 00000000..6dcb6246 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_filename.F90 @@ -0,0 +1,40 @@ +MODULE mo_filename + ! ----------------------------------------------------------------- + ! + ! module *mo_filename* - quantities needed for file names etc. + ! + ! ----------------------------------------------------------------- + ! + ! L. Kornblueh, MPI, April 1998, added NWP forecast mode + ! I. Kirchner, MPI, April 2001, revision + ! A. Rhodin, MPI, June 2001, adapted to stream interface + IMPLICIT NONE + PRIVATE + PUBLIC :: find_next_free_unit +CONTAINS +!------------------------------------------------------------------------------ + FUNCTION find_next_free_unit(istart,istop) RESULT(unit) + INTEGER :: istart, istop, unit + LOGICAL :: found, opened + INTEGER :: i + found = .FALSE. + DO i=istart,istop + INQUIRE(unit=i,opened=opened) + IF (.NOT.opened) THEN + unit = i + found = .TRUE. + EXIT + END IF + END DO + IF (.NOT. found) THEN +!gf +! WRITE(message_text,'(a,i2.2,a,i2.2,a)') & +! 'No unit in range <',istart,':',istop,'> free.' +! CALL finish('find_next_free_unit',message_text) + WRITE(*,'(a,i2.2,a,i2.2,a)') 'No unit in range <',istart,':',istop,'> free.' + STOP +!gf + END IF + END FUNCTION find_next_free_unit +!------------------------------------------------------------------------------ +END MODULE mo_filename diff --git a/ifs-source/arpifs/m7/module/mo_ham.F90 b/ifs-source/arpifs/m7/module/mo_ham.F90 new file mode 100644 index 00000000..77165bdc --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham.F90 @@ -0,0 +1,876 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham.f90 +!! +!! \brief +!! mo_ham contains physical switches and other control parameters for +!! ECHAM aerosol models (particularly HAM). +!! +!! \author P. Stier (MPI-Met) +!! +!! \responsible_coder +!! Martin Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original version - (2002-12-xx) +!! -# K. Zhang (MPI-Met) - changes for ECHAM6 - (2009-08-11) +!! -# M. Schultz (FZ Juelich) - cleanup (2009-09-23) +!! -# H. Kokkola (FMI) - definition of aerocomp (former mo_ham mode) (2011-12-12) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham + + ! *mo_ham* contains physical switches and parameters + ! for the ECHAM-HAM aerosol model. + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 12/2002 + ! + + USE mo_kind, ONLY: dp + USE mo_species, ONLY: t_species, nmaxspec +#ifdef HAMMOZ + USE mo_external_field_processor, ONLY: EF_FILE, EF_MODULE !SF #244 +#endif + +!#ifdef _OPENMP +! use omp_lib +!#endif + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: new_aerocomp ! create aerosol component + PUBLIC :: setham !TB initialise ham +#ifdef HAMMOZ + PUBLIC :: print_aerocomp_info +#endif + PUBLIC :: nham_subm ! choice for aerosol microphysics submodel + PUBLIC :: naeroclass, naerosol ! arrays of possible number of classes (resp. soluble classes) + PUBLIC :: nclass ! number of classes in current model + PUBLIC :: nsol ! number of soluble classes in current model + PUBLIC :: naerocomp, naerorad, nraddiag, nrad, nradmix, nseasalt, nmaxclass + PUBLIC :: HAM_BULK, HAM_M7, HAM_SALSA + PUBLIC :: npist, laerocom_diag, ndrydep, nwetdep, lomassfix + PUBLIC :: ndust !SF #479 + PUBLIC :: burden_keytype + PUBLIC :: mw_s, mw_so2, mw_so4, mw_dms, mw_oc + PUBLIC :: lhetfreeze +#ifdef HAMMOZ + PUBLIC :: nlai_drydep_ef_type !gf #244 +#endif + PUBLIC :: lscond ! Condensation of H2SO4 + PUBLIC :: lscoag ! Coagulation + PUBLIC :: lgcr ! galactic cosmic ray ionization + PUBLIC :: nsolact ! solar activity parameter + PUBLIC :: lmass_diag ! Mass diagnostics switch + PUBLIC :: nccndiag ! (C)CN diagnostics at fixed supersaturations + PUBLIC :: ibc_dust, ibc_seasalt, idsec_dust, idsec_biogenic !alaak moved from mo_ham_m7/salsa_emissions + PUBLIC :: sigma_fine, sigma_coarse !SF #320 + + INTEGER, PARAMETER :: nmaxclass = 20 ! maximum number of aerosol modes or bins + ! flags for aerosol microphysics scheme + INTEGER, PARAMETER :: HAM_BULK = 1 + INTEGER, PARAMETER :: HAM_M7 = 2 + INTEGER, PARAMETER :: HAM_SALSA = 3 + + !--- derived types + TYPE, PUBLIC :: t_aeroclass + INTEGER :: iclass ! Aerosol mode or bin number + TYPE(t_species), POINTER :: species ! Aerosol species + INTEGER :: spid ! Index in species list + INTEGER :: aero_idx ! Index to aerosol species list + INTEGER :: tracer_type ! Tracer type (none/diagnostic/prognostic) + INTEGER :: idt ! Tracer identity + END TYPE t_aeroclass + + TYPE, PUBLIC :: t_sizeclass + CHARACTER (LEN=32) :: classname ! Long mode name, e.g. "nucleation soluble" + CHARACTER (LEN=4) :: shortname ! Short mode name, e.g. "NS" + INTEGER :: self ! =mode index, for quick comparisons, etc + LOGICAL :: lsoluble ! Mode soluble (T/F) + LOGICAL :: lactivation ! Mode can activate to cloud droplets !dod #377 + LOGICAL :: lsed ! Sedimentation for this mode (T/F) + LOGICAL :: lsoainclass ! Secondary organics occur in this mode (T/F) + INTEGER :: idt_no ! Tracer identity for aerosol number + END TYPE t_sizeclass ! sigma, sigmaln and the conversion factors are + ! kept separate to avoid too many impacts on + ! other modules and subroutines + INTEGER, SAVE :: nclass=7 ! number of aerosol modes or size bins (e.g. 7 for M7) + INTEGER, SAVE :: nsol=4 ! number of aerosol modes or size bins (e.g. 4 for M7) + INTEGER :: naerocomp ! number of aerocomps defined (see mo_ham_init) + + TYPE(t_sizeclass), TARGET, PUBLIC :: sizeclass(nmaxclass) + !--- aerocomp: linear list of class*species + + TYPE(t_aeroclass), PUBLIC, ALLOCATABLE :: aerocomp(:) + TYPE(t_aeroclass), PUBLIC, ALLOCATABLE :: aerowater(:) + + INTEGER, PUBLIC :: subm_ngasspec = 0 + INTEGER, PUBLIC :: subm_naerospec = 0 + INTEGER, PUBLIC :: subm_gasspec(nmaxspec) ! gas species indices for microphysical processes + INTEGER, PUBLIC :: subm_aerospec(nmaxspec) ! aero species indices for microphysical processes + !>>SF for convenience: special mapping for all but water aero species + INTEGER, PUBLIC :: subm_naerospec_nowat = 0 + INTEGER, PUBLIC :: subm_aerospec_nowat(nmaxspec) ! all but water aero species indices for microphysical processes + !<>gf #244 + INTEGER :: nlai_drydep_ef_type = EF_MODULE ! Choice of lai external field type in the drydep scheme + ! = EF_FILE (2) from external input file + ! = EF_MODULE (3) online from jsbach + !<>dod deleted <>dod deleted iwritetrac <>dod deleted. + + !>>SF #320: these are std's for fine and coarse modes. This is placed here and not in M7-only code, + ! because it's needed outside of M7-specific code (see radiation, sea salt emisions...) + REAL(dp), PARAMETER :: sigma_fine = 1.59_dp ! std for fine modes + REAL(dp), PARAMETER :: sigma_coarse = 2._dp ! std for coarse modes + !< +!! setham modifies pre-set switches of the hamctl namelist for the +!! configuration of the ECHAM/HAM aerosol model +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! init_ham +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE setham + + ! *setham* modifies pre-set switches of the hamctl + ! namelist for the configuration of the + ! ECHAM/HAM aerosol model + ! + ! Authors: + ! -------- + ! Philip Stier, MPI-MET 12/2002 + ! Martin Schultz, FZ Juelich, Oct 2009, added nmod parameter + ! +#ifdef HAMMOZ + USE mo_mpi, ONLY: p_parallel, p_parallel_io, p_bcast, p_io + USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED, MISSING + USE mo_control, ONLY: nn, nlev + USE mo_boundary_condition, ONLY: bc_nml, bc_define, p_bcast_bc, & + BC_REPLACE, BC_EVERYWHERE + ! other available options (bc_domain=BC_EVERYWHERE): BC_ALTITUDE, BC_PRESSURE, BC_LEVEL, BC_TOP, BC_BOTTOM + ! (bc_mode=BC_REPLACE): BC_SPECIAL, BC_RELAX, BC_ADD + USE mo_external_field_processor, ONLY: EF_FILE, & + EF_3D, EF_IGNOREYEAR, EF_NOINTER +#endif + USE mo_radiation_parameters,ONLY: iaero !SF obsolete to remove , l_srtm, l_lrtm + USE mo_util_string, ONLY: separator + USE mo_exception, ONLY: finish, message, message_text, em_info, em_error, em_param, & + em_info, em_warn +#ifdef HAMMOZ + USE mo_submodel, ONLY: print_value + USE mo_submodel_diag, ONLY: OFF, ON, BYTRACER, BYSPECIES + USE mo_param_switches, ONLY: nic_cirrus +#endif + USE mo_param_switches, ONLY: ncd_activ + + ! other available options: EF_CONSTANT, EF_TIMERESOLVED, EF_LATLEV, EF_LONLAT, EF_UNDEFINED + USE mo_submodel, ONLY: lham +#ifdef HAMMOZ + USE mo_submodel, ONLY: lhammoz +#endif + USE mo_physical_constants, ONLY: amd + + IMPLICIT NONE +#ifdef HAMMOZ + TYPE(bc_nml) :: bc_oh, bc_o3, bc_h2o2, bc_no2, & ! tracer boundary conditions/input specs + bc_no3 ! SOA oxidant + + INCLUDE 'hamctl.inc' +#endif +! INTEGER :: nclass ! number of modes/bins + + !--- Local variables + + CHARACTER(len=24) :: csubmname ! name of aerosol sub model + INTEGER :: jj, ierr, inml, iunit + + + !--- 0) Set defaults + ibc_oh = 0 + ibc_o3 = 0 + ibc_h2o2 = 0 + ibc_no2 = 0 + ibc_no3 = 0 +#ifdef HAMMOZ + + burden_keytype = BYSPECIES + + !--- Set defaults for tracer boundary conditions + ! If lhammoz is active, default is to use tracer fields from gas-phase chemistry module + ! else the fields are read from file + ! define entries for first tracer, then copy + ! explanation: %bc_... = how to apply + ! %ef_... = how to get values + bc_oh%bc_domain = BC_EVERYWHERE + bc_oh%bc_mode = BC_REPLACE + bc_oh%ef_type = EF_FILE + bc_oh%ef_template = 'ham_oxidants_monthly.nc' + bc_oh%ef_varname = 'OH_VMR_avrg' + bc_oh%ef_geometry = EF_3D + bc_oh%ef_timedef = EF_IGNOREYEAR + !! additional options (just for illustration) - see mo_boundary_condition + !! bc_oh%ef_timeoffset = 0._dp + !! bc_oh%ef_timeindex = 1 + !! bc_oh%ef_value = 0._dp + bc_oh%ef_factor = 17._dp/amd ! convert from VMR to MMR + bc_oh%ef_interpolate = EF_NOINTER ! none + bc_oh%ef_actual_unit = 'VMR' + + bc_o3 = bc_oh + bc_o3%ef_varname = 'O3_VMR_avrg' + bc_o3%ef_factor = 48._dp/amd ! convert from VMR to MMR + bc_h2o2 = bc_oh + bc_h2o2%ef_varname = 'H2O2_VMR_avrg' + bc_h2o2%ef_factor = 34._dp/amd ! convert from VMR to MMR + bc_no2 = bc_oh + bc_no2%ef_varname = 'NO2_VMR_avrg' + bc_no2%ef_factor = 46._dp/amd ! convert from VMR to MMR + bc_no3 = bc_oh + bc_no3%ef_varname = 'NO3_VMR_avrg' + bc_no3%ef_factor = 62._dp/amd ! convert from VMR to MMR +#endif + nrad(1) = 0 + nrad(2:nmaxclass) = 3 + nradmix(:) = 1 + + subm_gasspec(:) = 0 + subm_aerospec(:) = 0 + subm_aero_idx(:) = 0 +#ifdef HAMMOZ + !--- 1) Read namelist: + + CALL message('',separator) + CALL message('setham', 'Reading namelist hamctl...', level=em_info) + + IF (p_parallel_io) THEN + inml = open_nml('namelist.echam') + iunit = position_nml ('HAMCTL', inml, status=ierr) + SELECT CASE (ierr) + CASE (POSITIONED) + READ (iunit, hamctl) + CASE (MISSING) + WRITE(message_text,'(a,i0,a)') 'Namelist HAMCTL not found. Will use default values' + CALL message('setham', message_text, level=em_warn) + CASE DEFAULT ! LENGTH_ERROR or READ_ERROR + WRITE(message_text,'(a,i0)') 'Namelist HAMCTL not correctly read! ierr = ', ierr + CALL finish('setham', message_text) + END SELECT + ENDIF + + !--- 2) Broadcast over processors: + IF (p_parallel) THEN + CALL p_bcast (nham_subm, p_io) + CALL p_bcast (nseasalt, p_io) + CALL p_bcast (npist, p_io) + CALL p_bcast (naerorad, p_io) + CALL p_bcast (ndrydep, p_io) + CALL p_bcast (nwetdep, p_io) + CALL p_bcast (ndust, p_io) !SF #479 + CALL p_bcast (laerocom_diag, p_io) + CALL p_bcast (nrad, p_io) + CALL p_bcast (nradmix, p_io) + CALL p_bcast (nraddiag, p_io) + CALL p_bcast (lomassfix, p_io) + CALL p_bcast (nsoa, p_io) + CALL p_bcast (nsoalumping, p_io) + CALL p_bcast (lhetfreeze, p_io) + CALL p_bcast (burden_keytype,p_io) + CALL p_bcast_bc (bc_oh, p_io) + CALL p_bcast_bc (bc_o3, p_io) + CALL p_bcast_bc (bc_h2o2, p_io) + CALL p_bcast_bc (bc_no2, p_io) + CALL p_bcast_bc (bc_no3, p_io) + CALL p_bcast(nlai_drydep_ef_type, p_io) !gf #244 + CALL p_bcast (lscond, p_io) + CALL p_bcast (lscoag, p_io) + CALL p_bcast (lgcr, p_io) + CALL p_bcast (nsolact, p_io) + CALL p_bcast (lmass_diag, p_io) + CALL p_bcast (nccndiag, p_io) + + END IF +#endif + !--------------------------------------------------------------------------------------------------- + !--- 3) Consistency and dependency checks: + +!### normally this test for lham is not necessary, but perhaps needed when we support additional modules + IF (lham) THEN + +#ifdef HAMMOZ + !--- consistency check for microphysics scheme + IF (nham_subm < 1 .OR. nham_subm > 3) THEN + WRITE(message_text,'(a,i0)') 'Illegal option for aerosol microphysics scheme nham_subm = ', & + nham_subm + CALL message('setham',message_text, level=em_error) + END IF + + IF (nham_subm == 1) THEN + WRITE(message_text,'(a,i0,a)') 'Bulk microphysics nham_subm = ',nham_subm,'has not been implemented' + CALL message('setham',message_text, level=em_error) + END IF + + IF (nham_subm == HAM_SALSA) THEN + IF (nwetdep > 1 .AND. ncd_activ /= 2) THEN !! -->eehol: included SALSA wetdeposition scheme + WRITE(message_text,'(a,i0)') & + 'SALSA microphysics wet deposition option nwetdep = ', nwetdep, 'only works with ncd_activ = 2' + CALL message('setham',message_text, level=em_error) + END IF + + IF (nccndiag > 0) THEN + WRITE(message_text,'(a,i0)') & + 'SALSA microphysics does not support detailed CCN diagnostics nccndiag = ', nccndiag + CALL message('setham',message_text, level=em_error) + END IF + + ENDIF + +!>>SF #299 + !--- Check authorized values for burden_keytype + SELECT CASE(burden_keytype) + CASE(OFF,BYTRACER,BYSPECIES) + CONTINUE + CASE default + WRITE(message_text,'(a,i0,a,i0,a,i0,a,i0)') 'invalid value for burden_keytype: ',& + burden_keytype,'. Authorized values: ',OFF,' ',BYTRACER,' ',BYSPECIES + CALL finish('setham',message_text) + END SELECT +!<>SF #479 + !--- Check authorized values for ndust + IF (ndust < 2 .OR. ndust > 5) THEN + WRITE(message_text,'(a,i0)') 'Illegal option for the parameter set of the BGC dust scheme ndust = ', & + ndust + CALL message('setham',message_text, level=em_error) + ENDIF +!<>gf #244 + !--- consistency check for lai in the drydep scheme !SF + user information + SELECT CASE(nlai_drydep_ef_type) + CASE(EF_FILE) + WRITE(message_text,'(a)') 'Leaf area index read from file' + CASE(EF_MODULE) + WRITE(message_text,'(a)') 'Leaf area index from JSBACH' + CASE default + WRITE(message_text,'(a,i0,2a,2(i0,a))') 'nlai_drydep_ef_type = ',nlai_drydep_ef_type, & + ' --> this is not currently supported.', & + ' Only ',EF_FILE,' (from file) or ',EF_MODULE, & + ' (from another module) external field types are possible!' + CALL finish('setham',message_text) + END SELECT + WRITE(message_text,'(a,a)') TRIM(message_text),' for usage by the drydep scheme.' + CALL message('setham',message_text,level=em_info) +#endif +!< nmaxclass) CALL finish('setham', 'Maximum number of aerosol modes/bins exceeded!') + + !--- consistency checks for radiation + IF(naerorad>0) THEN + IF (ANY(nrad(:)>3) .OR. ANY(nrad(:)<0) ) THEN + CALL message('setham','nrad>3 or nrad<0 not supported', level=em_warn) + CALL message('', 'Will reset all nrad and nradmix values to default values!', level=em_info) + nrad(1) = 0 + nrad(2:nclass) = 1 + nradmix(1:nclass) = 1 + END IF + IF (iaero/=iaeroham .AND. ANY(nrad(:)>0) .AND. naerorad/=2) THEN + CALL message('setham','inconsistent setting of iaero, nrad and naerorad', level=em_warn) + CALL message('', 'Will run ECHAM with selected iaero and switch HAM radiation to diagnostic mode', level=em_info) + naerorad = 2 + END IF + IF (iaero==iaeroham .AND. .NOT. ANY(nrad(:)>0)) THEN + CALL message('setham','HAM radiation requested but all nrad set to zero.', level=em_warn) + CALL message('', 'Will reset all nrad and nradmix values to default values!', level=em_info) + nrad(1) = 0 + nrad(2:nclass) = 1 + nradmix(1:nclass) = 1 + ENDIF + + END IF + + !--- consistency checks for SOA scheme choices + IF ((nham_subm .NE. HAM_SALSA) .AND. nsoa == 2) THEN + + CALL message('setham','nsoa = 2 currently only supported with SALSA (nham_subm = 3)', & + level=em_error) + + ENDIF + +!>>SF override the following check with -DWITH_LHET in your Makefile +! note: lhet-dependent code has not be fully tested yet +! (implemented here to avoid losing existing code in earlier versions) +#ifndef WITH_LHET + IF (lhetfreeze) CALL message('setham','lhetfreeze=.TRUE. is not currently supported', level=em_error) +#endif +!< Monahan (1986)',level=em_param) + CASE (2) + CALL message('',' -> Schulz et al. (2002)',level=em_param) + !>>dod (redmine #44) + CASE (4) + CALL message('',' -> Monahan (1986), bin scheme',level=em_param) + CASE (5) + CALL message('',' -> Guelle et al. (2001)',level=em_param) + CASE (6) + CALL message('',' -> Gong et al. (2003)',level=em_param) + CASE (7) + CALL message('',' -> Long et al.(2011)',level=em_param) + CASE (8) + CALL message('',' -> Gong et al.(2003)+T-dep.',level=em_param) + !< Liss & Merlivat (1986)',level=em_param) + CASE (2) + CALL message('',' -> Wanninkhof (1992)',level=em_param) + CASE (3) + CALL message('',' -> Nightingale (2000)',level=em_param) + CASE DEFAULT + WRITE (message_text,'(a,i0,a)') ' npist = ',npist,' not supported.' + CALL message('setham',message_text, level=em_error) + END SELECT + + CALL message('','---') + CALL print_value(' Aerosol diagnostics (laerocom_diag) = ', laerocom_diag) +!! ### is there a check that any(nrad > 0) if naerorad=true ??? + CALL print_value('Aerosol feedback with radiation (naerorad) = ', naerorad) + IF (naerorad>0) THEN + !WRITE (message_text,'(a,i3)') ' nrad = ', nrad !### hardcoded 25 + !CALL message ('', message_text, level=em_param) + CALL message ('', ' mode/bin SW LW nradmix', level=em_param) + DO jj=1, nclass + IF (nrad(jj)==0) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'F', 'F', nradmix(jj) + ELSE IF (nrad(jj)==1) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'T', 'F', nradmix(jj) + ELSE IF (nrad(jj)==2) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'F', 'T', nradmix(jj) + ELSE IF (nrad(jj)==3) THEN + WRITE (message_text,'(i0,t12,a1,t17,a1,t21,i0)') jj, 'T', 'T', nradmix(jj) + END IF + CALL message ('', message_text, level=em_param) + IF (nrad(jj) > 3 .OR. nradmix(jj) > 3) THEN + WRITE (message_text,'(a,i0,a,i0,a,i0)') 'Invalid nrad or nradmix: jbin=',jj,' nrad(jbin)=', & + nrad(jj),' nradmix(jbin)=',nradmix(jj) + CALL message('setham',message_text, level=em_error) + END IF + END DO + CALL message('','Refractive index mixing rule (nradmix):', level=em_param) + CALL message('',' 0 = ---, 1 = volume weighted, 2 = Maxwell-Garnett, 3 = Bruggeman', & + level=em_param) + + CALL message('','---') + + SELECT CASE(nraddiag) + CASE (0) + CALL message ('','No extended radiation diagnostics (nraddiag=0).',level=em_param) + CASE (1) + CALL message ('','Extended radiation diagnostics 2D (nraddiag=1).',level=em_param) + CASE (2) + CALL message ('','Extended radiation diagnostics 2D and 3D (nraddiag=2).',level=em_param) + CASE DEFAULT + WRITE (message_text,'(a,i0)') 'Invalid value for nraddiag: ', nraddiag + CALL message ('setham', message_text, level=em_error) + END SELECT + + ELSE ! naerorad==0 + CALL message('setham','Aerosol radiation interactions deactivated!', level=em_warn) + END IF + + CALL message('','---') + CALL print_value (' Mass fixer in convection : ', lomassfix) + + CALL message('','---') + CALL message('', separator) + + !>>dod ndrydep = 1 is not tested. Override this check (at your own risk) with -DDRYDEP1 in your Makefile +#ifndef DRYDEP1 + IF (ndrydep == 1) THEN + CALL message('', 'ndrydep = 1 in namelist hamctl: this value is not tested!') + CALL message('', 'to proceed with ndrydep=1 set flag -DDRYDEP1 in the fortran 90 flags in your Makefile and re-compile') + CALL message('', 'then run the model again at your own risk') + CALL message('', 'else select another value for ndrydep') + CALL finish('setham', 'unsupported namelist value ndrydep=1') + END IF +#endif + !< OFF',level=em_param) + CASE (1) + CALL message('','-> 2D CCN diagnostics',level=em_param) + CASE (2) + CALL message('','-> 3D CCN diagnostics',level=em_param) + CASE (3) + CALL message('','-> 2D CCN + CN diagnostics',level=em_param) + CASE (4) + CALL message('','-> 3D CCN + CN diagnostics',level=em_param) + CASE (5) + CALL message('','-> 2D CCN + CN diagnostics + burdens',level=em_param) + CASE (6) + CALL message('','-> 3D CCN + CN diagnostics + burdens',level=em_param) + CASE DEFAULT + WRITE (message_text,*) 'nccndiag = ',nccndiag,' not supported.' + CALL message('setham',message_text, level=em_error) + END SELECT +#endif + + END SUBROUTINE setham + + + INTEGER FUNCTION new_aerocomp(iclass, ispec, itrtype) + + USE mo_species, ONLY: speclist + USE mo_tracdef, ONLY: itrprog + + IMPLICIT NONE + + !---function interface + INTEGER, INTENT(IN) :: iclass + INTEGER, INTENT(IN) :: ispec + INTEGER, INTENT(IN), OPTIONAL :: itrtype + + !---local variables + INTEGER :: i + + naerocomp = naerocomp + 1 + i = naerocomp + + aerocomp(i)%iclass = iclass + aerocomp(i)%spid = ispec + aerocomp(i)%species => speclist(ispec) + + IF (PRESENT(itrtype)) THEN + aerocomp(i)%tracer_type = itrtype + ELSE + aerocomp(i)%tracer_type = itrprog + END IF + + new_aerocomp = i + + END FUNCTION new_aerocomp + +#ifdef HAMMOZ + SUBROUTINE print_aerocomp_info + + USE mo_tracdef, ONLY: trlist + USE mo_exception, ONLY: message_text, message, em_param, em_info + USE mo_util_string, ONLY: separator + + INTEGER :: jt + + CALL message('',separator) + WRITE(message_text,'(a)') 'Aerosol component information' + CALL message('',message_text,level=em_info) + CALL message('','',level=em_param) + WRITE(message_text,'(a)') ': aerocomp id iclass spid idt tracer name' + CALL message('',message_text,level=em_param) + DO jt=1,naerocomp + WRITE(message_text,'(a,5x,4(i7,1x),3x,a)') ':',jt, aerocomp(jt)%iclass, & + aerocomp(jt)%spid, aerocomp(jt)%idt, & + trlist%ti(aerocomp(jt)%idt)%fullname + CALL message('',message_text,level=em_param) + ENDDO + CALL message('','',level=em_param) + CALL message('',separator) + + END SUBROUTINE print_aerocomp_info +#endif + +END MODULE mo_ham diff --git a/ifs-source/arpifs/m7/module/mo_ham_activ.F90 b/ifs-source/arpifs/m7/module/mo_ham_activ.F90 new file mode 100644 index 00000000..451cbc43 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_activ.F90 @@ -0,0 +1,822 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_activ.f90 +!! +!! \brief +!! This code handles all ham-dependent activation processes +!! +!! +!! \author Philip Stier (MPI-Met) +!! \author Sylvaine Ferrachat (ETHZ) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original code +!! -# S. Ferrachat (ETHZ) - new code structure (separate HAM-dependent pieces +!! from the general activation schemes) - (2010-03) +!! +!! \limitations +!! None +!! +!! \details +!! Implementation of : +!! - the Abdul-Razzak & Ghan scheme which calculates the number of activated aerosol +!! particles from the aerosol size-distribution, composition and ambient supersaturation +!! (see subroutine ham_activ_abdulrazzak_ghan) +!! - a preparatory routine for Lin & Leaitch activation scheme (HAM-specific), which computes +!! the fractional mass and number of each mode larger than the cutoff of the instrument and add them up +!! +!! \bibliographic_references +!! - Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998. +!! - Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000. +!! - Pruppbacher and Klett, Kluewer Ac. Pub., 1997. +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_activ + + USE mo_kind, ONLY: dp, THRESHOLD + USE mo_ham, ONLY: sizeclass,nclass + +!#ifdef _OPENMP +! use omp_lib +!#endif + + + + IMPLICIT NONE + + PUBLIC ham_activ_abdulrazzak_ghan +!-->HK: diagnostics streams to be only used with HAMMOZ +#ifdef HAMMOZ + ham_activ_diag_abdulrazzak_ghan_strat, ham_activ_diag_abdulrazzak_ghan_conv +! Lin & Leaitch only to be used with HAMMOZ + PUBLIC ham_avail_activ_lin_leaitch, ham_activ_diag_lin_leaitch +#endif +!<--HK + PUBLIC ham_activ_koehler_ab + !-->HK + !REAL(dp), PUBLIC, ALLOCATABLE :: pfrac_m7(:,:,:), pna_m7(:,:,:) + !<--HK + + PRIVATE + + !--- Subroutines: + +CONTAINS + + SUBROUTINE ham_activ_abdulrazzak_ghan(kproma, kbdim, klev, krow, ktdia, & + pcdncact, pesw, prho, & + pxtm1, ptm1, papm1, pqm1, & + pw, pwpdf, pa, pb, & + prdry, pnact, pfracn, & + psc, prc, psmax ) + + + ! *ham_activ_abdulrazzak_ghan* calculates the number of activated aerosol + ! particles from the aerosol size-distribution, + ! composition and ambient supersaturation + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET, Caltech, University of Oxford 2002-2009 + ! + ! Method: + ! ------- + ! The calculation of the activation can be reduced to 4 tasks: + ! + ! 0) Calculation of Koehler A/B coefficients + ! (now done in ham_activ_koehler_ab) + ! I) Calculate the maximum supersaturation + ! II) Calculate the corresponding radius of activation + ! for each mode + ! III) Calculate the number of particles that are larger + ! then the radius of activation for each mode. + ! + ! III) Calculation of the number of activated particles: + ! See the routine ham_m7_logtail below. + ! + ! The calculations are now performed separately for + ! stratiform and convective updraft velocities. + ! + ! References: + ! ----------- + ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998. + ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000. + ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997. + + !>>dod soa + USE mo_ham_m7ctl, ONLY: sigmaln + !<>SF + USE mo_conv, ONLY: cdncact_cv + !<>DN #364 +#ifdef HAMMOZ + USE mo_ham_streams, ONLY: frac + USE mo_activ, ONLY: na +#endif + USE mo_activ, ONLY: nw + !<0.0) [m s-1] + pwpdf(kbdim,klev,nw), & ! PDF of updraft velocity [s m-1] + pxtm1(kbdim,klev,ntrac), & + pa(kbdim,klev,nclass), & ! curvature parameter A of the Koehler equation + pb(kbdim,klev,nclass), & ! hygroscopicity parameter B of the Koehler equation + prdry(kbdim,klev,nclass) ! dry radius for each mode + + !--- Local variables: + + INTEGER :: jclass, jk, & + jt, jl, & + jw + + REAL(dp):: zkv, & + zeps, zalpha, & + zgamma, & + zgrowth, & + zdif, zxv, & + zk, zka + + REAL(dp):: zamw, & ! molecular weight of water [kg mol-1] + zamd ! molecular weight of dry air [kg mol-1] + + REAL(dp):: zf(nclass), zg(nclass) + + REAL(dp):: zfracn(kbdim,klev) ! fraction of activated aerosol numbers for current mode and w bin + + REAL(dp):: zfracn_top(kbdim,klev,nclass), & ! w * dw weighted activated aerosol fraction + zfracn_bot(kbdim,klev,nclass) ! weighting factor (sum of w * dw) + + REAL(dp):: zn(kbdim,klev,nclass), & ! aerosol number concentration for each mode [m-3] + zsm(kbdim,klev,nclass) ! critical supersaturation for activating particles + ! with the mode number median radius + + REAL(dp) :: zeta(nw), zxi(nw), zsum(nw) + + REAL(dp), PARAMETER :: zsten = 75.0E-3_dp ! surface tension of H2O [J m-2] + ! neglecting salts and temperature + ! (also tried P&K 5.12 - erroneous!) + + LOGICAL, PARAMETER :: ll_numb = .TRUE. ! switch between number/mass in logtail calculation !SF + + + !--- 0) Initializations: + + zsm(1:kproma,:,:) = 0._dp + zfracn_top(1:kproma,:,:) = 0._dp + zfracn_bot(1:kproma,:,:) = 0._dp + prc(1:kproma,:,:,:) = 1._dp ! [m] initialized with 1m, only changed if activation occurs + pnact(1:kproma,:,:) = 0._dp + pfracn(1:kproma,:,:) = 0._dp + pcdncact(1:kproma,:) = 0._dp + + zeps=THRESHOLD ! Use for both physical cutoff and safe division + + !--- Conversions to SI units [g mol-1 to kg mol-1]: + + zamw=amw*1.E-3_dp + zamd=amd*1.E-3_dp + + !--- Number per unit volume for each mode: + DO jclass=1, nclass + jt = sizeclass(jclass)%idt_no + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + zn(1:kproma,:,jclass)=pxtm1(1:kproma,:,jt)*prho(1:kproma,:) + END IF + !<1 .OR. pw(jl,jk,1)>zeps) .AND. & + pqm1(jl,jk)>zeps .AND. & + ptm1(jl,jk)>(tmelt-35.0_dp) ) THEN !eehol: temp greater than homogenic ice nucleation temperature + + !--- Abdul-Razzak et al. (1998) (Eq. 11): + + zalpha=(grav*zamw*alv)/(cpd*argas*ptm1(jl,jk)**2) - & + (grav*zamd)/(argas*ptm1(jl,jk)) + + zgamma=(argas*ptm1(jl,jk))/(pesw(jl,jk)*zamw) + & + (zamw*alv**2)/(cpd*papm1(jl,jk)*zamd*ptm1(jl,jk)) + + !--- Diffusivity of water vapour in air (P&K, 13.3) [m2 s-1]: + + zdif=0.211_dp * (ptm1(jl,jk)/tmelt)**1.94_dp * (101325._dp/papm1(jl,jk)) *1.E-4_dp + + !--- Thermal conductivity zk (P&K, 13.18) [cal cm-1 s-1 K-1]: + + ! Mole fraction of water: + + zxv=pqm1(jl,jk)*(zamd/zamw) + + zka=(5.69_dp+0.017_dp*(ptm1(jl,jk)-273.15_dp))*1.E-5_dp + + zkv=(3.78_dp+0.020_dp*(ptm1(jl,jk)-273.15_dp))*1.E-5_dp + + ! Moist air, convert to [J m-1 s-1 K-1]: + + zk =zka*(1._dp-(1.17_dp-1.02_dp*zkv/zka)*zxv) * 4.1868_dp*1.E2_dp + + !--- Abdul-Razzak et al. (1998) (Eq. 16): + + zgrowth=1._dp/ & + ( (rhoh2o*argas*ptm1(jl,jk))/(pesw(jl,jk)*zdif*zamw) + & + (alv*rhoh2o)/(zk*ptm1(jl,jk)) * ((alv*zamw)/(ptm1(jl,jk)*argas) -1._dp) ) + + !--- Summation for equation (6): + + zsum(:)=0._dp + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + IF (zn(jl,jk,jclass) > zeps .AND. & + prdry(jl,jk,jclass) > 1.E-9_dp .AND. & + pa(jl,jk,jclass) > zeps .AND. & + pb(jl,jk,jclass) > zeps ) THEN + + ! (9): + + zsm(jl,jk,jclass)=2._dp/SQRT(pb(jl,jk,jclass)) * & + (pa(jl,jk,jclass)/(3._dp*prdry(jl,jk,jclass)))**1.5_dp + + ! (10): + + zxi(:)=2._dp*pa(jl,jk,jclass)/3._dp * SQRT(zalpha*pw(jl,jk,:)/zgrowth) + + ! (11): + + zeta(:)=((zalpha*pw(jl,jk,:)/zgrowth)**1.5_dp) / & + (2._dp*pi*rhoh2o*zgamma*zn(jl,jk,jclass)) + + ! (6): + + WHERE (pw(jl,jk,:)>zeps) + zsum(:)=zsum(:) + ( 1._dp/zsm(jl,jk,jclass)**2 & + * ( zf(jclass)*(zxi(:)/zeta(:))**1.5_dp & + + zg(jclass)*( zsm(jl,jk,jclass)**2._dp & + / (zeta(:)+3._dp*zxi(:)) )**0.75_dp ) ) + END WHERE + + ENDIF + END IF + !< zeps) + psmax(jl,jk,:)=1._dp/SQRT(zsum(:)) + ELSEWHERE + psmax(jl,jk,:)=0._dp + END WHERE + + ELSE + psmax(jl,jk,:)=0._dp + END IF + + END DO ! jl + END DO ! jk + + !--- Diagnostics: + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + psc(1:kproma,:,jclass) = zsm(1:kproma,:,jclass) + END IF + !<>dod<< #377 + + WHERE (psmax(1:kproma,ktdia:klev,jw)>zeps .AND. & + zsm(1:kproma,ktdia:klev,jclass)>zeps .AND. & + zn(1:kproma,ktdia:klev,jclass)>zeps .AND. & + prdry(1:kproma,ktdia:klev,jclass)>1.E-9_dp ) + + prc(1:kproma,ktdia:klev,jclass,jw) & + = prdry(1:kproma,ktdia:klev,jclass) & + * ( zsm(1:kproma,ktdia:klev,jclass) & + / psmax(1:kproma,ktdia:klev,jw) )**(2._dp/3._dp) + + END WHERE + + !--- 3.2) Calculate the fractional number of each mode + ! larger than the mode critical radius: + CALL ham_m7_logtail(kproma, kbdim, klev, krow, jclass, & + ll_numb, prdry(:,:,jclass), & + prc(:,:,jclass,jw), zfracn(:,:)) + + !--- 3.3) Sum up the total number of activated particles, integrating over updraft PDF [m-3]: + ! The weighting here should be correct (up to discretisation error) + ! provided that the w bins are equally spaced and cover the whole + ! range of integration. + zfracn_top(1:kproma,:,jclass) = zfracn_top(1:kproma,:,jclass) & + + zfracn(1:kproma,:)*pwpdf(1:kproma,:,jw) + zfracn_bot(1:kproma,:,jclass) = zfracn_bot(1:kproma,:,jclass) & + + pwpdf(1:kproma,:,jw) + + END IF ! lactivation !>>dod<< + + END DO ! jclass + END DO ! jw + + !-->HK + !IF (.NOT. ALLOCATED(pfrac_m7)) ALLOCATE(pfrac_m7(kbdim,klev,nclass)) + !IF (.NOT. ALLOCATED(pna_m7)) ALLOCATE(pna_m7(kbdim,klev,nclass)) + !<--HK + + DO jclass=1, nclass + IF (sizeclass(jclass)%lactivation) THEN !>>dod<< #377 + pfracn(1:kproma,:,jclass) = zfracn_top(1:kproma,:,jclass)/zfracn_bot(1:kproma,:,jclass) + pnact(1:kproma,:,jclass) = pfracn(1:kproma,:,jclass) * zn(1:kproma,:,jclass) + pcdncact(1:kproma,:) = pcdncact(1:kproma,:) + pnact(1:kproma,:,jclass) + !-->HK + !pfrac_m7(1:kproma,:,jclass) = pfracn(1:kproma,:,jclass) + !pna_m7(1:kproma,:,jclass) = pnact(1:kproma,:,jclass) + !<--HK + END IF + END DO + + END SUBROUTINE ham_activ_abdulrazzak_ghan + +!-->HK: diagnostics streams to be only used with HAMMOZ +#ifdef HAMMOZ + SUBROUTINE ham_activ_diag_abdulrazzak_ghan_strat(kproma, kbdim, klev, & + krow, pnact, pfracn, & + prc, psmax ) + + USE mo_activ, ONLY: na, nw, swat_max_strat + USE mo_ham_streams, ONLY: frac, nact_strat, rc_strat + USE mo_param_switches, ONLY: nactivpdf + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: pnact(kbdim,klev,nclass), & ! number of activated particles per mode [m-3] + pfracn(kbdim,klev,nclass),& ! fraction of activated particles per mode + prc(kbdim,klev,nclass,nw),& ! critical radius of activation per mode and w bin [m] + psmax(kbdim,klev,nw) ! maximum supersaturation per w bin [% 0-1] + + INTEGER :: jclass, jw + + IF (nactivpdf <= 0) THEN + DO jw=1, nw + swat_max_strat(jw)%ptr(1:kproma,:,krow) = psmax(1:kproma,:,jw) + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + WHERE(prc(1:kproma,:,jclass,jw) /= 1._dp) + rc_strat(jclass,jw)%ptr(1:kproma,:,krow)=prc(1:kproma,:,jclass,jw) + ENDWHERE + END IF + !>>dod + END DO + END DO + END IF + + na(1:kproma,:,krow) = 0._dp + + !-->HK + !IF (.NOT. ALLOCATED(pfrac_m7)) ALLOCATE(pfrac_m7(kproma,klev,nclass)) + !<--HK + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + nact_strat(jclass)%ptr(1:kproma,:,krow)=pnact(1:kproma,:,jclass) + frac(jclass)%ptr(1:kproma,:,krow)=pfracn(1:kproma,:,jclass) + na(1:kproma,:,krow)=na(1:kproma,:,krow)+pnact(1:kproma,:,jclass) + !-->HK + !pfrac_m7(1:kproma,:,jclass) = pfracn(1:kproma,:,jclass) + !-->dod + END DO + + END SUBROUTINE ham_activ_diag_abdulrazzak_ghan_strat + + SUBROUTINE ham_activ_diag_abdulrazzak_ghan_conv(kproma, kbdim, klev, & + krow, pnact, prc, psmax ) + + USE mo_activ, ONLY: nw, swat_max_conv + USE mo_ham_streams, ONLY: nact_conv, rc_conv + USE mo_param_switches, ONLY: nactivpdf + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: pnact(kbdim,klev,nclass), & ! number of activated particles per mode [m-3] + prc(kbdim,klev,nclass,nw),& ! critical radius of activation per mode and w bin [m] + psmax(kbdim,klev,nw) ! maximum supersaturation per w bin [% 0-1] + + INTEGER :: jclass, jw + + IF (nactivpdf <= 0) THEN + DO jw=1,nw + swat_max_conv(jw)%ptr(1:kproma,:,krow) = psmax(1:kproma,:,jw) + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + WHERE(prc(1:kproma,:,jclass,jw) /= 1._dp) + rc_conv(jclass,jw)%ptr(1:kproma,:,krow)=prc(1:kproma,:,jclass,jw) + ENDWHERE + END IF + !>>dod + END DO + END DO + END IF + + DO jclass=1, nclass + !>>dod #377 + IF (sizeclass(jclass)%lactivation) THEN + nact_conv(jclass)%ptr(1:kproma,:,krow)=pnact(1:kproma,:,jclass) + END IF + !>>dod + END DO + + END SUBROUTINE ham_activ_diag_abdulrazzak_ghan_conv +#endif +!-->dod #377 + IF (sizeclass(jclass)%lactivation) THEN + zmasssum(1:kproma,:,jclass)=zmasssum(1:kproma,:,jclass)+pxtm1(1:kproma,:,jt) + END IF + !< 0 .AND. sizeclass(jclass)%lactivation) THEN !>>dod<< #377 + ! PLS - TODO: SAFE DIVISION + WHERE(zmasssum(1:kproma,:,jclass)>zeps) + + zmassfrac(1:kproma,:)=pxtm1(1:kproma,:,jt)/zmasssum(1:kproma,:,jclass) + + zsumtop(1:kproma,:,jclass)=zsumtop(1:kproma,:,jclass)+pxtm1(1:kproma,:,jt)*znion*zosm*zmassfrac(1:kproma,:)/zmoleweight + zsumbot(1:kproma,:,jclass)=zsumbot(1:kproma,:,jclass)+pxtm1(1:kproma,:,jt)/zrhoaer + + END WHERE + + END IF! nion>0 + + END DO !naerocomp + + DO jclass=1,nclass + !>>dod #377 + IF(sizeclass(jclass)%lactivation) THEN + WHERE (zsumbot(1:kproma,:,jclass)>zeps) + + !--- 1.1.1) Hygroscopicity parameter B (Eq. 4) [1]: + + pb(1:kproma,:,jclass)=(zamw*zsumtop(1:kproma,:,jclass))/(rhoh2o*zsumbot(1:kproma,:,jclass)) + + !--- 1.1.2) Calculate the curvature parameter A [m]: + + pa(1:kproma,:,jclass)= zafac/ptm1(1:kproma,:) + + END WHERE + END IF + !< HK: Lin & Leaitch only to be used with HAMMOZ +#ifdef HAMMOZ + !--------------------------------------------------------------------------- + !> + !! @brief Computes available particules for activation + !! + !! @remarks Preparatory routine for Lin&Leaitch activation scheme (HAM-specific) + !! Basically it computes the fractional mass and number of each mode + !! larger than the cutoff of the instrument and add them up + !! Derived from the former aero_activ_lin_leaitch subroutine + + SUBROUTINE ham_avail_activ_lin_leaitch(kproma, kbdim, klev, krow, & + prho, pxtm1) + + USE mo_activ, ONLY: na + USE mo_conv, ONLY: na_cv + USE mo_ham_tools, ONLY: ham_m7_logtail + USE mo_tracdef, ONLY: ntrac + USE mo_ham_streams, ONLY: frac, rwet + + !SF note: lwetrad is true in this routine, ie wet radius is used + USE mo_ham, ONLY: nham_subm, HAM_M7, HAM_SALSA, sizeclass !>>dod<< #377 + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: prho(kbdim,klev) ! air density + REAL(dp), INTENT(IN) :: pxtm1(kbdim,klev,ntrac) ! tracer mmr + + REAL(dp), PARAMETER :: crcut=0.03*1E-6_dp ! Assumed lower cut-off of the + ! aerosol size distribution [m] + + !--- Ulrike: included for activation in convective clouds + REAL(dp), PARAMETER :: crcut_cv=0.02*1E-6_dp ! Assumed lower cut-off of the + ! aerosol size distribution in convective clouds [m] + + REAL(dp) :: cfracn(nclass) + + LOGICAL, PARAMETER :: lcut=.TRUE. ! explicit calculation of cut-off crcut or + ! usage of prescribed values cfracn + + LOGICAL, PARAMETER :: ll_numb = .TRUE. ! switch between number/mass in logtail calculation !SF + + INTEGER :: jclass, it + + REAL(dp) :: zr(kbdim,klev,nclass) + REAL(dp) :: zfracn(kbdim,klev,nclass) + REAL(dp) :: zfracn_cv(kbdim,klev,nclass) + + SELECT CASE(nham_subm) + CASE(HAM_M7) + cfracn(:) = (/1.0_dp,1.0_dp,1.0_dp,1.0_dp,0.0_dp,0.0_dp,0.0_dp/) + CASE(HAM_SALSA) + cfracn(:) = 1.0_dp + END SELECT + !>>dod bugfix + na(1:kproma,:,krow) = 0._dp + na_cv(1:kproma,:,krow) = 0._dp + !<>dod redmine #377: calculations and diagnotics restricted to relevant modes only. + !--- Calculate the fractional number of each mode + ! larger than the cutoff of the instrument: + SELECT CASE(nham_subm) + CASE(HAM_M7) + IF (lcut) THEN + + DO jclass=1, nclass !SF the ham_m7_logtail calculation is now done mode per mode for better efficiency + IF (sizeclass(jclass)%lactivation) THEN + IF (cfracn(jclass) > THRESHOLD ) THEN !SF #279: only performs this calculation when relevant + !SF stratiform: + zr(1:kproma,:,jclass)=crcut + + CALL ham_m7_logtail(kproma, kbdim, klev, krow, jclass, & + ll_numb, rwet(jclass)%ptr(:,:,krow), & + zr(:,:,jclass), zfracn(:,:,jclass) ) + + !SF convective: + zr(1:kproma,:,jclass)=crcut_cv + + CALL ham_m7_logtail(kproma, kbdim, klev, krow, jclass, & + ll_numb, rwet(jclass)%ptr(:,:,krow), & + zr(:,:,jclass), zfracn_cv(:,:,jclass) ) + ELSE !SF #279: ensures that zfracn and zfracn_cv are set to 0. when size class + ! is not relevant for activation + zfracn(1:kproma,:,jclass) = 0._dp + zfracn_cv(1:kproma,:,jclass) = 0._dp + ENDIF + END IF + END DO + + ELSE + + DO jclass=1, nclass + IF (sizeclass(jclass)%lactivation) THEN + zfracn(1:kproma,:,jclass) = cfracn(jclass) + zfracn_cv(1:kproma,:,jclass) = cfracn(jclass) !SF was missing in previous version. Mistake?? + END IF + END DO + + END IF + + CASE(HAM_SALSA) + DO jclass=1, nclass + zfracn(1:kproma,:,jclass) = cfracn(jclass) + zfracn_cv(1:kproma,:,jclass) = cfracn(jclass) !SF was missing in previous version. Mistake?? + END DO + ! If lcut for SALSA cut out the particles in 1a r=~25nm + ! Approximately the same as with M7 having crcut=30nm + IF (lcut) THEN + zfracn(1:kproma,:,1:3)=0.0_dp + ! For convective clouds.. cut out 1a r=~25nm, (M7 crcut=20nm) + zfracn_cv(1:kproma,:,1:3)=0.0_dp + END IF + END SELECT + !--- Sum up aerosol number concentrations and convert from [kg-1] to [m-3]: + DO jclass=1, nclass + !>>dod #377 + IF(sizeclass(jclass)%lactivation) THEN + + !>>dod soa + it = sizeclass(jclass)%idt_no + !<>dod<< #377 + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: prho(kbdim,klev) ! air density + REAL(dp), INTENT(IN) :: pxtm1(kbdim,klev,ntrac) ! tracer mmr + REAL(dp), INTENT(IN) :: pcdncact(kbdim,klev) ! number of activated particles + + INTEGER :: jclass, it + LOGICAL :: ll1(kbdim,klev) + REAL(dp) :: zeps + REAL(dp) :: ztmp1(kbdim,klev), ztmp2(kbdim,klev) + + zeps = THRESHOLD !EPSILON(1._dp) + + DO jclass=1, nclass + !>>dod #377 + IF(sizeclass(jclass)%lactivation) THEN + !>>dod soa + it = sizeclass(jclass)%idt_no + !<>SF #458 (replacing where statements) + ll1(1:kproma,:) = (na(1:kproma,:,krow) > zeps) + ztmp1(1:kproma,:) = MERGE(na(1:kproma,:,krow), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy val. + ztmp2(1:kproma,:) = pxtm1(1:kproma,:,it) * prho(1:kproma,:) & + * frac(jclass)%ptr(1:kproma,:,krow) / ztmp1(1:kproma,:) + + nact_strat(jclass)%ptr(1:kproma,:,krow) = MERGE( & + pcdncact(1:kproma,:) * ztmp2(1:kproma,:), & + nact_strat(jclass)%ptr(1:kproma,:,krow), & + ll1(1:kproma,:)) + + nact_conv(jclass)%ptr(1:kproma,:,krow) = MERGE( & + cdncact_cv(1:kproma,:,krow) * ztmp2(1:kproma,:), & + nact_conv(jclass)%ptr(1:kproma,:,krow), & + ll1(1:kproma,:)) + !< +!! \filename +!! mo_ham_drydep.f90 +!! +!! \brief +!! This module handles all input terms required for the calculations +!! of the surface aerosol dry deposition in HAM. +!! +!! \author Martin Schultz (MPIfM) +!! \author Hans-Stefan Bauer (MPIfM) +!! +!! \responsible_coder +!! Martin Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz and H.-S. Bauer (MPIfM) - original code (2000-07) +!! -# L. Ganzeveld and A. Rhodin () - (2001-10) +!! -# P. Stier (MPIfM) - (2002-2006) +!! -# M. Schultz (FZJ) and S. Ferrachat (ETHZ) - new module structure (2009-11) +!! -# G. Frontoso (C2SM) - distinguish between land / water / ice to +!! account for non-linearity (2012-02) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! +!! \limitations +!! None +!! +!! \details +!! This module handles all input terms required for the calculations +!! of the surface aerosol dry deposition in HAM. In particular, +!! the routine ham_vdaer calculates the dry deposition velocities for +!! HAM aerosol tracers. +!! Most of parameters are vegetation and soil data derived from satellite data +!! a high-resolution geograhical databases. For more details see the +!! routine where the actual reading occurs. The data are monthly mean +!! values, whenever there is an annual cycle in the data. In this +!! module, there is also the initialisation of the surface resistances +!! used for the dry deposition calculations. +!! Individual subroutines for calculation of vd by mode and integrated +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_drydep + + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: ntrac + !USE mo_ham_m7, ONLY: rwet_m7, densaer_m7 + + IMPLICIT NONE + !---------------- + ! Public entities + !---------------- + PRIVATE + + PUBLIC :: ham_vdaer ! 'big leaf' aerosol dry deposition scheme +#ifdef HAMMOZ + PUBLIC :: ham_vd_presc ! prescribed drydep velocities for HAM tracers +#endif + + LOGICAL, PARAMETER :: lwhitecap = .TRUE. ! consider role of whitecaps + LOGICAL, PARAMETER :: ldr_rh = .FALSE. ! consider relative hum. effect + LOGICAL, PARAMETER :: lvd_bymode = .TRUE. ! calculate drydep velocities + ! individually by mode or as integrated + ! quantity. + + + +CONTAINS + +SUBROUTINE ham_vdaer( kproma, kbdim, klev, krow, loland, pvgrat, & + pcvs, pcvw, pfri, pcvbs, pfrw, pum1, & + pvm1, pustarl, pustarw, pustari, pustveg, pustslsn, & + pu10, pv10, & + pm6rp, prhop, & ! m7 + paz0w, paz0i, prahwat, prahice, prahveg, prahslsn, & + ptslm1, prh, pxtm1, pvd ) + + !===================================================================== + ! Program to calculate the dry deposition velocity for + ! aerosols as a function of the particle radius considering the + ! impaction and difussion. Sedimentation is also calculated but not + ! included in the calculated deposition velocity since this process + ! is considered in a separate routine + !===================================================================== + + ! Author: + ! ------- + ! Laurens Ganzeveld, MPI Mainz 04/2001 + ! + ! Modifications: + ! -------------- + ! Philip Stier, MPI Hamburg (adaption to ECHAM/M7, + ! non-integrated scheme) 12/2001 + ! Sylvaine Ferrachart, Martin Schultz: new module structure 11/2009 + ! + ! Methodology: + ! + ! This program calculates the integrated deposition velocity from + ! the mass size distribution for a log normal aerosol distribution + ! defined by the radius and the log sigma. The model calculates the + ! Vd over land and over sea considering the diffusion,impaction and + ! sedimentation. Over sea the effect op particle growth due to the + ! large relative humidity is accounted for and the effect of + ! bubble bursting is also considered. The bubble bursting enhances + ! the dry deposition since it causes the breakdown of the laminar + ! boundary layer and the scavenging of the particles by the sea spray. + ! This model version does not contain yet a parameterization which + ! specifically considers the deposition to vegetated surfaces. For + ! these surfaces, a surface resistance as a function of canopy + ! structure should be incorporated. This might possible be implemented + ! in the future (Laurens Ganzeveld, 29-01-2002) + ! + ! The model requires as input parameters: + ! ------------------------------------------------------------------- + ! - UM, windspeed at reference height + ! - PAZ0M, surface roughness, over sea this term is calculated from UM + ! - PTSLM1, Air or surface temperature + ! - LOLAND, land-sea mask + ! - N, aerosol number [cm -3] + ! - R, aerosol radius [m] + ! - LSIGMA, LOG sigma of the log normal distribution + ! - RHOA_AEROS, the density of the aerosol + ! replaced by: densaer (Philip Stier) + !======================================================================== + ! LG- the parameter names in M7 for the parameters R, LSIGMA, and RHOA + ! are pm6rp, sigma (are similar for all the modes of M7, + ! LG 23-01-2002) and densaer + ! ======================================================================= + + USE mo_ham_m7ctl, ONLY: cmr2mmr, sigmaln + USE mo_ham, ONLY: nclass,nham_subm,HAM_BULK, HAM_M7, HAM_SALSA + USE mo_tracdef, ONLY: trlist, AEROSOLNUMBER, AEROSOLMASS + USE mo_math_constants, ONLY: pi + USE mo_physical_constants, ONLY: grav + + IMPLICIT NONE + + !--- input parameters from echam, the parameter pevap has still to be + ! checked more carefully, if this is a used constant or actually the + ! echam evaporation + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow + + LOGICAL, INTENT(in) :: loland(kbdim) + + REAL(dp), INTENT(in) :: pvgrat(kbdim), & + pcvs(kbdim), & + pcvw(kbdim), & + pfri(kbdim), & + pcvbs(kbdim), & + pfrw(kbdim), & + pum1(kbdim,klev), & + pvm1(kbdim,klev), & + pustarl(kbdim), & + pustarw(kbdim), & + pustari(kbdim), & + pustveg(kbdim), & + pustslsn(kbdim), & + pu10(kbdim), & + pv10(kbdim), & + paz0w(kbdim), & + paz0i(kbdim), & + prahwat(kbdim), & + prahice(kbdim), & + prahveg(kbdim), & + prahslsn(kbdim), & + ptslm1(kbdim), & + prh(kbdim) + + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), prhop(kbdim,klev,nclass) +!gf REAL(dp), INTENT(in) :: pevap(kbdim) + + REAL(dp), INTENT(in) :: pxtm1(kbdim,klev,ntrac) + + REAL(dp), INTENT(inout) :: pvd(kbdim,ntrac) + + + !--- stream variable references +#ifdef HAMMOZ + REAL(dp), POINTER :: rwet_p(:,:,:) + REAL(dp), POINTER :: densaer_p(:,:,:) +#endif + !--- Local Variables: + + INTEGER :: ji, jl, jt, jclass, jtype + + INTEGER, PARAMETER :: NNUMBER=1, MASS=2 + + ! Aerosol properties and parameters relevant to the calculations: + + REAL(dp) :: rx1,rx2,um10,s,sc,cunning,vb_veg,vb_slsn, & + vim_veg, vim_slsn, st_veg, st_slsn, st_wat, st_ice, rew, vb_sea, & + vb_ice, vim_sea, vim_ice, vkdaccsea, & + eff, rdrop, zdrop, qdrop, vkd_veg, vkd_slsn, vkd_wat, vkd_ice, & + vkc_veg, vkc_slsn, vkc_wat, vkc_ice, vdpart_veg, vdpart_slsn, & + vdpart_wat, vdpart_ice, dc, relax, & + eps,phi,alpha1,alpharat,vk1,vk2,zm,zmvd,zn,zdm,zdn,zdlnr + + ! mz_lg_20031014+ added for some modifications of the vegetation surface + ! resistance based on the paper by Gallagher et al., JGR, 2002. The + ! paper shows some more details about the parameterization by + ! Slinn, Atmos. Environment, Vol 16, 1785-1794, 1982 + REAL(dp) :: vin_veg, zrebound + ! mz_lg_20031014- + + REAL(dp) :: zrint + REAL(dp) :: zvdrydep(kbdim) ! Aerosol Dry Deposition Velocity defined for each mode + REAL(dp) :: zr(kbdim) ! Aerosol Radius of the respective tracer at klev + REAL(dp) :: znmr(kbdim) ! Aerosol Number Mixing ratio at t=t+1 + + REAL(dp) :: zevap(kbdim) !gf + + !--- Auxiliary fields: + + REAL(dp) :: um(kbdim), alpha(kbdim), beta(kbdim), & + alphae(kbdim), bubble(kbdim) + + LOGICAL :: ldrydep + + INTEGER, PARAMETER :: nint=199 ! number of integration intervals + REAL(dp) :: zintstep(nint) ! integration intervals + + REAL(dp), PARAMETER :: crmin=0.01E-6_dp ! smallest radius for which a dry deposition + ! velocity is calculated [cm] + + !--- Assign values to used constants: + + REAL(dp), PARAMETER :: fln10=2.302585_dp + REAL(dp), PARAMETER :: w2pi=2.506638_dp + REAL(dp), PARAMETER :: g=grav*1.e2_dp ! cm s-2 at sea level (SF #369: changed to model-wide constant) + REAL(dp), PARAMETER :: dynvisc=1.789e-4_dp ! g cm-1 s-1 + REAL(dp), PARAMETER :: cl=0.066*1e-4_dp ! mean free path [cm] (particle size also in cm) + REAL(dp), PARAMETER :: bc= 1.38e-16_dp ! boltzman constant [g cm-2 s-1 K-1] (1.38e-23 J deg-1) + REAL(dp), PARAMETER :: kappa=1._dp ! shapefactor + REAL(dp), PARAMETER :: visc=0.15_dp ! molecular viscocity [cm2 s-1] + REAL(dp), PARAMETER :: daccm=0._dp ! factor which corrects for evaporation (see paper slinn) + REAL(dp), PARAMETER :: vkar=0.40_dp ! von karman constant + + ! mz_lg_20031014+ added for the Vd aerosol over vegetation + ! mz_lg_20040602+ modified + REAL(dp), PARAMETER :: zAS = 10.E-6_dp*1.E2_dp ! um -> CM, see paper Gallagher and Slinn, 1982 + ! here the smallest collector size is set at 10 um + ! Those are the values for Slinn's 82 model (see Table 1) + REAL(dp), PARAMETER :: zAL = 1.E-3_dp*1.E2_dp ! mm -> CM, see paper Gallagher and Slinn, 1982 + ! here the largest collector size is set at 1 mm + ! mz_lg_20040602-+ modified + ! mz_lg_20031014- + + !@@@ Check with Laurens (see comments above) + + zevap(1:kproma)=0._dp + + !--- Integration stepsizes [m], 0-10 and 10-100,100-1000 um + ! the first interval is divided into 1000 steps of 0.1 um + ! whereas for the interval >10 um 90 steps of 1 um are selected + ! and for the radius > 100 um 90 steps of 10 um are selected + + DATA zintstep /100*.01E-6_dp,90*1.E-6_dp,9*10.E-6_dp/ + + !--- 1) Calculate correction factors: + + DO jl=1,kproma + + ! LG- calculation of some parameters required for the deposition calculations + + um(jl)=MAX(0.001_dp,SQRT(pum1(jl,klev)**2+pvm1(jl,klev)**2)) + um10=MAX(0.001_dp,SQRT(pu10(jl)**2+pv10(jl)**2)) + + ! bubble bursting effect,see Hummelshoj, equation 10 + ! relationship by Wu (1988), note that Hummelshoj has not + ! considered the cunningham factor which yields a different + ! vb curve, with smaller values for small particles + + IF (lwhitecap) THEN + alpha(jl)=MAX(1.e-10_dp,1.7e-6_dp*um10**3.75_dp) ! old 10 m windspeed !! + eff=0.5_dp + rdrop=0.005_dp ! cm + zdrop=10.0_dp ! cm + qdrop=5._dp*(100._dp*alpha(jl)) + bubble(jl)=((100._dp*pustarw(jl))**2)/(100._dp*um(jl))+eff* & + (2._dp*pi*rdrop**2)*(2._dp*zdrop)*(qdrop/alpha(jl)) + ELSE + alpha(jl)=0._dp + bubble(jl)=0._dp + ENDIF + + !--- Correction of particle radius for particle growth close to the + ! surface according to Fitzgerald, 1975, the relative humidity over + ! the ocean is restricted to 98% (0.98) due to the salinity + + s=MIN(0.98_dp,prh(jl)) + eps=0.6_dp + beta(jl)=EXP((0.00077_dp*s)/(1.009_dp-s)) + phi=1.058_dp-((0.0155_dp*(s-0.97_dp))/(1.02_dp-s**1.4_dp)) + alpha1=1.2_dp*EXP((0.066_dp*s)/(phi-s)) + vk1=10.2_dp-23.7_dp*s+14.5_dp*s**2 + vk2=-6.7_dp+15.5_dp*s-9.2_dp*s**2 + alpharat=1._dp-vk1*(1._dp-eps)-vk2*(1._dp-eps**2) + alphae(jl)=alpharat*alpha1 + + !--- Over land no correction for large humidity close to the surface: + + IF (loland(jl).OR..NOT.ldr_rh) THEN + alphae(jl)=1._dp + beta(jl)=1._dp + ENDIF + + END DO! jl=1, kproma + + !--- 2)Calculate dry deposition velocity for each internally mixed mode: + + IF (lvd_bymode) THEN + CALL ham_vdaer_bymode + ELSE + CALL ham_vdaer_integrated + END IF + + + + CONTAINS + +!--------------------------------------------------------------------------------------------- +! calculation by aerosol mode + + SUBROUTINE ham_vdaer_bymode + + + DO jclass=1, nclass + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr + densaer_p => densaer(jclass)%ptr +#endif + + DO jtype=1, 2 ! number (= 1) and mass (= 2) + + !--- Calculations are done in [cm] to get results in [cm s-1]: + + SELECT CASE(jtype) + CASE(1) + ldrydep=ANY(trlist%ti(:)%ndrydep==2 .AND. trlist%ti(:)%mode==jclass & + .AND. trlist%ti(:)%nphase==AEROSOLNUMBER) +#ifdef HAMMOZ + zr(1:kproma)=rwet_p(1:kproma,klev,krow)*1.E2_dp +#else + !zr(1:kproma)=rwet_m7(1:kproma,klev,jclass)*1.E2_dp + zr(1:kproma)=pm6rp(1:kproma,klev,jclass)*1.E2_dp +#endif + CASE(2) + ldrydep=ANY(trlist%ti(:)%ndrydep==2 .AND. trlist%ti(:)%mode==jclass & + .AND. trlist%ti(:)%nphase==AEROSOLMASS) + SELECT CASE(nham_subm) + CASE(HAM_M7) +#ifdef HAMMOZ + zr(1:kproma)=rwet_p(1:kproma,klev,krow)*1.E2_dp*cmr2mmr(jclass) +#else + !zr(1:kproma)=rwet_m7(1:kproma,klev,jclass)*1.E2_dp*cmr2mmr(jclass) + zr(1:kproma)=pm6rp(1:kproma,klev,jclass)*1.E2_dp*cmr2mmr(jclass) +#endif + CASE(HAM_SALSA) + !Deposition size is the same for mass and number in SALSA +#ifdef HAMMOZ + zr(1:kproma)=rwet_p(1:kproma,klev,krow)*1.E2_dp +#endif + END SELECT + END SELECT + + IF(ldrydep) THEN + + DO jl=1, kproma + + !--- Do calculations only for particles larger than 0.0001 um : + + IF (zr(jl) > crmin) THEN + + !--- Cunningham factor: + + cunning=1._dp+(cl/(alphae(jl)*zr(jl))**beta(jl)) & + *(2.514_dp+0.800_dp*EXP(-0.55_dp*(zr(jl))/cl)) + + !--- Diffusivity: + + dc=(bc*ptslm1(jl)*cunning)/(3._dp*pi*dynvisc*(alphae(jl)*zr(jl))**beta(jl)) + + ! Relaxation: + + ! mz_lg_20021311, modified based on discussions with + ! Philip Stier [kg m-3 => g cm-3] + +#ifdef HAMMOZ + relax=(densaer_p(jl,klev,krow)*1.E-3_dp*(((alphae(jl)*zr(jl))**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#else + !relax=(densaer_m7(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zr(jl))**beta(jl))**2)* & + ! cunning)/(18._dp*dynvisc*kappa) + relax=(prhop(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zr(jl))**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#endif + + ! Calculation of schmidt and stokes number + + sc =visc/dc + st_veg =(relax*(100._dp*pustveg(jl))**2)/visc + + ! mz_lg_20031014+, modified calculation of the Stokes number + ! over vegetated surfaces, see paper by Gallagher et al., + ! JGR 2002. zAL is a characteristic radius for the + ! largest collectors comprising the surface + ! ham_ps_20031201+ included minumum value for Stokes numbers: + st_veg =MAX((relax*(100._dp*pustveg(jl))**2)/(g*zAL),1.E-1_dp) + ! mz_lg_20031014- + st_slsn =MAX((relax*(100._dp*pustslsn(jl))**2)/visc,1.E-1_dp) + st_wat =MAX((relax*(100._dp*pustarw(jl))**2)/visc,1.E-1_dp) + st_ice =MAX((relax*(100._dp*pustari(jl))**2)/visc,1.E-1_dp) + ! ham_ps_20031201- + + !--- Calculation of the dry deposition velocity + ! See paper slinn and slinn, 1980, vd is related to d**2/3 + ! over land, whereas over sea there is accounted for slip + ! vb represents the contribution in vd of the brownian diffusion + ! and vi represents the impaction. + ! + !--- Over land, the vegetation and snow and bare soil fractions + ! are considered: + + vb_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vim_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_veg)) + + ! mz_lg_20031014+, modified calculation of the impaction over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! We have applied here the parameterization by Slinn [1982] + ! over vegetated surfaces + vim_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)* & + (st_veg**2/(1._dp+st_veg**2)) + ! mz_lg_20031014- + + vim_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_slsn)) + vim_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_ice)) + + ! LG- the term evap has not been defined yet (30-01-2002) and the + ! term daccm is set to zero anyhow. It still must be checked if + ! this term should be included and how it relates to the factors + ! that correct for particle growth close to the surface, according + ! to Fitzjarald, 1975 (see ALPHAE and BETA) + + ! mz_lg_20031014+, modified calculation of the surface resistance over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! The calculation includes the interception collection efficiency + ! vim and a rebound correction factor R + !vkd_veg =pevap(jl)*daccm+(vb_veg+vim_veg) + vin_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)* & + (1._dp/2._dp)*(zr(jl)/zAS)**2 ! equation 18 + zrebound =EXP(-st_veg**0.5_dp) ! equation 19 + vkd_veg =zevap(jl)*daccm+zrebound*(vb_veg+vim_veg+vin_veg) + ! mz_lg_20031014- + + vkd_slsn =zevap(jl)*daccm+(vb_slsn+vim_slsn) + vkd_ice =zevap(jl)*daccm+(vb_ice+vim_ice) + + !--- Over sea: + ! Brownian diffusion for rough elements, see Hummelshoj + ! re is the reynolds stress: + + rew =(100._dp*pustarw(jl)*100._dp*paz0w(jl))/visc + + vb_sea =(1._dp/3._dp)*100._dp*pustarw(jl)*((sc**(-0.5_dp))*rew**(-0.5_dp)) + vim_sea =100._dp*pustarw(jl)*10._dp**(-3._dp/st_wat) + vkdaccsea =vb_sea+vim_sea + vkd_wat =(1._dp-alpha(jl))*vkdaccsea+alpha(jl)*(bubble(jl)) + + ! Slinn and Slinn parameterization, calculation of vd: + ! ==================================================== + ! LG- without considering the role of sedimentation ! + ! This process is being calculated in a separate + ! subroutine in echam5! + ! ==================================================== + + vkc_veg =(100._dp/prahveg(jl)) + vkc_slsn =(100._dp/prahslsn(jl)) + vkc_wat =(100._dp/prahwat(jl)) + vkc_ice =(100._dp/prahice(jl)) + + !@@@ Included security checks for small values of vxx_yyy: + + IF(vkc_veg > 1.E-5_dp .AND. vkd_veg > 1.E-5_dp) THEN + vdpart_veg =1._dp/((1._dp/vkc_veg)+(1._dp/vkd_veg)) + ELSE + vdpart_veg = 0._dp + END IF + IF(vkc_slsn > 1.E-5_dp .AND. vkd_slsn > 1.E-5_dp) THEN + vdpart_slsn = 1._dp/((1._dp/vkc_slsn)+(1._dp/vkd_slsn)) + ELSE + vdpart_slsn = 0._dp + END IF + IF(vkc_wat > 1.E-5_dp .AND. vkd_wat > 1.E-5_dp) THEN + vdpart_wat =1._dp/((1._dp/vkc_wat)+(1._dp/vkd_wat)) + ELSE + vdpart_wat = 0._dp + END IF + IF(vkc_ice > 1.E-5_dp .AND. vkd_ice > 1.E-5_dp) THEN + vdpart_ice =1._dp/((1._dp/vkc_ice)+(1._dp/vkd_ice)) + ELSE + vdpart_ice = 0._dp + END IF + + !--- Calculate the dry deposition velocity weighted according to the surface types: + ! pcvs: snow fraction + ! pcvbs: bare soil fraction + ! pvgrat: vegetation ratio + ! pcvw: wet skin fraction + ! pfri: (sea) ice fraction + ! pfrw: open water fraction + + zvdrydep(jl) = pcvs(jl)*vdpart_slsn & + + pcvbs(jl)*vdpart_slsn & + + (1._dp-pcvs(jl))*(1._dp-pcvw(jl))*pvgrat(jl)*vdpart_veg & + + (1._dp-pcvs(jl))*pcvw(jl)*vdpart_veg & + + pfri(jl)*vdpart_ice & + + pfrw(jl)*vdpart_wat + + ELSE + + zvdrydep(jl)=0._dp + + END IF !zr(jl) > crmin + + END DO ! jl=1, kproma + + !--- save drydep velocity + SELECT CASE(jtype) + CASE(1) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLNUMBER)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion from cm s-1 to m s-1 + + END IF + END DO + CASE(2) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLMASS)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion from cm s-1 to m s-1 + + END IF + END DO + END SELECT + + END IF ! ldrydep + + END DO ! jtype=1, 2 + + END DO ! jclass=1, nclass + + END SUBROUTINE ham_vdaer_bymode + + +!--------------------------------------------------------------------------------------------- +! integrated calculation + + SUBROUTINE ham_vdaer_integrated + + DO jl=1, kproma + + DO jtype=1, 2 ! number (= 1) and mass (= 2) + + DO jclass=1, nclass + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr + densaer_p => densaer(jclass)%ptr +#endif + ! mz_lg_20030521+, small change in criteria to determine if calculations + ! should be bypassed, see also the same criteria for lvd_integrated=.false. +#ifdef HAMMOZ + IF ( ANY(trlist%ti(:)%mode==jclass.AND.trlist%ti(:)%ndrydep>0) .AND. & + rwet_p(jl,klev,krow) > crmin) THEN +#else + !IF ( ANY(trlist%ti(:)%mode==jclass.AND.trlist%ti(:)%ndrydep>0) .AND. & + ! rwet_m7(jl,klev,jclass) > crmin) THEN + IF ( ANY(trlist%ti(:)%mode==jclass.AND.trlist%ti(:)%ndrydep>0) .AND. & + pm6rp(jl,klev,jclass) > crmin) THEN +#endif + !--- Initialisations: + + DO jt=1, ntrac + IF (trlist%ti(jt)%mode==jclass .AND. trlist%ti(jt)%nphase==AEROSOLNUMBER ) THEN + znmr(jl)=pxtm1(jl,klev,jt) + END IF + END DO + + SELECT CASE(jtype) + CASE(1) +#ifdef HAMMOZ + zr(jl)=rwet_p(jl,klev,krow) +#else + !zr(jl)=rwet_m7(jl,klev,jclass) + zr(jl)=pm6rp(jl,klev,jclass) +#endif + CASE(2) +#ifdef HAMMOZ + zr(jl)=rwet_p(jl,klev,krow)*cmr2mmr(jclass) +#else + !zr(jl)=rwet_m7(jl,klev,jclass)*cmr2mmr(jclass) + zr(jl)=pm6rp(jl,klev,jclass)*cmr2mmr(jclass) +#endif + END SELECT + + rx1 = 0.0_dp + zmvd = 0.0_dp + zm = 0.0_dp + + DO ji=1,nint-1 + + ! Integration size interval is rx2-rx1: + + rx1=rx1+zintstep(ji) + rx2=rx1+zintstep(ji+1) + + !--- Calculate the number of particles in the intervall r+dr + ! for a log-normal distribution with the moments: + ! N=znmr, sigma, CountMeanRadius=pm6rp + ! dn=n(ln(r))dln(r) [m-3] + ! where: + ! r = (rx1+rx2)/2 + ! and + ! n(ln(r)) = N/(sqrt(2 PI)*ln(sigma)) * exp(-(ln(r)-ln(CMR))/(2ln(sigma)**2) + + zrint = (rx1+rx2)/2._dp + + !--- Particle Numbers: + + zdlnr = LOG(rx2)-LOG(rx1) + + zn = znmr(jl)/(2._dp*pi*sigmaln(jclass)) * & + EXP(-(LOG(zrint)-LOG(zr(jl)))/(2._dp*sigmaln(jclass)**2)) + zdn = zn * zdlnr + + !--- Average particle mass: + ! in intervall (zrint-dr,zrint+dr) [kg(tracer)/kg(air)] + +#ifdef HAMMOZ + zdm = 4._dp/3._dp*pi*zrint**3 * densaer_p(jl,klev,krow) * zdn +#else + !zdm = 4._dp/3._dp*pi*zrint**3 * densaer_m7(jl,klev,jclass) * zdn + zdm = 4._dp/3._dp*pi*zrint**3 * prhop(jl,klev,jclass) * zdn +#endif + + !--- Cunningham factor: + ! (Philip Stier, 11-2001, Separation into dry and wet not needed + ! as the ambient radius pm6rp incorporates the particle growth) + ! ================================================================= + ! LG- It still must be checked if it is indeed allright to + ! calculate only the parameters for the aerosol modal + ! parameters given by M7 to include the effect of particle + ! growth. The parameterization of the effect of particle growth + ! that was included in the original scheme of the aerosol + ! dry deposition module corrects for the growth close to the + ! surface for a large relative humidity in quasi-laminar layer, + ! which is actual a sub-grid scale effect occuring in the + ! surface layer of echam. We have included again the calculation + ! of the parameters that are used to introduce this effect, + ! ALPHAE and BETA and use of this terms can easily be considered + ! or ignored, for the latter option setting the calculated values + ! to 1 (this is default done for over-land grids) + ! + ! Laurens Ganzeveld, 30-01-2002 + ! ================================================================= + + !--- Convert radii to cm to get the results in cm s-1: + + cunning=1._dp+(cl/(alphae(jl)*zrint*1.E2_dp)**beta(jl)) & + *(2.514_dp+0.800_dp*EXP(-0.55_dp*(zrint*1.E2_dp)/cl)) + + !--- Diffusivity: + + dc=(bc*ptslm1(jl)*cunning)/(3._dp*pi*dynvisc*(alphae(jl)*zrint*1.E2_dp)**beta(jl)) + + ! Relaxation: + + ! mz_lg_20021311, modified based on discussions with + ! Philip Stier [kg m-3 => g cm-3] +#ifdef HAMMOZ + relax=(densaer_p(jl,klev,krow)*1.E-3_dp*(((alphae(jl)*zrint)**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#else + !relax=(densaer_m7(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zrint)**beta(jl))**2)* & + ! cunning)/(18._dp*dynvisc*kappa) + relax=(prhop(jl,klev,jclass)*1.E-3_dp*(((alphae(jl)*zrint)**beta(jl))**2)* & + cunning)/(18._dp*dynvisc*kappa) +#endif + + ! Calculation of schmidt and stokes number + + sc =visc/dc + st_veg =(relax*(100._dp*pustveg(jl))**2)/visc + + ! mz_lg_20031014+, modified calculation of the Stokes number + ! over vegetated surfaces, see paper by Gallagher et al., + ! JGR 2002. zAL is a characteristic radius for the + ! largest collectors comprising the surface + st_veg =(relax*(100._dp*pustveg(jl))**2)/(g*zAL) + ! mz_lg_20031014- + + st_slsn =(relax*(100._dp*pustslsn(jl))**2)/visc + st_wat =(relax*(100._dp*pustarw(jl))**2)/visc + st_ice =(relax*(100._dp*pustari(jl))**2)/visc + + !--- Calculation of the dry deposition velocity + ! See paper slinn and slinn, 1980, vd is related to d**2/3 + ! over land, whereas over sea there is accounted for slip + ! vb represents the contribution in vd of the brownian diffusion + ! and vi represents the impaction. + ! + !--- Over land, the vegetation and snow and bare soil fractions + ! are considered: + + vb_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + vb_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl)*(sc**(-2._dp/3._dp)) + + ! mz_lg_20031014+, modified calculation of the impaction over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! We have applied here the parameterization by Slinn [1982] + ! over vegetated surfaces + ! (Philip Stier 30/10/2003, corrected um to um(jl)) + !vim_veg =(1./vkar)*((pustveg(jl)/um(jl))**2)*100.*um(jl)*(10.**(-3./st_veg)) + + vim_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl) & + *(st_veg**2/(1._dp+st_veg**2)) + ! mz_lg_20031014- + + vim_slsn =(1._dp/vkar)*((pustslsn(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_slsn)) + vim_ice =(1._dp/vkar)*((pustari(jl)/um(jl))**2)*100._dp*um(jl) & + *(10._dp**(-3._dp/st_ice)) + + ! LG- the term evap has not been defined yet (30-01-2002) and the + ! term daccm is set to zero anyhow. It still must be checked if + ! this term should be included and how it relates to the factors + ! that correct for particle growth close to the surface, according + ! to Fitzjarald, 1975 (see ALPHAE and BETA) + + + ! mz_lg_20031014+, modified calculation of the surface resistance over + ! vegetated surfaces, see paper by Gallagher et al., JGR 2002. + ! The calculation includes the interception collection efficiency + ! vim and a rebound correction factor R + !vkd_veg =pevap(jl)*daccm+(vb_veg+vim_veg) + + vin_veg =(1._dp/vkar)*((pustveg(jl)/um(jl))**2)*100._dp*um(jl)* & + (1._dp/2._dp)*(zrint/zAS)**2 ! equation 18 + zrebound =EXP(-st_veg**0.5_dp) ! equation 19 + vkd_veg =zevap(jl)*daccm+zrebound*(vb_veg+vim_veg+vin_veg) + ! mz_lg_20031014- + + vkd_slsn =zevap(jl)*daccm+(vb_slsn+vim_slsn) + + !--- Over sea: + ! Brownian diffusion for rough elements, see Hummelshoj + ! re is the reynolds stress: + + rew =(100._dp*pustarw(jl)*100._dp*paz0w(jl))/visc + vb_sea =(1._dp/3._dp)*100._dp*pustarw(jl)*((sc**(-0.5_dp))*rew**(-0.5_dp)) + vim_sea =100._dp*pustarw(jl)*10._dp**(-3._dp/st_wat) + vkdaccsea =vb_sea+vim_sea + vkd_wat =(1._dp-alpha(jl))*vkdaccsea+alpha(jl)*(bubble(jl)) + + ! Slinn and Slinn parameterization, calculation of vd: + ! ==================================================== + ! LG- without considering the role of sedimentation ! + ! This process is being calculated in a separate + ! subroutine in echam5! + ! ==================================================== + + vkc_veg =(100._dp/prahveg(jl)) + vkc_slsn =(100._dp/prahslsn(jl)) + vkc_wat =(100._dp/prahwat(jl)) + vkc_ice =(100._dp/prahice(jl)) + vdpart_veg =1._dp/((1._dp/vkc_veg)+(1._dp/vkd_veg)) + vdpart_slsn =1._dp/((1._dp/vkc_slsn)+(1._dp/vkd_slsn)) + vdpart_wat =1._dp/((1._dp/vkc_wat)+(1._dp/vkd_wat)) + vdpart_ice =1._dp/((1._dp/vkc_ice)+(1._dp/vkd_ice)) + + !--- Calculate sum(dm*vd(dm)): + ! pcvs: snow fraction + ! pcvbs: bare soil fraction + ! pvgrat: vegetation ratio + ! pcvw: wet skin fraction + ! pfri: (sea) ice fraction + ! pfrw: open water fraction + + + zmvd = zmvd + zdm*( & + pcvs(jl)*vdpart_slsn+ & ! snow fraction + pcvbs(jl)*vdpart_slsn+ & ! bare soil fraction + (1._dp-pcvs(jl))*(1._dp-pcvw(jl))*pvgrat(jl)*vdpart_veg+ & ! vegetation fraction + (1._dp-pcvs(jl))*pcvw(jl)*vdpart_veg+ & ! wet skin fraction + pfri(jl)*vdpart_ice+ & ! sea ice fraction + pfrw(jl)*vdpart_wat ) ! water fraction + + !--- Calculate m=sum(dm) [kg(tracer)/kg(air)]: + + zm = zm + zdm + + END DO !ji=1,nint-1 + + !--- Calculate integrated dry deposition velocity [cm s-1]: + ! vd = sum(dm*vd) / m + + zvdrydep(jl)= zmvd/zm + + ELSE + + zvdrydep(jl)=0._dp + + END IF + + END DO ! jl=1, kproma + + !--- Assign the calculated deposition velocity to all tracers + ! in the respecive mode and re-convert it to [m s-1]: + + ! this can cause the same fields to be written many times if drydep diag is BYTRACER + ! needs improvement + + SELECT CASE(jtype) + CASE(1) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLNUMBER)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion cm s-1 to m s-1 + END IF + END DO + CASE(2) + DO jt=1,ntrac + IF (trlist%ti(jt)%ndrydep>0 .AND. & + trlist%ti(jt)%mode==jclass .AND. & + trlist%ti(jt)%nphase==AEROSOLMASS)THEN + + pvd(1:kproma,jt) = zvdrydep(1:kproma)*1.E-2_dp ! conversion cm s-1 to m s-1 + END IF + END DO + END SELECT + + END DO ! jclass=1, nclass + + END DO ! jtype=1, 2 + + END SUBROUTINE ham_vdaer_integrated + + +END SUBROUTINE ham_vdaer + +!------------------------------------------------------------------------------ +#ifdef HAMMOZ +SUBROUTINE ham_vd_presc(kproma, kbdim, klev, krow, loland, & + paphp1, pcvs, pforest, pfri, ptsi, & + pcvw, ptslm1, pws, pwsmx, pdensair, & + pvd ) + + ! Purpose: + ! --------- + ! This routine prescribes dry deposition velocities for + ! aerosols and gases in dependency of surface type, etc. + ! ... + ! + ! Authors: + ! ---------- + ! Hans Feichter, MPI-MET + ! Philip Stier, MPI-MET + ! + ! Method: + ! ------- + ! Currently rudimentary! + ! + ! Interface: + ! ---------- + ! *xt_vdrydep_presc* is called from *xt_drydep* + + USE mo_kind, ONLY: dp + USE mo_control, ONLY: nlev + USE mo_time_control, ONLY: time_step_len + USE mo_physical_constants, ONLY: tmelt, grav + USE mo_tracdef, ONLY: trlist, ntrac, AEROSOLMASS, AEROSOLNUMBER, GAS + USE mo_physc2, ONLY: ctfreez, & ! sea water freezing temp. + csncri ! m water equivalent critical snow depth + USE mo_vphysc, ONLY: vphysc +!! USE mo_submodel_diag, ONLY: get_diag_pointer + + + IMPLICIT NONE + + !--- Parameters: + !--- Local variables: + ! + ! zvdrd dry deposition velocity in m/s + ! zvdrd(jl,1) for so2 gas + ! zvdrd(jl,2) for aerosols + ! zvdcoarse for dust and seasalt aerosols (coarse mode) + + ! Parameters: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow + + REAL(dp), INTENT(in) :: pfri(kbdim), & + pcvs(kbdim), & + pcvw(kbdim), & + pforest(kbdim), & + ptsi(kbdim), & + ptslm1(kbdim), & + pws(kbdim), & + pwsmx(kbdim), & + pdensair(kbdim), & + paphp1(kbdim,klev+1) + + REAL(dp), INTENT(inout) :: pvd(kbdim,ntrac) + + ! Local scalars: + + INTEGER :: jl, jt + + REAL(dp):: zvd2ice, zvd4ice, zvd2nof, zvd4nof, & + zvwc2, zvw02, zvwc4, zvw04 + + ! Local arrays: + + REAL(dp):: zmaxvdry(kbdim) + REAL(dp):: zvdrd(kbdim,2) + + LOGICAL :: loland(kbdim) + + ! Constants: + + REAL(dp), PARAMETER :: zvdcoarse = 0.01_dp, & ! V_dep coarse mode [m/s] + zvdaitken = 0.01_dp ! V_dep aitken mode [m/s] + + + !--- 1) Calculation of the dry deposition velocity: ----------------------- + + !--- Coefficients for zvdrd = function of soil moisture: + ! + zvwc2=(0.8e-2_dp - 0.2e-2_dp)/(1._dp - 0.9_dp) + zvw02=zvwc2-0.8e-2_dp + zvwc4=(0.2e-2_dp - 0.025e-2_dp)/(1._dp - 0.9_dp) + zvw04=zvwc4-0.2e-2_dp + + !--- Maximal deposition velocity is maximal vertical grid velocity: + + DO jl=1,kproma + zmaxvdry(jl)=(paphp1(jl,nlev+1)-paphp1(jl,nlev))/(grav*pdensair(jl)*time_step_len) + END DO + + + DO jl=1,kproma + + !--- 1.1) Over sea: + + IF (.NOT.loland(jl)) THEN + ! - sea ice - + ! - melting/not melting seaice- + IF (ptsi(jl).GE.(ctfreez-0.01_dp)) THEN + zvd2ice=0.8e-2_dp ! SO2 + zvd4ice=0.2e-2_dp ! others + ELSE + zvd2ice=0.1e-2_dp + zvd4ice=0.025e-2_dp + END IF + zvdrd(jl,1)=(1._dp-pfri(jl))*1.0e-2_dp+pfri(jl)*zvd2ice + zvdrd(jl,2)=(1._dp-pfri(jl))*0.2e-2_dp+pfri(jl)*zvd4ice + ELSE + + !--- 1.2) Over land: + ! - non-forest areas - + ! - snow/no snow - + IF (pcvs(jl).GT.csncri) THEN + ! - melting/not melting snow - + IF (vphysc%smelt(jl,krow).GT.0._dp) THEN + zvd2nof=0.8e-2_dp + zvd4nof=0.2e-2_dp + ELSE + zvd2nof=0.1e-2_dp + zvd4nof=0.025e-2_dp + END IF + ELSE + ! - frozen/not frozen soil - + IF (ptslm1(jl).LE.tmelt) THEN + zvd2nof=0.2e-2_dp + zvd4nof=0.025e-2_dp + ELSE + ! - wet/dry - + ! - completely wet - + IF (pcvw(jl).GE.0.01_dp .OR. pws(jl).EQ.pwsmx(jl)) THEN + zvd2nof=0.8e-2_dp + zvd4nof=0.2e-2_dp + ELSE + ! - dry - + IF ((pws(jl)/pwsmx(jl)).LT.0.9_dp) THEN + zvd2nof=0.2e-2_dp + zvd4nof=0.025e-2_dp + ELSE + ! - partly wet - + zvd2nof=zvwc2*(pws(jl)/pwsmx(jl))-zvw02 + zvd4nof=zvwc4*(pws(jl)/pwsmx(jl))-zvw04 + END IF + END IF + END IF + END IF + zvdrd(jl,1)=pforest(jl)*0.8e-2_dp+(1._dp-pforest(jl))*zvd2nof + zvdrd(jl,2)=pforest(jl)*0.2e-2_dp+(1._dp-pforest(jl))*zvd4nof + END IF + ! + !--- Ask zvdrd for maximum: + ! + zvdrd(jl,1)=MIN(zvdrd(jl,1),zmaxvdry(jl)) + zvdrd(jl,2)=MIN(zvdrd(jl,2),zmaxvdry(jl)) + + END DO + + DO jt=1, ntrac + + IF (trlist%ti(jt)%ndrydep/=1) CYCLE ! only set vd for tracers that request prescribed values + + ! HAM gas-phase tracers + IF (trlist%ti(jt)%basename=='SO2' .OR. & + (trlist%ti(jt)%basename=='SO4'.AND. trlist%ti(jt)%nphase==GAS) ) THEN + + pvd(1:kproma,jt) = zvdrd(1:kproma,1) + + ! HAM aerosol tracers + ELSE IF(trlist%ti(jt)%nphase==AEROSOLMASS .OR. trlist%ti(jt)%nphase==AEROSOLNUMBER) THEN + + SELECT CASE (trlist%ti(jt)%mode) + CASE(1) + pvd(1:kproma,jt) = 0._dp + CASE(2) + pvd(1:kproma,jt) = zvdaitken + CASE(3) + pvd(1:kproma,jt) = zvdrd(1:kproma,2) + CASE(4) + pvd(1:kproma,jt) = zvdcoarse + CASE(5) + pvd(1:kproma,jt) = zvdaitken + CASE(6) + pvd(1:kproma,jt) = zvdrd(1:kproma,2) + CASE(7) + pvd(1:kproma,jt) = zvdcoarse + END SELECT + + END IF + + END DO + +END SUBROUTINE ham_vd_presc +#endif + +END MODULE mo_ham_drydep diff --git a/ifs-source/arpifs/m7/module/mo_ham_init.F90 b/ifs-source/arpifs/m7/module/mo_ham_init.F90 new file mode 100644 index 00000000..c731a845 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_init.F90 @@ -0,0 +1,1197 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_init.f90 +!! +!! \brief +!! Initialisation routines for HAM aerosol model +!! +!! \author Martin Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Martin Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-09-22) +!! -# D. O'Donnell, ETH-Z - added SOA support (2010-04-22) +!! +!! \limitations +!! None +!! +!! \details +!! This module contains the general HAM initialisation routine which is called +!! from submodel_initialise. +!! It first calls setham to initialize ham module variables and read the hamctl namelist. +!! Then other namelists are read and the M7 module is started. Next, the HAM species are +!! defined and the aerosol modes are populated. +!! Adopted from former init_ham routine. Contributors to +!! the code from which the present routines were derived include: +!! P. Stier, D. O'Donnell, K. Zhang +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_init + + IMPLICIT NONE + + PRIVATE + + SAVE + + PUBLIC :: start_ham, & + ham_initialize +#ifdef HAMMOZ + PUBLIC :: ham_init_memory, & + ham_free_memory +#endif + PUBLIC :: ham_define_tracer + + +! Variable declarations + + + CONTAINS + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! start_ham: high-level initialisation routine; interface for HAM aerosol module +!! initialisation including species definition +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! init_submodels +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE start_ham + + USE mo_ham, ONLY : setham +#ifdef HAMMOZ + USE mo_ham_dust, ONLY : setdust +#endif + USE mo_ham, ONLY : naerosol, & + nsoa, & + nham_subm, & + sizeclass, & + nclass, & + HAM_BULK, & + HAM_M7, & + HAM_SALSA, & + subm_naerospec +#ifdef HAMMOZ + USE mo_ham_m7ctl, ONLY : sethamM7 +#endif + USE mo_ham_m7ctl, ONLY : m7_initialize +#ifdef SALSA + USE mo_ham_salsactl, ONLY : setham_salsa + USE mo_ham_salsa_init, ONLY : salsa_initialize +#endif + USE mo_ham_subm_species,ONLY : map_ham_subm_species + USE mo_ham_species, ONLY : ham_species +#ifdef HAMMOZ + USE mo_ham_soa, ONLY : soa_species, start_soa_aerosols + ! >> thk: volatility basis set (VBS) + USE mo_ham_vbsctl, ONLY : setham_vbs, laqsoa + USE mo_ham_vbs, ONLY : vbs_species + ! << thk +#endif + + !-- local variables + LOGICAL :: lsoainclass(nclass) ! copy from sizeclass(:)%lsoainclass for code structure reasons + INTEGER :: jm + + ! -- 1. set default values and read hamctl namelist + + CALL setham +#ifdef HAMMOZ + ! -- read ham_dustctl namelist + CALL setdust +#endif + + SELECT CASE(nham_subm) + + ! Initialization for bulk microphysics + + CASE(HAM_BULK) + + ! CALL sethambulk + + ! -- initialize bulk scheme + ! CALL bulk_initialize + + CASE(HAM_M7) + + + ! -- initialize M7 scheme +#ifdef HAMMOZ + CALL sethamM7 +#endif + CALL m7_initialize +#ifdef SALSA + CASE(HAM_SALSA) + + ! -- initialize SALSA scheme + CALL setham_salsa + CALL salsa_initialize +#endif + END SELECT + + ! -- 3. define aerosol species + CALL ham_species +#ifdef HAMMOZ + SELECT CASE (nsoa) + CASE(1) + CALL soa_species + CASE(2) + CALL setham_vbs + ! this had to be moved here from mo_ham_species, + ! because it caused a circular dependence + CALL vbs_species + END SELECT +#endif + + SELECT CASE (nham_subm) + + CASE(HAM_BULK) + + ! CALL map_bulk_species + + CASE(HAM_M7) + + ! -- map general species list onto M7 condensed list + CALL map_ham_subm_species + + ! -- 4. generate mode x species matrix + CALL ham_define_modes(nclass, naerosol(nham_subm), subm_naerospec) +#ifdef HAMMOZ + IF (nsoa == 1) THEN + DO jm=1,nclass + lsoainclass(jm) = sizeclass(jm)%lsoainclass + END DO + CALL start_soa_aerosols(nclass, lsoainclass) + END IF +#endif +#ifdef SALSA + CASE(HAM_SALSA) + + ! CALL map_salsa_species + CALL map_ham_subm_species + + CALL ham_define_bins(nclass, naerosol(nham_subm), subm_naerospec) +#endif + END SELECT + + + END SUBROUTINE start_ham + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! ham_define_tracer: create ECHAM tracers based on HAM species +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! init_submodels +!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! ### ToDo: complete allocation of burden diagnostics +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE ham_define_tracer + + ! + ! uses local grib table 131 (tracer) + ! codes >= 160 : gas-phase species + ! codes >= 201 : aerosol species + ! + + USE mo_exception, ONLY: message, message_text, em_error + USE mo_species, ONLY: nspec, speclist + USE mo_tracdef, ONLY: OK, RESTART, CONSTANT, INITIAL, & + ON, OFF, itrprog, itrdiag, itrpresc, & + itrnone, & !gf #57 + GAS, GAS_OR_AEROSOL, AEROSOLNUMBER, AEROSOLMASS, & + SOLUBLE, INSOLUBLE, t_flag, ln, ll + USE mo_tracer, ONLY: new_tracer, new_diag_burden +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: BYTRACER, BYSPECIES +#endif + USE mo_physical_constants, ONLY: rhoh2o + USE mo_advection, ONLY: iadvec + USE mo_ham, ONLY: naerocomp, aerocomp, aerowater, & + naerosol,nham_subm,& + ndrydep, nwetdep, nsoa, & + burden_keytype, sizeclass,nclass + USE mo_ham, ONLY: nsol + USE mo_ham_m7_trac, ONLY: idt_cdnc_ham, idt_icnc_ham +#ifdef HAMMOZ + USE mo_ham_soa, ONLY: soaprop, set_soa_tracer_attr +#endif + IMPLICIT NONE + + INTEGER :: jn, jclass, igribc, idt, ierr, jspid + INTEGER :: init, iwrite, iburdenid, idrydep, iwetdep, itran, iconv, ivdiff, iint, isol, isedi + + CHARACTER(LEN=ll) :: trac_lname + CHARACTER(LEN=ln) :: trac_sname + CHARACTER(LEN=ln) :: trac_fullname + CHARACTER(LEN=ln) :: str1 + CHARACTER(LEN=ln) :: csubname + + !>>dod fix for missing gas burdens + CHARACTER(LEN=ln) :: burden_name + !<>dod SOA has unusual tracer handling, let the SOA module set the tracer attributes + IF (nsoa == 1 .AND. ( (ANY(soaprop(:)%spid_tot == jn)) .OR. & + (ANY(soaprop(:)%spid_soa == jn)) ) ) THEN + CALL set_soa_tracer_attr(jn, init, itran, iwrite, iconv, ivdiff, iint, iwetdep, idrydep) + ELSE +#endif + SELECT CASE(speclist(jn)%itrtype) + + CASE(itrprog) + init = RESTART+CONSTANT+INITIAL ! Note: File(s) containing initial values for tracers must be in MMR!!! + iwrite = ON + itran = iadvec ! ++mgs ### was ON + iconv = ON + ivdiff = ON + iint = ON + + CASE(itrdiag) + init = -1 + iwrite = ON + itran = OFF + iconv = ON + ivdiff = ON + iint = OFF + + CASE(itrpresc) + init = -1 + iwrite = OFF + itran = OFF + iconv = OFF + ivdiff = OFF + iint = OFF + idrydep = OFF + iwetdep = OFF + + END SELECT +#ifdef HAMMOZ + END IF +#endif + + csubname = '' + !>>dod fix for missing gas burdens + IF (speclist(jn)%nphase == GAS_OR_AEROSOL) THEN ! if species exists in aerosol and gas phase + csubname = 'gas' + burden_name=TRIM(trac_sname)//'_gas' + ELSE + burden_name=TRIM(trac_sname) + END IF + !<>dod SOA has unusual tracer handling, let the SOA module set the tracer attributes + !>>dod bugfix (redmine #59 and #60) + IF (nsoa == 1 .AND. (ANY(soaprop(:)%spid_soa == jspid) ) ) THEN + CALL set_soa_tracer_attr(jspid, init, itran, iwrite, iconv, ivdiff, iint, iwetdep, idrydep) + !<>gf fix for missing aerosol number burden (#218 Redmine) + IF (burden_keytype == BYTRACER) THEN ! burden per species and per mode (i.e. per tracer) + iburdenid = new_diag_burden('NUM_'//sizeclass(jn)%shortname, itype=1, lclobber=.false.) + ELSE IF (burden_keytype == BYSPECIES) THEN ! burden per species + iburdenid = -1 !SF #299 this diag make no sense. Just set iburdenid to a negative value here + ! so that no burden is computed in this case + END IF + !<>dod fix for missing aerosol water burden + IF (burden_keytype == BYTRACER) THEN ! burden per species and per mode (i.e. per tracer) + iburdenid = new_diag_burden('WAT_'//sizeclass(jn)%shortname, itype=1, lclobber=.false.) + ELSE IF (burden_keytype == BYSPECIES) THEN ! burden per species + iburdenid = new_diag_burden('WAT', itype=1, lclobber=.true.) + END IF + !< 0) THEN + iburdenid = new_diag_burden('CDNC', itype=1, lclobber=.false.) + END IF +! write(3333,*)'CDNC',idt_cdnc_ham + CALL new_tracer('CDNC', 'HAM', ierr=ierr, & + idx=idt_cdnc_ham, & + units='1 kg-1', & + table=131, & + code=131, & + nwrite=ON, & + burdenid=iburdenid, & + nconv=OFF, & + !! nconvmassfix=OFF, & + nvdiff=ON, & + nint=ON, & + longname='cloud droplet number concentration') + + IF (ierr /= OK) THEN + WRITE(message_text,'(a,i0)') 'new_tracer CDNC returned error code ',ierr + CALL message('ham_define_tracer', message_text, level=em_error) + END IF + + iburdenid = 0 + IF (burden_keytype > 0) THEN + iburdenid = new_diag_burden('ICNC', itype=1, lclobber=.false.) + END IF +! write(3333,*)'ICNC',idt_cdnc_ham + CALL new_tracer('ICNC', 'HAM', ierr=ierr, & + idx=idt_icnc_ham, & + units='1 kg-1', & + table=131, & + code=132, & + nwrite=ON, & + burdenid=iburdenid, & + nconv=OFF, & + !! nconvmassfix=OFF, & + nvdiff=ON, & + nint=ON, & + longname='ice crystal number concentration') + + IF (ierr /= OK) THEN + WRITE(message_text,'(a,i0)') 'new_tracer ICNC returned error code ',ierr + CALL message('ham_define_tracer', message_text, level=em_error) + END IF + + END SUBROUTINE ham_define_tracer + + ! -- utility function to allow definition of tracer with same name for gas and aero species + LOGICAL FUNCTION lsubname_needed(i) + + USE mo_species, ONLY: speclist, naerospec, aero_idx + + IMPLICIT NONE + + !---function interface + INTEGER, INTENT(IN) :: i + + !---function variables + INTEGER :: j + + !---executable procedure + + lsubname_needed = .FALSE. + + DO j=1,naerospec + IF (speclist(aero_idx(j))%shortname == speclist(i)%shortname) lsubname_needed = .TRUE. + END DO + + END FUNCTION lsubname_needed + + + SUBROUTINE ham_define_modes(nclass, nsol, naerospec) + + USE mo_exception, ONLY: finish + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so4, & + id_bc, & + id_oc, & + id_ss, & + id_du, & + id_wat + USE mo_ham, ONLY: aerocomp, aerowater, naerocomp, & + new_aerocomp + USE mo_ham_m7ctl, ONLY: inucs, iaits, iaccs, icoas, & + iaiti, iacci, icoai, & + iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, ibcki, & + iocks, iocas, ioccs, iocki, & + issas, isscs, & + iduas, iducs, iduai, iduci + + + INTEGER, INTENT(in) :: nclass ! number of aerosol modes + INTEGER, INTENT(in) :: nsol ! number of soluble modes + INTEGER, INTENT(in) :: naerospec ! number of aerosol species defined + + INTEGER :: jn + + IF (ALLOCATED(aerocomp)) CALL finish('ham_define_modes', 'aerocomp already allocated!') ! ### + ALLOCATE(aerocomp(nclass * naerospec)) + ALLOCATE(aerowater(nsol)) + + !---1) Aerosol compounds in the basic model (SO4, BC, OC, SS, DU) in applicable modes------ + naerocomp = 0 + + !---sulphate in soluble modes + iso4ns = new_aerocomp(inucs, id_so4) + iso4ks = new_aerocomp(iaits, id_so4) + iso4as = new_aerocomp(iaccs, id_so4) + iso4cs = new_aerocomp(icoas, id_so4) + + IF (.NOT. ALLOCATED(speclist(id_so4)%iaerocomp)) ALLOCATE(speclist(id_so4)%iaerocomp(nclass)) + speclist(id_so4)%iaerocomp(:) = 0 + speclist(id_so4)%iaerocomp(inucs) = iso4ns ! ### replaces former im7table construct + speclist(id_so4)%iaerocomp(iaits) = iso4ks + speclist(id_so4)%iaerocomp(iaccs) = iso4as + speclist(id_so4)%iaerocomp(icoas) = iso4cs + + !---black carbon in aitken, accumulation and coarse soluble and aitken insoluble modes + ibcks = new_aerocomp(iaits, id_bc) + ibcas = new_aerocomp(iaccs, id_bc) + ibccs = new_aerocomp(icoas, id_bc) + ibcki = new_aerocomp(iaiti, id_bc) + + IF (.NOT. ALLOCATED(speclist(id_bc)%iaerocomp)) ALLOCATE(speclist(id_bc)%iaerocomp(nclass)) + speclist(id_bc)%iaerocomp(:) = 0 + speclist(id_bc)%iaerocomp(iaits) = ibcks + speclist(id_bc)%iaerocomp(iaccs) = ibcas + speclist(id_bc)%iaerocomp(icoas) = ibccs + speclist(id_bc)%iaerocomp(iaiti) = ibcki + !---organic carbon in aitken, accumulation and coarse soluble and aitken insoluble modes + iocks = new_aerocomp(iaits, id_oc) + iocas = new_aerocomp(iaccs, id_oc) + ioccs = new_aerocomp(icoas, id_oc) + iocki = new_aerocomp(iaiti, id_oc) + + IF (.NOT. ALLOCATED(speclist(id_oc)%iaerocomp)) ALLOCATE(speclist(id_oc)%iaerocomp(nclass)) + speclist(id_oc)%iaerocomp(:) = 0 + speclist(id_oc)%iaerocomp(iaits) = iocks + speclist(id_oc)%iaerocomp(iaccs) = iocas + speclist(id_oc)%iaerocomp(icoas) = ioccs + speclist(id_oc)%iaerocomp(iaiti) = iocki + + !---sea salt in accumulation and coarse soluble modes + issas = new_aerocomp(iaccs, id_ss) + isscs = new_aerocomp(icoas, id_ss) + + IF (.NOT. ALLOCATED(speclist(id_ss)%iaerocomp)) ALLOCATE(speclist(id_ss)%iaerocomp(nclass)) + speclist(id_ss)%iaerocomp(:) = 0 + speclist(id_ss)%iaerocomp(iaccs) = issas + speclist(id_ss)%iaerocomp(icoas) = isscs + + !---dust in accumulation and coarse modes + iduas = new_aerocomp(iaccs, id_du) + iducs = new_aerocomp(icoas, id_du) + iduai = new_aerocomp(iacci, id_du) + iduci = new_aerocomp(icoai, id_du) + + IF (.NOT. ALLOCATED(speclist(id_du)%iaerocomp)) ALLOCATE(speclist(id_du)%iaerocomp(nclass)) + speclist(id_du)%iaerocomp(:) = 0 + speclist(id_du)%iaerocomp(iaccs) = iduas + speclist(id_du)%iaerocomp(icoas) = iducs + speclist(id_du)%iaerocomp(iacci) = iduai + speclist(id_du)%iaerocomp(icoai) = iduci + + !---2) Aerosol water ---------------------------------------------------------------------- +!ham_ps: introduce aerosol water as species, but not component into aerocomp (no new_aerocomp call) +! (this will need revisions) + IF (.NOT. ALLOCATED(speclist(id_wat)%iaerocomp)) ALLOCATE(speclist(id_wat)%iaerocomp(nclass)) + speclist(id_wat)%iaerocomp(:) = -1 +!!$ speclist(id_wat)%iaerocomp(inucs) = 0 +!!$ speclist(id_wat)%iaerocomp(iaits) = 0 +!!$ speclist(id_wat)%iaerocomp(iaccs) = 0 +!!$ speclist(id_wat)%iaerocomp(icoas) = 0 + DO jn = 1,nsol + aerowater(jn)%iclass = jn + aerowater(jn)%species => speclist(id_wat) + aerowater(jn)%spid = id_wat + ! note: %aero_idx and %idt are left undefined and should not be used. + END DO + + END SUBROUTINE ham_define_modes +#ifdef SALSA + SUBROUTINE ham_define_bins(nclass, nsol, naerospec) + ! --A. Laakso (FMI) 2013-05 + + USE mo_exception, ONLY: finish + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so4, & + id_bc, & + id_oc, & + id_ss, & + id_du, & + id_wat + USE mo_ham, ONLY: aerocomp, aerowater, naerocomp, & + new_aerocomp + USE mo_ham_salsactl, ONLY: iso4b, ibcb,iocb,issb, idub, & + in1a, in2a, in2b, & + fn1a, fn2a, fn2b +#ifdef HAMMOZ + ! >> thk: VBS + USE mo_ham, ONLY:& + sizeclass, & + nsoa + + USE mo_ham_vbsctl, ONLY:& + vbs_ngroup, & + vbs_nvocs, & + vbs_voc_prec, & + vbs_set, & + nclass_vbs, & + laqsoa, & + aqsoa_ngroup, & + aqsoa_set, & + nclass_aqsoa + ! << thk +#endif + INTEGER, INTENT(in) :: nclass ! number of aerosol bins + INTEGER, INTENT(in) :: nsol ! number of soluble bins + INTEGER, INTENT(in) :: naerospec ! number of aerosol species defined + + INTEGER :: jn,i + + ! << thk: VBS + INTEGER :: jv, jg, jg2, jc, spid + ! >> thk + + iso4b(:) = 0 + ibcb(:) = 0 + iocb(:) = 0 + issb(:) = 0 + idub(:) = 0 + + IF (ALLOCATED(aerocomp)) CALL finish('ham_define_bins', 'aerocomp already allocated!') ! ### + ALLOCATE(aerocomp(nclass * naerospec)) + ALLOCATE(aerowater(nsol)) + + !---1) Aerosol compounds in the basic model (SO4, BC, OC, SS, DU) in applicable modes------ + naerocomp = 0 + + !---sulphate +!! write(0,*) '### new_ham_aerocomp: id_so4 = ',id_so4 + DO i = in1a,fn2b + iso4b(i) = new_aerocomp(i, id_so4) + END DO + + IF (.NOT. ALLOCATED(speclist(id_so4)%iaerocomp)) ALLOCATE(speclist(id_so4)%iaerocomp(nclass)) + speclist(id_so4)%iaerocomp(:) = 0 + + DO i = in1a,fn2b + speclist(id_so4)%iaerocomp(i) = iso4b(i) + END DO + + !--oc + DO i = in1a,fn2b + iocb(i) = new_aerocomp(i, id_oc) + END DO + IF (.NOT. ALLOCATED(speclist(id_oc)%iaerocomp)) ALLOCATE(speclist(id_oc)%iaerocomp(nclass)) + + speclist(id_oc)%iaerocomp(:) = 0 + DO i = in1a,fn2b + + speclist(id_oc)%iaerocomp(i) = iocb(i) + END DO + + !bc + DO i = in2a,fn2b + ibcb(i) = new_aerocomp(i, id_bc) + END DO + IF (.NOT. ALLOCATED(speclist(id_bc)%iaerocomp)) ALLOCATE(speclist(id_bc)%iaerocomp(nclass)) + speclist(id_bc)%iaerocomp(:) = 0 + DO i = in2a,fn2b + speclist(id_bc)%iaerocomp(i) = ibcb(i) + END DO + + + + !dust + DO i = in2a,fn2b + idub(i) = new_aerocomp(i, id_du) + END DO + + IF (.NOT. ALLOCATED(speclist(id_du)%iaerocomp)) ALLOCATE(speclist(id_du)%iaerocomp(nclass)) + speclist(id_du)%iaerocomp(:) = 0 + + DO i = in2a,fn2b + speclist(id_du)%iaerocomp(i) = idub(i) + END DO + + !seasalt, only soluble + DO i = in2a,fn2a + issb(i) = new_aerocomp(i, id_ss) + END DO + IF (.NOT. ALLOCATED(speclist(id_ss)%iaerocomp)) ALLOCATE(speclist(id_ss)%iaerocomp(nclass)) + speclist(id_ss)%iaerocomp(:) = 0 + DO i = in2a,fn2a + speclist(id_ss)%iaerocomp(i) = issb(i) + END DO +#ifdef HAMMOZ + ! >> thk: VBS + IF (nsoa == 2) THEN + ! creating the per-class aerosol tracers + DO jg = 1,vbs_ngroup + spid = vbs_set(jg)%spid + + ! allocating memory for aerosol tracer indices in vbs_set + IF (.NOT. ALLOCATED(vbs_set(jg)%idx)) THEN + ALLOCATE(vbs_set(jg)%idx(nclass)) + END IF + vbs_set(jg)%idx(:) = 0 + + IF (vbs_set(jg)%lcreateaero) THEN + + ! allocating memory for aerosol tracer indices in speclist + IF (.NOT. ALLOCATED(speclist(spid)%iaerocomp)) THEN + ALLOCATE(speclist(spid)%iaerocomp(nclass)) + END IF + speclist(spid)%iaerocomp(:) = 0 + + ! creating tracers and saving id's + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + vbs_set(jg)%idx(i) = new_aerocomp(i, spid) + speclist(spid)%iaerocomp(i) = vbs_set(jg)%idx(i) + END IF + END DO + ELSE + + ! getting the tracer ids from the given spid: + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + vbs_set(jg)%idx(i) = speclist(vbs_set(jg)%spid_aero)%iaerocomp(i) + END IF + END DO + END IF + END DO + ! counting all modes/bins that include VBS soa: + nclass_vbs = 0 + DO jc = 1,nclass + IF (sizeclass(jc)%lsoainclass) nclass_vbs = nclass_vbs+1 + END DO + + IF (laqsoa) THEN + ! creating the per-class aerosol tracers + DO jg2 = 1,aqsoa_ngroup + spid = aqsoa_set(jg2)%spid + + + ! allocating memory for aerosol tracer indices in aqsoa_set + IF (.NOT. ALLOCATED(aqsoa_set(jg2)%idx)) THEN + ALLOCATE(aqsoa_set(jg2)%idx(nclass)) + END IF + aqsoa_set(jg2)%idx(:) = 0 + + IF (aqsoa_set(jg2)%lcreateaero) THEN + + ! allocating memory for aerosol tracer indices in speclist + IF (.NOT. ALLOCATED(speclist(spid)%iaerocomp)) THEN + ALLOCATE(speclist(spid)%iaerocomp(nclass)) + END IF + speclist(spid)%iaerocomp(:) = 0 + + ! creating tracers and saving id's + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + aqsoa_set(jg2)%idx(i) = new_aerocomp(i, spid) + speclist(spid)%iaerocomp(i) = aqsoa_set(jg2)%idx(i) + END IF + END DO + ELSE + + ! getting the tracer ids from the given spid: + DO i = 1, nclass + IF (sizeclass(i)%lsoainclass) THEN + aqsoa_set(jg2)%idx(i) = speclist(aqsoa_set(jg2)%spid_aero)%iaerocomp(i) + END IF + END DO + END IF + END DO + ! counting all modes/bins that include wet soa: + nclass_aqsoa = 0 + DO jc = 1,nclass + IF (sizeclass(jc)%lsoainclass) nclass_aqsoa = nclass_aqsoa+1 + END DO + + END IF ! laqsoa + END IF ! nsoa == 2 + ! << thk +#endif + !---2) Aerosol water ---------------------------------------------------------------------- +!ham_ps: introduce aerosol water as species, but not component into aerocomp (no new_aerocomp call) +! (this will need revisions) no sepa kiva + IF (.NOT. ALLOCATED(speclist(id_wat)%iaerocomp)) ALLOCATE(speclist(id_wat)%iaerocomp(nclass)) + speclist(id_wat)%iaerocomp(:) = -1 + DO jn = 1,nsol + aerowater(jn)%iclass = jn + aerowater(jn)%species => speclist(id_wat) + aerowater(jn)%spid = id_wat + ! note: %aero_idx and %idt are left undefined and should not be used. + END DO + + END SUBROUTINE ham_define_bins +#endif + + SUBROUTINE ham_initialize + + ! Purpose: + ! --------- + ! Initializes constants and parameters used in the HAM aerosol model. + ! Performs consistency checks. + ! + ! Author: + ! --------- + ! Philip Stier, MPI 03/2003 + ! Martin Schultz, FZJ 09/2009 - renamed to ham_ + ! - cleanup + ! + ! Interface: + ! --------- + ! *ham_initialize* is called from *init_subm* in mo_submodel_interface + ! needs to be called after initialization of the + ! submodel as it may make use of parameters in mo_ham_m7ctl, + ! + + USE mo_exception, ONLY: message, em_error + USE mo_ham, ONLY: naerorad,nclass, nham_subm, & + HAM_BULK, & + HAM_M7, & + HAM_SALSA + USE mo_ham_m7ctl, ONLY: nwater +!#ifdef HAMMOZ + USE mo_ham_rad, ONLY: ham_rad_initialize +!#endif + USE mo_ham_kappa, ONLY: start_kappa + USE mo_ham_m7_trac, ONLY: ham_M7_set_idt +#ifdef SALSA + USE mo_ham_salsa_trac, ONLY: ham_salsa_set_idt +#endif + USE mo_activ, ONLY: nfrzmod + !>>dod (redmine #44) import of seasalt emission schemes from HAM2 +!#ifdef HAMMOZ + USE mo_ham_m7_emi_seasalt, ONLY: start_emi_seasalt +!#endif + !<>SF #390 (for security) + USE mo_param_switches, ONLY: lcdnc_progn + USE mo_ham, ONLY: nwetdep +!<0) CALL ham_rad_initialize(nclass) +!#endif + IF (nwater == 1 .AND. nham_subm == HAM_M7) CALL start_kappa + !>>dod (redmine #44) import of seasalt emission schemes from HAM2 +!#ifdef HAMMOZ + ! This is needed only if nseasalt=8 in OIFS + CALL start_emi_seasalt + + !<>SF security + IF (nfrzmod /= 1) THEN + call message('ham_initialize','nfrzmod must be equal to 1!',level=em_error) + ENDIF +!<>SF #390 + IF (.NOT. lcdnc_progn .AND. nwetdep == 3) THEN + call message('ham_initialize','nwetdep = 3 is not possible when lcdnc_progn is false!',level=em_error) + ENDIF +!<>dod<< +!!mgs!! CALL construct_stream_input + IF (naerorad>0) CALL new_stream_ham_rad !Philip +#ifdef HAMMOZ + IF (lgcr) CALL gcr_initialize !Jan + IF (nham_subm == HAM_M7) THEN + IF (nsnucl+nonucl.gt.0) CALL ham_nucl_initialize !Jan + IF (lnucl_stat) CALL ham_nucl_diag_initialize !Jan + ENDIF +#endif + IF (nsoa == 1) CALL construct_soa_streams !Declan + + END SUBROUTINE ham_init_memory + + + ! --- release of memory + + SUBROUTINE ham_free_memory + + USE mo_ham, ONLY: naerorad, nham_subm, HAM_M7, lgcr + USE mo_ham_rad, ONLY: ham_rad_mem_cleanup + USE mo_ham_dust, ONLY: bgc_dust_cleanup + USE mo_ham_m7ctl, ONLY: nsnucl, nonucl, lnucl_stat, nwater + USE mo_ham_gcrion, ONLY: gcr_cleanup + USE mo_ham_m7_nucl, ONLY: ham_nucl_cleanup + USE mo_ham_m7_nucl_diag, ONLY: ham_nucl_diag_cleanup + USE mo_ham_kappa, ONLY: term_kappa + + IMPLICIT NONE + + IF (nham_subm == HAM_M7) THEN + IF (nwater == 1) CALL term_kappa + IF (nsnucl+nonucl.gt.0) CALL ham_nucl_cleanup + IF (lnucl_stat) CALL ham_nucl_diag_cleanup + ENDIF + IF (naerorad>0) CALL ham_rad_mem_cleanup + CALL bgc_dust_cleanup + IF (lgcr) CALL gcr_cleanup + + END SUBROUTINE ham_free_memory +#endif +END MODULE mo_ham_init + + + + + + diff --git a/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 b/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 new file mode 100644 index 00000000..98456388 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_kappa.F90 @@ -0,0 +1,401 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_kappa.f90 +!! +!! \brief +!! Defines data for ham_kappa routine in mo_m7 +!! +!! \author Declan O'Donnell (MPI-M) +!! +!! \responsible_coder +!! Declan O'Donnell, declan.odonnell@fmi.fi +!! +!! \revision_history +!! -# Declan O'Donnell (MPI-Met) - original code (2007) +!! -# Declan O'Donnell (FMI) - lookup table version 2 (2014) +!! +!! \limitations +!! None +!! +!! \details +!! ham_kappa implements the parameterisation of the hygroscopic +!! growth of aerosols, as measured by the growth factor (gf), as a +!! function of the hygroscopicity parameter kappa and +!! the ambient temperature and relative humidity. The relation is: +!! [ A ] (gf**3 -1) +!! RH*exp[- ----- ] = ---------------- +!! [ Rd*gf ] gf**3 - (1-kappa) +!! +!! (eqn 11 of M.D. Petters and S.M. Kreidenweis, ACP 7, 2007, see +!! bibliographic references below) +!! +!! The above-quoted equation from the cited Petters & Kreidenweis paper expresses +!! the hygroscopic growth factor (gf) as a function of aerosol dry radius (Rd), +!! temperature (T), relative humidity (rh) and a substance property denoted kappa +!! that encapsulates hygroscopic properties of that substance. This transcendental +!! equation is solved offline for various Rd, T, rh and kappa of atmospheric +!! relevance and the results stored in a lookup table. +!! The m7 subroutine ham_kappa uses the ambient T and rh, uses the mode count median +!! dry radius and the volume-weighted average kappa to find the entry point into +!! the GF lookup table. Using the growth factor the wet median radius and water +!! uptake of the mode are calculated. +!! +!! This module contains relevant constants and a routine to read the lookup table +!! +!! NEW FOR VERSION 2 LOOKUP TABLE +!! ============================== +!! In version 1, the relative humidity axis consists of evenly-spaced increments starting +!! at 0.15 and ending at 0.95. This has several problems. Firstly, the maximum value is +!! too low which causes a significant underestimate of hygroscopic growth at high RH. +!! Secondly, the growth factor (GF) is highly sensitive to RH at high RH +!! values, but not at low RH. This means that the coarse, even spacing of the RH axis values +!! results in inaccurate GF estimates at high RH. Thirdly, GF is very low at low RH and +!! in practice we can neglect it below rh of 0.3 (or perhaps 0.4). +!! Version 2 of the lookup table implements a RH axis that has uneven value spacing, +!! monotonically decreasing from the minimum RH (now 0.3) to the maximum (now 0.995). +!! +!! The nth RH axis value is now given by +!! RH(n) = RH(n-1) + deltaRH*c**(n-1), n=1,2,3... +!! where c is a constant (c < 1) and deltaRH is the initial spacing factor (i.e. RH(1)-RH(0)). +!! c is chosen to be 0.96, RH(0) = 0.30 and deltaRH = 0.03 for practical reasons. +!! c and deltaRH are obtained from the lookup table by: +!! +!! deltaRH = RH(1) - RH(0) (actually RH(2)-RH(1) since fortran does not use zero indexing) +!! c = (RH(2) - RH(1))/deltaRH (again add 1 to index for fortran implementation) +!! +!! Other changes: +!! The water uptake is almost totally insensitive to the temperature value (in the kappa-koehler +!! equation considered as an independent variable from RH). Accordingly, the temperature axis has been +!! reduced in range and more coarsely spaced. Taking advantage of the resulting size (=memory) +!! saving, the dry radius axis is more finely spaced. +!! The kappa axis is slightly reduced by removing values above the range in the model (max. now 1.12). +!! Lastly, version number is included in the file as a string "x.y". x is intended to denote a major +!! revision (which I define as any revision that requires an update to the HAMMOZ fortran code) +!! and y is a minor revision (anything else). Note this means that minor revisions in the file can +!! result in major changes in model results and vice-versa. +!! +!! NB This implementation is compatible with both versions 1 and 2 of the lookup table. The same +!! file name is expected (lut_kappa.nc). However, version 1 is DEPRECATED and should be phased out. +!! +!! \bibliographic_references +!! M.D. Petters and S.M. Kreidenweis, A single parameter representation of hygroscopic +!! growth and cloud condensation nucleus activity, ACP 7, 1961-1971, 2007 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_kappa + + !--- inherited types, functions and data + USE mo_kind, ONLY: dp + +!#ifdef _OPENMP +! use omp_lib +!#endif + IMPLICIT NONE + + !--- public member functions + PUBLIC :: start_kappa, term_kappa + + !--- module parameters + !>>dod redmine #260 ... also removed unused parameter sigma_sa + INTEGER, PUBLIC :: lut_kappa_version ! Lookup table version + !<>dod redmine #260 + ! For non-linear spacing of the RH axis in version 2: initial rh, initial step size + ! (plus its reciprocal) and step compression factor (plus its log) + REAL(dp), PUBLIC :: rh_init_step + REAL(dp), PUBLIC :: inv_rh_init_step + REAL(dp), PUBLIC :: rh_step_compress + REAL(dp), PUBLIC :: log_rh_step_compress + !<>dod redmine #260 + !--- read file version (not included in version 1, so default to that version if + ! the version attribute is missing) + ! ECHAM's implementation is poor: instead of writing "not available" in the attribute + ! value string when the requested attribute is not found, it overwrites the + ! attribute name + attrname = cattr_version + CALL IO_GET_ATT_TEXT(zncid, nf_global, attrname, versval) + + IF (TRIM(attrname) == "not available") THEN + lut_kappa_version = 1 + versval="1.0" + CALL message('mo_ham_kappa.start_kappa', & + 'Deprecated lookup table version! Consider updating to the latest version', level=em_warn) + ELSE + versmaj = versval(1:1) + IF (versmaj == "2") THEN + lut_kappa_version = 2 + ELSE + CALL finish('mo_ham_kappa.start_kappa', & + 'Lookup table '//TRIM(lut_fn)//' version '//versval//' not supported') + END IF + END IF + !<>dod redmine #260 + CALL p_bcast(lut_kappa_version, p_io) + !<>dod redmine #260 + CALL p_bcast(rh_init_step, p_io) + CALL p_bcast(inv_rh_init_step, p_io) + CALL p_bcast(rh_step_compress, p_io) + CALL p_bcast(log_rh_step_compress, p_io) + !< +!! \filename +!! mo_ham_m7.f90 +!! +!! \brief +!! Module to provide interface to the M7 aerosol microphysics scheme +!! +!! \author Martin G. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# The original code is from J. Feichter, J. Wilson and E. Vignatti, JRC Ispra +!! and was adapted for ECHAM by P. Stier, Oxford. Other contributions include +!! D. O'Donnell, K. Zhang and others +!! -# M.G. Schultz (FZ Juelich) - new code structure for integration into echam6-hammoz (2009-09-24) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! -# H. Kokkola (FMI) - moved and renamed m7_interface into a general ham_subm_interface routine +!! +!! \limitations +!! None +!! +!! \details +!! This module contains the m7_interface routine and all individual routines +!! which make up M7. Parameter lists and flags are defined in mo_ham_m7ctl. +!! This module contains the following subroutines which used to be individual files. +!! m7_cumulative_normal (renamed from m7_cumnor) +!! m7 +!! m7_averageproperties +!! m7_kappa +!! m7_equiz +!! m7_equimix +!! m7_equil +!! m7_h2so4_cs +!! m7_prod_cond +!! m7_nuck +!! m7_dnum +!! m7_dconc +!! m7_dconc_soa +!! m7_coaset +!! m7_concoag +!! m7_delcoa +!! +!! \bibliographic_references +!! - Vignati E., Wilson J. and Stier P., M7: a size resolved aerosol mixture module +!! for the use in global aerosol models, JGR 109, D22 202, doi:10.1029/2003JD004 485, 2004. +!! - Stier P. et al, The aerosol-climate model ECHAM5-HAM, ACP, 5, 1125–1156, 2005 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_m7 + + USE mo_kind, ONLY: dp, THRESHOLD + USE parkind1, ONLY: JPRD + + IMPLICIT NONE + + PRIVATE + PUBLIC :: m7, m7_cumulative_normal + + !REAL(dp), PUBLIC, ALLOCATABLE :: rwet_m7(:,:,:), rdry_m7(:,:,:) + !REAL(dp), PUBLIC, ALLOCATABLE :: densaer_m7(:,:,:), aerwat_m7(:,:,:) + +CONTAINS + + +! --------------------------------------------------------------------------- + +SUBROUTINE m7_cumulative_normal ( arg, presult, ccum ) + ! + !******************************************************************************* + ! + !! CUMNOR computes the cumulative normal distribution. + ! + ! + ! the integral from -infinity to x of + ! (1/sqrt(2*pi)) exp(-u*u/2) du + ! + ! Author: + ! ------- + ! Original source: + ! + ! W. J. Cody Mathematics and Computer Science Division + ! Argonne National Laboratory + ! Argonne, IL 60439 + ! + ! DCDFLIB is attributed to Barry Brown, James Lovato, and Kathy Russell + ! bwb@odin.mda.uth.tmc.edu. + ! + ! Adopted to ECHAM/M7: + ! + ! Philip Stier (MPI-MET) 2001 + ! + ! + ! Reference: + ! ---------- + ! + ! W D Cody, + ! "ALGORITHM 715: SPECFUN - A Portable FORTRAN Package of Special + ! Function Routines and Test Drivers" + ! ACM Transactions on Mathematical Software, + ! Volume 19, 1993, pages 22-32. + ! + ! Parameters: + ! + ! ARG --> Upper limit of integration. + ! X is double precision + ! + ! RESULT <-- Cumulative normal distribution. + ! RESULT is double precision + ! + ! CCUM <-- Complement of Cumulative normal distribution. + ! CCUM is double precision + ! + ! + ! Original Comments: + ! + ! + ! This function evaluates the normal distribution function: + ! + ! / x + ! 1 | -t*t/2 + ! P(x) = ----------- | e dt + ! sqrt(2 pi) | + ! /-oo + ! + ! The main computation evaluates near-minimax approximations + ! derived from those in "Rational Chebyshev approximations for + ! the error function" by W. J. Cody, Math. Comp., 1969, 631-637. + ! This transportable program uses rational functions that + ! theoretically approximate the normal distribution function to + ! at least 18 significant decimal digits. The accuracy achieved + ! depends on the arithmetic system, the compiler, the intrinsic + ! functions, and proper selection of the machine-dependent + ! constants. + ! + ! + USE mo_kind, ONLY: dp + ! + IMPLICIT NONE + ! + REAL(dp), INTENT(IN) :: arg + REAL(dp), INTENT(OUT) :: ccum + REAL(dp), INTENT(OUT) :: presult + + presult = 0.5_dp * (1.0_dp + erf(arg / sqrt(2.0_dp))) + ccum = 0.5_dp * erfc(arg / sqrt(2.0_dp)) + +END SUBROUTINE m7_cumulative_normal + +! --------------------------------------------------------------------------- + +SUBROUTINE m7(kproma, kbdim, klev, krow, & + papp1, ptp1, prhp1, & + !>>dod soa + pgas, & + !<>dod soa + USE mo_ham, ONLY: nsoa, naerocomp, nclass, nsol, lscond, lscoag + !<>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, & + timer_ham_m7_avg, timer_ham_m7_hygro, & + timer_ham_m7_cs, timer_ham_m7_cond, & + timer_ham_m7_nucl, & + timer_ham_m7_dnum, timer_ham_m7_redistr + !<>dod soa + REAL(dp) :: pgas(kbdim,klev,subm_ngasspec) ! gas phase tracers + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_avg) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_avg) + CALL timer_start(timer_ham_m7_hygro) + END IF + !<>dod soa + IF (nsoa == 0) & + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_hygro) + CALL timer_start(timer_ham_m7_cs) + END IF + !<>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_cs) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_cond) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_cond) + CALL timer_start(timer_ham_m7_nucl) + END IF + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_nucl) + CALL timer_start(timer_ham_m7_dnum) + END IF + !<>dod soa: added zttn + zso4_5, zso4_6, zso4_7, zanew, za4delt, zttn) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_dnum) + CALL timer_start(timer_ham_m7_avg) + END IF + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_avg) + CALL timer_start(timer_ham_m7_hygro) + END IF + !<>dod soa + IF (nsoa == 0) & + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_hygro) + CALL timer_start(timer_ham_m7_redistr) + END IF + !<>dod merged HAM R2 versions of m7_dconc + IF (lscond .OR. lscoag .OR. nsoa == 1) THEN + + CALL m7_dconc(kproma, kbdim, klev, krow, paerml, paernl, pm6dry) + + END IF + do jclass=1,nclass + zout3(1:kproma,KLEV,nclass+naerocomp+jclass)=paernl(1:kproma,klev,jclass) + end do + do jn=1,naerocomp + zout3(1:kproma,KLEV,nclass+naerocomp+nclass+jn)=paerml(1:kproma,klev,jn) + end do +!zout3(1:kproma,KLEV,14)=pm6dry(1:kproma,klev,iaccs) +! zout3(1:kproma,KLEV,3)=paernl(1:kproma,klev,iaccs) + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_redistr) + CALL timer_start(timer_ham_m7_avg) + END IF + !<>dod timers + IF (ltimer) THEN + CALL timer_stop(timer_ham_m7_avg) + CALL timer_start(timer_ham_m7_hygro) + END IF + !<>dod soa + IF (nsoa == 0) & + !<HK + !IF (.NOT. ALLOCATED(rwet_m7)) ALLOCATE(rwet_m7(kbdim,klev,nclass)) + !IF (.NOT. ALLOCATED(rdry_m7)) ALLOCATE(rdry_m7(kbdim,klev,nsol)) + !IF (.NOT. ALLOCATED(densaer_m7)) ALLOCATE(densaer_m7(kbdim,klev,nclass)) + !IF (.NOT. ALLOCATED(aerwat_m7)) ALLOCATE(aerwat_m7(kbdim,klev,nclass)) + + !!!rwet_m7(1:kproma,:,:) = pm6rp(1:kproma,:,:)/100._dp + !!!rdry_m7(1:kproma,:,:) = pm6dry(1:kproma,:,:)/100._dp + !!!densaer_m7(1:kproma,:,:) = prhop(1:kproma,:,:)*1000._dp !eehol: g/cm3 to kg/m3 + !!!aerwat_m7(1:kproma,:,:) = pww(1:kproma,:,:) + !<--HK +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_hygro) + !<>dod soa + pgas(1:kproma,:,isubm_so4g) = pso4g(1:kproma,:) + !<>dod + REAL(dp), PARAMETER :: fac_ug = 1.E-12_dp ! conversion of ug m-3 -> g cm-3 + REAL(dp), PARAMETER :: fac_molec = 1._dp ! sulphate: no unit conversion + REAL(dp), PARAMETER :: z4piover3 = 4._dp*pi/3._dp + !<>SF #458 (replacing WHERE statements) + zaltern_val = MERGE(critn, 0._dp, (jn == iso4ns)) + ll1(1:kproma,:) = (paernl(1:kproma,:,jclass) > cmin_aernl) & + .AND. (paerml(1:kproma,:,jn) > cmin_aerml) + + ztmp1(1:kproma,:) = MERGE(paernl(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. + ztmp2(1:kproma,:) = zunitfac*paerml(1:kproma,:,jn)/ztmp1(1:kproma,:) + pttn(1:kproma,:,jn) = MERGE(ztmp2(1:kproma,:), zaltern_val, ll1(1:kproma,:)) + !<>SF #458 (replacing WHERE statements) + ll1(1:kproma,:) = (paernl(1:kproma,:,jclass) > cmin_aernl) & + .AND. (zinsvol(1:kproma,:,jclass) > cminvol) + + ztmp1(1:kproma,:) = MERGE(zinsvol(1:kproma,:,jclass), 1._dp, ll1(1:kproma,:)) !SF 1. is a dummy val. + + ztmp2(1:kproma,:) = zinsmas(1:kproma,:,jclass) / ztmp1(1:kproma,:) + prhop(1:kproma,:,jclass) = MERGE(ztmp2(1:kproma,:), prhop(1:kproma,:,jclass), ll1(1:kproma,:)) + + ztmp2(1:kproma,:) = ram2cmr(jclass)*((ztmp1(1:kproma,:)/z4piover3)**(1._dp/3._dp)) + + ! Use cminrad as fallback instead of keeping stale pm6rp? TODO check + pm6rp(1:kproma,:,jclass) = MERGE(ztmp2(1:kproma,:), pm6rp(1:kproma,:,jclass), ll1(1:kproma,:)) + + !< cminrad + REAL(dp) :: zww_tmp(kbdim,klev) ! tmp duplicate of pww + REAL(dp) :: zm6rp_tmp(kbdim,klev) ! tmp duplicate of pm6rp + REAL(dp) :: zrhop_tmp(kbdim,klev) ! tmp duplicate of prhop + REAL(dp) :: zgf ! growth factor + REAL(dp) :: zunitfac, zmass, zdensity, zvolume + REAL(dp) :: zwetvol, zdvol, zwatervol, zwatermass + REAL(dp) :: zTrange, zRHrange, zKrange, zRDrange + REAL(dp) :: ztsteps, zrhsteps, zksteps, zrdsteps + REAL(dp) :: zt1, zrh1, zk1, zr1, zr2, zr3 + + LOGICAL :: ll1(kbdim,klev) + + INTEGER :: ix_rd, ix_k ! index to radius and kappa in lookup table + INTEGER :: ix_t(kbdim,klev) ! index to temperature in lookup table + INTEGER :: ix_rh(kbdim,klev) ! index to RH in lookup table + INTEGER :: jk, jl, jn, jclass, jspec ! loop counters + + !--- executable procedure + + !---initialisations + zdrymass(:,:,:) = 0._dp + zdryvol(:,:,:) = 0._dp + zkappa(:,:,:) = 0._dp + + !---range of possible values of temperature, RH, kappa and radius in the lookup table: + zTrange = T_max-T_min + zRHrange = rh_max-rh_min + zKrange = kappa_max-kappa_min + zRDrange = ln_Rd_max - ln_Rd_min + + ztsteps = REAL((N_t-1),dp) ! number of steps on the temp axis + zrhsteps = REAL((N_rh-1),dp) ! number of steps on the RH axis + zksteps = REAL((N_kappa-1),dp) ! number of steps on the kappa axis + zrdsteps = REAL((N_Rd-1),dp) ! number of steps on the radius axis + + !---since temperature and RH are independent of mode and species we can + ! calculate the coordinate value for the lookup table just once + ! rather than per mode, so we do this for the first loop iteration only + DO jk=1,klev + DO jl=1,kproma + + zt1 = MAX(ptp1(jl,jk), T_min) ! limit to at least T_min + zt1 = MIN(zt1, T_max) ! limit to at most T_max + ix_t(jl,jk) = 1 + NINT(ztsteps*(zt1-T_min)/zTrange) ! linear interpolation from actual + ! temperature to lookup table entry + !>>dod redmine #260 + END DO + END DO + + IF (lut_kappa_version == 1) THEN + DO jk=1,klev + DO jl=1,kproma + zrh1 = MAX(prelhum(jl,jk), rh_min) ! limit to at least RH_min + zrh1 = MIN(zrh1, rh_max) ! limit to at most T_max + ix_rh(jl,jk) = 1 + NINT(zrhsteps*(zrh1-rh_min)/zRHrange) ! linear interpolation from actual + ! RH to lookup table entry + END DO + END DO + ELSE ! lookup table version 2 + DO jk=1,klev + DO jl=1,kproma + ix_rh(jl,jk) = CEILING( & ! see redmine #260 + (LOG(1._dp-(1._dp-rh_step_compress)*(prelhum(jl,jk)-rh_min)*inv_rh_init_step)) & + / log_rh_step_compress ) + ix_rh(jl,jk) = MAX(ix_rh(jl,jk),1) + ix_rh(jl,jk) = MIN(ix_rh(jl,jk),N_rh) + END DO + END DO + END IF + !< cminrad ) + zm6dry_safe(1:kproma,:) = MERGE(pm6dry(1:kproma,:,jclass), cminrad, ll1(1:kproma,:)) + !SFNote: cminrad is dummy in the above line. This is merely a protection against LOG(0.) later on + + DO jk = 1,klev + DO jl = 1,kproma + + zk1 = MAX (zkappa(jl,jk,jclass), kappa_min) ! limit to at least kappa_min + + zk1 = MIN(zk1, kappa_max) ! limit to at most kappa_max + ix_k = 1 + NINT(zksteps*(zk1-kappa_min)/zKrange) ! linear interpolation from actual + ! kappa to lookup table entry + + zr1 = 1.E-2_dp*zm6dry_safe(jl,jk) ! LOG of radius in m. + zr2 = LOG(zr1) + + zr3 = MAX(zr2, ln_Rd_min) ! limit to at least Rd_min + zr3 = MIN(zr3, ln_Rd_max) ! limit to at most Rd_max + ix_rd = 1 + NINT(zrdsteps*(zr3-ln_Rd_min) / zRDrange ) ! to lookup table entry + + !---get the growth factor + zgf = gf(ix_rd, ix_t(jl,jk), ix_rh(jl,jk), ix_k) + + !---wet radius = dryradius * growth factor + zm6rp_tmp(jl,jk) = zm6dry_safe(jl,jk) * zgf + + !---calculate water uptake and wet count median radius + ! We assume that the volume of dissolved material is the same as the volume of + ! the dry material. + + zdvol = z4piover3*(cmr2ram(jclass)*zm6dry_safe(jl,jk))**3 + zwetvol = z4piover3*(cmr2ram(jclass)*zm6rp_tmp(jl,jk))**3 + + zwatervol = zwetvol - zdvol + + zwatermass = 1._dp * zwatervol ! water in g per particle + + !---aerosol water in kg m-3 + zww_tmp(jl,jk) = 1.E3_dp*paernl(jl,jk,jclass)* zwatermass + + zrhop_tmp(jl,jk) = (zdrymass(jl,jk,jclass) + zwatermass) / zwetvol + + END DO + END DO + + pww(1:kproma,:,jclass) = MERGE(zww_tmp(1:kproma,:), 0._dp, ll1(1:kproma,:)) + pm6rp(1:kproma,:,jclass) = MERGE(zm6rp_tmp(1:kproma,:), pm6dry(1:kproma,:,jclass), ll1(1:kproma,:)) + prhop(1:kproma,:,jclass) = MERGE(zrhop_tmp(1:kproma,:), 1._dp, ll1(1:kproma,:)) + + END IF + END DO + +END SUBROUTINE m7_kappa + + +SUBROUTINE m7_equiz(kproma, kbdim, klev, krow, & + papp1, pttn, ptp1, & + prelhum, pm6rp, pm6dry, & + prhop, pww, paernl ) + ! + ! *m7_equiz* calculates the ambient radii of the sulphate particles + ! + ! Authors: + ! -------- + ! J. Wilson, E. Vignati, JRC/EI (original source) 05/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! + ! Purpose: + ! -------- + ! This routine calculates the ambient radii for sulfate particles + ! with mass of ttn molecules, converts them to count mean radii and + ! stores them in the array with address pm6rp. + ! It additionally calculates the ambient particle density. + ! + ! Method: + ! ------- + ! The calculations of the ambient particle properties are based on + ! parameterisations of the mass of sulfate and density derived + ! by Julian Wilson from a regression analysis of results of solving + ! the generalised Kelvin equation using (F. J. Zeleznik, J. Phys. Chem. + ! Ref. Data 20, 1157, 1991), for an H2SO4-H2O mixture, in the + ! following parameter ranges: + + ! 1e2 < pttn < 1E11 [molecules] + ! 0.2 < prelhum < 0.9 [1] + ! 240 < ptp1 < 330 [K] + ! 10000 < papp1 < 100000 [Pa] + ! + ! Due to the limitations of the parametrisation, the ambient temperature + ! is restricted to a minimum of 240 K within this subroutine. + ! + ! Interface: + ! ---------- + ! *m7_equiz* is called from *m7* and *m7_dconc* + ! + ! Externals: + ! ---------- + ! none + ! + ! + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_math_constants, ONLY: pi + USE mo_ham_m7ctl, ONLY: dh2so4, dh2o, & + wvb, gmb, wh2so4, ram2cmr, cmin_aerml + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so4 + USE mo_ham, ONLY: naerocomp, aerocomp, sizeclass, nclass, nsol + ! + ! pttn = average mass for single compound in each mode + ! [in molec. for sulphate and in ug for bc, oc, ss, and dust] + ! pm6rp = count mean radius under ambient conditions [cm] + ! pm6dry = count mean radius under dry conditions [cm] + ! paernl = aerosol number for each mode [cm-3] + ! pww = aerosol water content for each mode [kg(water) m-3(air)] + ! zwso4 = percentage by mass of sulfate in a H2O-H2SO4 particle + ! containing pttn molecules of sulfate under ambient conditions + ! zvso4 = volume of pttn molecules of sulfate [cm3] + ! zmso4 = mass of pttn molecules of sulfate [g] + ! zdso4h2o = density of sulfate-h2o fraction of a particle with average + ! mass [g.cm-3] + ! zmso4h2o = mass of sulfate-h2o fraction of a particle with average mass [g] + ! zvso4h2o = volume of sulfate-h2o fraction of a particle with average + ! mass [cm3] + + IMPLICIT NONE + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: papp1(kbdim,klev), ptp1(kbdim,klev), & + prelhum(kbdim,klev) + + REAL(dp):: pttn(kbdim,klev,naerocomp), prhop(kbdim,klev,nclass), & + pm6dry(kbdim,klev,nsol), pm6rp(kbdim,klev,nclass), & + pww(kbdim,klev,nclass), paernl(kbdim,klev,nclass) + + !--- Local variables: + + INTEGER :: jk, jl, jclass, jn + + REAL(dp) :: zaerelse(kbdim,klev,nsol) + + REAL(dp):: zwso4, zvso4, zmso4, & + zvso4h2o, zmso4h2o, zdso4h2o, & + zapp1, ztk, zrh + + REAL(dp):: ztk2, zln3, zln32, & + zlnm, zss2, zlnm2 + + INTEGER :: ixso4 + !------------------------------------------------------------------------------ + + zaerelse(:,:,:) = 0._dp + + !--- 1) Determine mass of non sulfate compounds in a particle: --------- + + DO jn = 1,naerocomp ! for each mode+species + jclass = aerocomp(jn)%iclass ! check if the species is NOT sulphate + ! if so, add to the total mode non-S mass + IF (aerocomp(jn)%spid /= id_so4 .AND. & + sizeclass(jclass)%lsoluble) THEN + zaerelse(1:kproma,:,jclass) = zaerelse(1:kproma,:,jclass) + pttn(1:kproma,:,jn) + END IF + + END DO + + DO 100 jclass=1,nsol + ixso4 = speclist(id_so4)%iaerocomp(jclass) !!mgs!! im7table(jclass, id_so4) + DO 90 jk=1,klev + DO 80 jl=1,kproma + + ! other compounds than sulfate: + + IF (pttn(jl,jk,ixso4) > 0.0_dp .AND. zaerelse(jl,jk,jclass) < cmin_aerml) THEN + ! + !--- 2.1) Calculation of the ambient particle properties: ----------- + ! + !--- Constrain ambient temperature to conditions for which the + ! parametrisation of the liquid water content works: + + ! Temperature: + ztk = ptp1(jl,jk) + ztk = MAX(ztk , 240._dp) + + ! Relative Humidity: + zrh = prelhum(jl,jk) + zrh = MAX(zrh , 0.05_dp) + zrh = MIN(zrh , 0.90_dp) + + !--- Assign auxiliary variables: + + zapp1=papp1(jl,jk) + zlnm = LOG(pttn(jl,jk,ixso4)) + zlnm2 = zlnm*zlnm + zss2 = zrh**2 + ztk2 = ztk*ztk + zln3 = zlnm/3.0_dp + zln32 = zln3*zln3 + ! + !--- Percentage by weight of sulfate in the particle [%]: + ! (Here we ignore any insoluble mass.) + ! + zwso4 = wvb(1) + wvb(2)*zlnm + wvb(3)*zrh*zlnm + wvb(4)*ztk*zlnm + & + wvb(5)*zrh/ztk + wvb(6)*zlnm2*zrh + wvb(7)*zlnm2*ztk + & + wvb(8)*zlnm*zss2 + wvb(9)*zlnm*ztk2 + wvb(10)*zlnm2*zss2 + & + wvb(11)*zlnm2*ztk2 + wvb(12)*zss2/ztk2 + wvb(13)*zlnm2 + & + wvb(14)*zlnm2*zlnm + wvb(15)*zlnm2*zlnm2 + & + wvb(16)*zss2*zrh/(ztk2*ztk) + wvb(17)*LOG(zrh*ztk/zapp1) + + !--- Dry mass of sulfate in an average particle [g]: + + zmso4 = pttn(jl,jk,ixso4)*wh2so4/avo + + !--- Dry volume of sulfate in an average particle [cm3]: + ! Any temperature or pressure dependency of the + ! sulfate density is ingored. + + zvso4 = zmso4/dh2so4 + + !--- Mass of sulfate + water in an average particle [g]: + + zmso4h2o = zmso4/(zwso4/100.0_dp) + + !--- Density of the sulfate-water fraction of an average particle [g cm-3]: + !@@@ Check: changed zwvso4 into zwso4 (now the mass!) + + zdso4h2o = gmb(1) + gmb(2)*zwso4 + gmb(3)*zln3 + gmb(4)*zrh + & + gmb(5)*ztk + gmb(6)*zln32 + gmb(7)*zln3/zrh + & + gmb(8)*zln3/ztk + gmb(9)*ztk2 + + !--- Limits for zdso4h2o: H2O(0.99) and pure H2SO4 (1.841): + ! + zdso4h2o=MAX(zdso4h2o,dh2o) + zdso4h2o=MIN(zdso4h2o,dh2so4) + + !--- Volume of sulfate-water fraction of an average particle [cm3]: + + zvso4h2o = zmso4h2o/zdso4h2o + + !--- 2.2) Calculatiion of the particle radii: ---------------------------- + + !--- 2.2.1) Dry count mean radius [cm]: + + pm6dry(jl,jk,jclass)=((zvso4)*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.2.2) Equilibrium wet count mean radius [cm]: + + pm6rp(jl,jk,jclass) =((zvso4h2o)*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.3) Assignment of the particle density [g cm-3]: ------------------- + + prhop(jl,jk,jclass)=zdso4h2o + + !--- 2.4) Store aerosol water for each mode [kg(water) m-3(air)]: + + pww(jl,jk,jclass)=(zmso4h2o-zmso4)*paernl(jl,jk,jclass)*1.E3_dp + + END IF +80 END DO +90 END DO +100 END DO + +END SUBROUTINE m7_equiz + + +SUBROUTINE m7_equimix(kproma, kbdim, klev, krow, & + papp1, pttn, ptp1, & + prelhum, pm6rp, pm6dry, & + prhop, pww, paernl ) + ! + ! *m7_equimix* calculates the ambient radii of the particles with + ! sulphate, b/o carbon and dust. + ! + ! Authors: + ! -------- + ! J. Wilson and E. Vignati, JRC (original source) 05/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! + ! Purpose: + ! -------- + ! This routine calculates the ambient radii for mixed particles without + ! sea salt with mass of ttn molecules, converts them to count mean radii and + ! stores them in the array with address pm6rp. + ! It additionally calculates the ambient particle density. + ! + ! Method: + ! ------- + ! The calculations of the ambient particle properties are based on + ! parameterisations of the mass of sulfate and density derived + ! by Julian Wilson from a regression analysis of results of solving + ! the generalised Kelvin equation using (F. J. Zeleznik, J. Phys. Chem. + ! Ref. Data 20, 1157, 1991), for an H2SO4-H2O mixture, in the + ! following parameter ranges: + + ! 1e2 < pttn < 1E11 [molecules] + ! 0.2 < prelhum < 0.9 [1] + ! 240 < ptp1 < 330 [K] + ! 10000 < papp1 < 100000 [Pa] + ! + ! Due to the limitations of the parametrisation, the ambient temperature + ! is restricted to a minimum of 240 K within this subroutine. + ! + ! For this application to mixed aerosols with an insoluble core we + ! assume the H2O uptake by the particle to be that of a pure + ! H2SO4 / H2O particle containing the H2SO4 mass of the mixed aerosol. + ! + ! Interface: + ! ---------- + ! *m7_equimix* is called from *m7* + ! + ! Externals: + ! ---------- + ! none + ! + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_math_constants, ONLY: pi + USE mo_ham_m7ctl, ONLY: dh2so4, dh2o, wvb, gmb, wh2so4, & + ram2cmr, cmin_aerml, cdconv + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_ss, id_so4 + USE mo_ham, ONLY: naerocomp, aerocomp, sizeclass, nclass, nsol + + IMPLICIT NONE + ! + ! pttn = average mass for single compound in each mode + ! [in molec. for sulphate and in ug for bc, oc, ss, and dust] + ! pm6rp = count mean radius under ambient conditions + ! pm6dry = count mean radius under dry conditions + ! paernl = aerosol number for each mode [cm-3] + ! pww = aerosol water content for each mode [kg(water) m-3(air)] + ! zwso4 = percentage by mass of sulfate in a H2O-H2SO4 particle + ! containing pttn molecules of sulfate under ambient conditions + ! zvso4 = volume of pttn molecules of sulfate [cm3] + ! zmso4 = mass of pttn molecules of sulfate [g] + ! zdso4h2o = density of sulfate-h2o fraction of a particle with average + ! mass [g.cm-3] + ! zmso4h2o = mass of sulfate-h2o fraction of a particle with average mass [g] + ! zvso4h2o = volume of sulfate-h2o fraction of a particle with average + ! mass [cm3] + ! zinsvol = total volume of insoluble compounds in a single particle of + ! average mass [cm3] + ! zinsmass = total mass of insoluble compounds in a single + ! particle of average mass [cm3] + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: papp1(kbdim,klev), ptp1(kbdim,klev), & + prelhum(kbdim,klev) + + REAL(dp):: pttn(kbdim,klev,naerocomp), prhop(kbdim,klev,nclass), & + pm6dry(kbdim,klev,nsol), pm6rp(kbdim,klev,nclass), & + pww(kbdim,klev,nclass), paernl(kbdim,klev,nclass) + ! + ! Local variables: + ! + + INTEGER :: jk, jl, jclass + + REAL(dp):: zseasalt, & + zwso4, zvso4, zmso4, & + zvso4h2o, zmso4h2o, zdso4h2o, & + zapp1, zrh, ztk + + REAL(dp):: zlnm2, zln3, zln32, ztk2, & + zlnm, zss2 + + REAL(dp) :: zinsmas(kbdim,klev,nsol) + REAL(dp) :: zinsvol(kbdim,klev,nsol) + REAL(dp) :: zdens + INTEGER :: ixso4, ixss, jspec, jn + !------------------------------------------------------------------------------ + ! + zinsmas(:,:,:) = 0._dp + zinsvol(:,:,:) = 0._dp + + !--- 1) Determine mass of non sulfate compounds in a particle: --------- + + DO jn = 1,naerocomp ! for each mode+species + jclass = aerocomp(jn)%iclass ! check if the species is neither sulphate nor seasalt + jspec = aerocomp(jn)%spid ! if so, add to the total mode 'others' mass + IF (sizeclass(jclass)%lsoluble .AND. (.NOT. speclist(jspec)%lelectrolyte)) THEN + zdens = cdconv*speclist(jspec)%density + zinsmas(1:kproma,:,jclass) = zinsmas(1:kproma,:,jclass) + pttn(1:kproma,:,jn) + zinsvol(1:kproma,:,jclass) = zinsvol(1:kproma,:,jclass) + pttn(1:kproma,:,jn)/zdens + zinsmas(1:kproma,:,jclass) = MAX(zinsmas(1:kproma,:,jclass),0._dp) + zinsvol(1:kproma,:,jclass) = MAX(zinsvol(1:kproma,:,jclass),0._dp) + END IF + + END DO + +!CDIR unroll=5 + DO 100 jclass=1,nsol + ixso4 = speclist(id_so4)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_so4) + ixss = speclist(id_ss)%iaerocomp(jclass) !!mgs!! im7table(jclass, id_ss) + + DO 90 jk=1,klev + DO 80 jl=1,kproma + + !--- 1) Split particle quantities into soluble (sea salt) and -------------- + ! non soluble (organic carbon + black carbon + dust) parts: + ! (N.B. densities are assumed independent of temperature & pressure) + + IF (ixss > 0) THEN + zseasalt = pttn(jl,jk,ixss) + ELSE + zseasalt = 0._dp + END IF + + !--- 2) Calculation of the particle properties in the absense of sea salt: -- + ! + IF (pttn(jl,jk,ixso4) > 0.0_dp .AND. zseasalt < cmin_aerml ) THEN + + !--- 2.1) Calculation of the ambient particle properties: ---------------- + ! + !--- Constrain ambient temperature and relative humidity to + ! conditions for which the parametrisation of the liquid + ! water content works: + ! + ! Temperature: + ztk = ptp1(jl,jk) + ztk = MAX(ztk , 240._dp) + + ! Relative Humidity: + zrh = prelhum(jl,jk) + zrh = MAX(zrh , 0.05_dp) + zrh = MIN(zrh , 0.90_dp) + + !--- Assign auxiliary variables: + + zapp1=papp1(jl,jk) + zlnm = LOG(pttn(jl,jk,ixso4)) + zlnm2 = zlnm*zlnm + zss2 = zrh**2 + ztk2 = ztk*ztk + zln3 = zlnm/3.0_dp + zln32 = zln3*zln3 + + !--- Percentage by weight of sulfate in the particle [%]: + ! (Here we ignore any insoluble mass.) + + zwso4 = wvb(1) + wvb(2)*zlnm + wvb(3)*zrh*zlnm + wvb(4)*ztk*zlnm + & + wvb(5)*zrh/ztk + wvb(6)*zlnm2*zrh + wvb(7)*zlnm2*ztk + & + wvb(8)*zlnm*zss2 + wvb(9)*zlnm*ztk2 + wvb(10)*zlnm2*zss2 + & + wvb(11)*zlnm2*ztk2 + wvb(12)*zss2/ztk2 + wvb(13)*zlnm2 + & + wvb(14)*zlnm2*zlnm + wvb(15)*zlnm2*zlnm2 + & + wvb(16)*zss2*zrh/(ztk2*ztk) + wvb(17)*LOG(zrh*ztk/zapp1) + + !--- Dry mass of sulfate in an average particle [g]: + + zmso4 = pttn(jl,jk,ixso4)*wh2so4/avo + + !--- Dry volume of sulfate in an average particle [cm3]: + ! Any temperature or pressure dependency of the + ! sulfate density is ingored. + + zvso4 = zmso4/dh2so4 + + !--- Mass of sulfate + water in an average particle [g]: + + zmso4h2o = zmso4/(zwso4/100.0_dp) + + !--- Density of the sulfate-water fraction of an average particle [g cm-3]: + !@@@ Check: changed zwvso4 into zwso4 (now the mass!) + + zdso4h2o = gmb(1) + gmb(2)*zwso4 + gmb(3)*zln3 + gmb(4)*zrh + & + gmb(5)*ztk + gmb(6)*zln32 + gmb(7)*zln3/zrh + & + gmb(8)*zln3/ztk + gmb(9)*ztk2 + + !--- Limits for zdso4h2o: H2O(0.99) and pure H2SO4 (1.841): + ! + zdso4h2o=MAX(zdso4h2o,dh2o) + zdso4h2o=MIN(zdso4h2o,dh2so4) + + !--- Volume of sulfate-water fraction of an average particle [cm3]: + + zvso4h2o = zmso4h2o/zdso4h2o + + !--- 2.2) Calculatiion of the particle radii: ---------------------------- + + !--- 2.2.1) Dry count mean radius [cm]: + + pm6dry(jl,jk,jclass)=((zvso4+zinsvol(jl,jk,jclass))*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.2.2) Equilibrium wet count mean radius [cm]: + + pm6rp(jl,jk,jclass) =((zvso4h2o+zinsvol(jl,jk,jclass))*0.75_dp/pi)**(1._dp/3._dp)*ram2cmr(jclass) + + !--- 2.3) Calculation of the particle density [g cm-3]:------------------- + + prhop(jl,jk,jclass)=(zmso4h2o+zinsmas(jl,jk,jclass))/ & + (zvso4h2o+zinsvol(jl,jk,jclass)) + + !--- 2.4) Store aerosol water for each mode [kg(water) m-3(air)]: + + pww(jl,jk,jclass)=(zmso4h2o-zmso4)*paernl(jl,jk,jclass)*1.E3_dp + + END IF + +80 END DO +90 END DO +100 END DO + +END SUBROUTINE m7_equimix + + +SUBROUTINE m7_equil (kproma, kbdim, klev, krow, prelhum, paerml, paernl, & + pm6rp, pm6dry, pww, prhop, ptp1 ) + ! + !**** *m7_equil* calculates the ambient radii of accumulation + ! and coarse mode particles in presence of sea salt + ! + ! + ! Authors: + ! -------- + ! E. Vignati, JRC/EI (original source) 01/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! D. O'Donnell, MPI-M, see Revision information below 2007-2008 + + ! Purpose: + ! -------- + ! This routine calculates the equilibrium radius of sea salt + ! particles, and of sea salt particles mixed with sulphate for + ! accumulation and coarse modes. + ! + ! Interface: + ! ---------- + ! *m7_equil* is called from *m7* + ! + ! References: + ! ----------- + ! Jacobson, M.Z., Tabazadeh, A., Turco, R.P., (1996). Simulating + ! equilibrium within aerosols and nonequilibrium between gases + ! and aerosols. + ! Tang, I.N., (1997). Thermodynamic and optical properties of + ! mixed-salt aerosols of atmospheric importance. + + ! Revision information + ! -------------------- + ! Based on: m7_equil from HAM_me_v1 (svn rev:266) + ! Major changes: changed to become more generic with respect to non-electrolytic species + ! i.e. should not require updating if more such species are added to the model + ! Minor changes: 1. removed computation of [H+]: this is not used anywhere (this also affects + ! the subroutine call in m7) + ! 2. cleaned up mode and species indexing - fixed relations between mode numbers + ! and species identities no longer required + + !--- Local variables: to be completed + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_math_constants, ONLY: pi + USE mo_ham, ONLY: naerocomp, nclass, nsol, subm_naerospec, subm_aerospec + USE mo_ham_m7ctl, ONLY: iaccs, icoas, & + wnacl, wna2so4, wnahso4, wh2so4, & + dna2so4, dnahso4, dh2so4, dh2o, & + crh, ram2cmr, cmin_aerml, cmin_aernl, cdconv + USE mo_ham_subm_species, ONLY: isubm_wat + + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_ss, id_so4 !!mgs!! ham_aerospec, ham_naerospec + + IMPLICIT NONE + ! + !--- Parameter list: + ! + ! + !--- Local variables: + ! + ! !@@@ To be completed! + ! + ! Indices for the arrays zmm and zmmr: + ! ----------------------------------- + ! | ions ion pair | + ! | (mole m-3) (mole m-3) | + ! | i zmm(i) zmmr(i) | + ! | 1 Na+ NaCl | + ! | 2 Cl- NaHSO4 | + ! | 3 SO4-- Na2SO4 | + ! | 4 HSO4- H2-SO4 | + ! | 5 H+ | + ! ----------------------------------- + + !--- Parameters: + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: prelhum(kbdim,klev), ptp1(kbdim,klev) + + REAL(dp):: paerml(kbdim,klev,naerocomp), paernl(kbdim,klev,nclass), & + pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nsol), & + prhop(kbdim,klev,nclass), pww(kbdim,klev,nclass) + + !--- Local variables: + + INTEGER :: jl, jk, jclass, jn, jm + + REAL(dp):: zaw, zvolw, zdryvol, zdrymass, & + zdryvol_mean, zambvol_mean + + !>>dod soa removed zmol + REAL(dp):: zmm(4), zmmr(4), zmo(4), zmmt(4) + !< cmin_aerml) .AND. (paernl(jl,jk,jclass)>cmin_aernl)) THEN + ! + !--- 1) Dry Calculations: -------------------------------------------------- + ! + !--- 1.1) Calculate initial concentrations of the compounds in mole/m+3: + ! + !--- Na, Cl: + ! + zmm(1)=paerml(jl,jk,ixss)*1.E-6_dp / wnacl ! n(Na) [mole m-3] + zmm(2)=paerml(jl,jk,ixss)*1.E-6_dp / wnacl ! n(Cl) [mole m-3] + ! [ g m-3 ] / [g mole-1] = [mole m-3] + ! + !--- SO4--: + ! + zmm(3)=paerml(jl,jk,ixso4) *1.E+6_dp / avo ! n(H2SO4) [mole m-3] + ! [ m-3 ] / [mole-1] = [mole m-3] + ! + !--- HSO4-: + ! + zmm(4)=0._dp ! n(HSO4) [mole m-3] + ! + !--- 1.2) Calculation of the concentration of the different species: + ! The ions are supposed to be arranged such that + ! sodium is associated to sulphate first in + ! Na2SO4, the remaining sodium is associated to Cl + ! in form of NaCl. + ! + zmmt(1)=zmm(1) ! n(Na) + zmmt(3)=zmm(3) ! n(SO4) + ! + zmmr(3)=MIN(zmmt(1)/2._dp , zmmt(3)) ! n(Na2SO4) + zmmt(1)=zmmt(1)-2._dp*zmmr(3) ! Remaining n(Na) after association + ! with Na2SO4: n(Na)=n(Na)-2*n(Na2SO4) + ! + zmmr(1)=MIN(zmm(2),zmmt(1)) ! n(NaCl) + ! + zmm(2)=zmmr(1) ! n(Cl) bound in NaCl, the rest is + ! assumed to evaporate in presence of SO4 + ! + zmmr(2)=0._dp ! n(NaHSO4) + ! + zmmr(4)=zmm(3)-zmmr(2)-zmmr(3) ! n(H2-SO4)(t)=n(H2SO4)(t0)-n(NaHSO4)-n(Na2SO4) + ! ! as n(H2SO4)(t0)=n(SO4--)(t0) + ! + !--- 1.3) Total aerosol dry volume [cm3/m3]: + ! + zdryvol= zmmr(1)*wnacl/zdss + & + zmmr(2)*wnahso4/dnahso4 + & + zmmr(3)*wna2so4/dna2so4 + & + zmmr(4)*wh2so4/dh2so4 + & + zothervol(jl,jk) + + ! + !--- 1.4) Mean aerosol dry volume [cm+3]: + zdryvol_mean = zdryvol / (paernl(jl,jk,jclass)*1.E6_dp) + ! [cm+3] = [cm+3/m+3] / [ m-3 ] + ! + !--- 1.5) Dry radius [cm]: + ! + pm6dry(jl,jk,jclass)=((3._dp/(4._dp*pi))*zdryvol_mean)**(1._dp/3._dp) * & + ram2cmr(jclass) + ! + !--- 1.6) Total aerosol dry mass [gr/m3]: + ! + zdrymass= zmmr(1)*wnacl + & + zmmr(2)*wnahso4 + & + zmmr(3)*wna2so4 + & + zmmr(4)*wh2so4 + & + zothermass(jl,jk) + ! + ! + !--- 2) Wet calculations: -------------------------------------------------- + ! + !--- Set threshold for relative humidity: + ! If RH is smaller than the Critical Relative Humidity + ! (currently crh=0.45) the equilibrium radius is set to the dry radius: + + IF (prelhum(jl,jk) < crh) THEN + ! + pww(jl,jk,jclass) = 0._dp + ! + pm6rp(jl,jk,jclass) = pm6dry(jl,jk,jclass) + ! + prhop(jl,jk,jclass) = zdrymass/zdryvol + ! + ELSE + ! + !--- 2.1) Calculate thermodynamic properties under ambient conditions + ! + !--- 2.1.1) Water activity: + ! + zaw=prelhum(jl,jk) + ! + !--- 2.1.2) Molality as function of the water activity: + ! Currently sulfate is assumed to be fully dissociated, + ! i.e. zmmr(2)=0. and zmo(2) is not calculated. + ! + ! Changed reference to Jacobson et al. (1996): + ! + !--- NaCl: + + zmo(1)=(-1.918004E2_dp+2.001540E3_dp*zaw-8.557205E3_dp*zaw**2 & + +1.987670E4_dp*zaw**3-2.717192E4_dp*zaw**4+2.187103E4_dp*zaw**5 & + -9.591577E3_dp*zaw**6+1.763672E3_dp*zaw**7 )**2 + + !--- NaHSO4: + + zmo(2)=(+4.662777E0_dp-1.128472E1_dp*zaw+7.049464E1_dp*zaw**2 & + -2.788050E2_dp*zaw**3+6.103105E2_dp*zaw**4-7.409417E2_dp*zaw**5 & + +4.614577E2_dp*zaw**6-1.150735E2_dp*zaw**7 )**2 + + !--- Na2SO4: + + zmo(3)=(-3.295311E3_dp+3.188349E4_dp*zaw-1.305168E5_dp*zaw**2 & + +2.935608E5_dp*zaw**3-3.920423E5_dp*zaw**4+3.109519E5_dp*zaw**5 & + -1.356439E5_dp*zaw**6+2.510249E4_dp*zaw**7 )**2 + + !--- H2-SO4: + + zmo(4)=(+5.611895_dp-1.387446E1_dp*zaw+1.750682E1_dp*zaw**2 & + +7.138146E1_dp*zaw**3-3.109173E2_dp*zaw**4+4.662288E2_dp*zaw**5 & + -3.128612E2_dp*zaw**6+7.76097E1_dp*zaw**7 )**2 + ! + ! + !--- 2.2) Calculation of the water content in kg water/m3 air: + ! (zmmr[mole/m3(air)]/zmo[mole/kg(water)] =zww[kg(water)/m3(air)] + ! + pww(jl,jk,jclass)=zmmr(1)/zmo(1)+zmmr(2)/zmo(2)+zmmr(3)/zmo(3)+zmmr(4)/zmo(4) + ! + !--- 2.3) Calculate the molality of the ions + ! + !--- 2.3.1) For Na+, Cl-, SO4--, HSO4- : + ! + !>>dod soa removed these calculations - not used anywhere + !< cmin_aerml) .AND. (paernl(jl,jk,jclass) > cmin_aernl)) + +70 END DO +60 END DO +50 END DO + +END SUBROUTINE m7_equil + + + + +SUBROUTINE m7_h2so4_cs(kproma,kbdim,klev,ptp1,papp1,paernl,pm6rp,pcs,pcsi) + +! +! *m7_h2so4_cs* calculates the H2SO4 condensation sink (s-1) of the given +! aerosol size distribution and of the individual modes. +! +! Method: +! ----------------- +! The transfer of sulfate to the particles is based on Fuchs (1959). Soluble +! and insoluble particles are distinguished by a different accomodation +! coefficient "caccso4" defined in mo_ham_m7ctl. (Currently 1.0 for soluble and +! 0.3 for insoluble modes). +! +! References: +! ----------- +! Fuchs, N.A. (1959). Evaporation and droplet growth in gaseous media; Pergamon, New York, pp72. +! +! Authors: +! +! 2001 Philip Stier AOPP, University of Oxford +! 2000 J. Wilson, E. Vignati, JRC/EI (original source) + +USE mo_kind, ONLY: dp +USE mo_time_control, ONLY: time_step_len +USE mo_ham_m7ctl, ONLY: wh2so4,rerg,caccso4 +USE mo_math_constants, ONLY: pi +USE mo_ham, ONLY: nclass + +IMPLICIT NONE + +! +! Input +! + +INTEGER :: kproma, kbdim, klev + +REAL(dp):: ptp1(kbdim,klev) ! Temperature (K) +REAL(dp):: papp1(kbdim,klev) ! Pressure (Pa) +REAL(dp):: paernl(kbdim,klev,nclass) ! Aerosol number for each mode (cm-3) +REAL(dp):: pm6rp(kbdim,klev,nclass) ! Mean mode actual radius (wet radius for soluble modes and dry radius for insoluble modes) (cm) + +! +! Output +! + +REAL(dp):: pcs(kbdim,klev) ! H2SO4 condensation sink of the aerosol population (s-1) +REAL(dp):: pcsi(kbdim,klev,nclass) ! H2SO4 condensation sink of the individual aerosol modes (s-1) + +! +! Local variables: +! + +INTEGER :: jclass,jk,jl + +REAL(dp):: zpbyone,zde2,zvelb,zxibc,zm6rp,zf1,zqtmst + +!--- 0) Initizalizations: ------------------------------------------------ + +pcs(:,:)=0.0_dp + +pcsi(:,:,:) = 0.0_dp + +zqtmst=1._dp/time_step_len + +!--- 1) Calculate condensation rate for cm diameter sulphate aerosols: --- + +DO jclass=1,nclass + DO jk=1,klev + DO jl=1,kproma + IF (pm6rp(jl,jk,jclass).GT.0._dp) THEN ! try re-code avgprops so that this is never the case. (call 1 of avgprops) + + !--- Diffusion coefficient (Reference???): + + zpbyone=1000.0_dp / (papp1(jl,jk)/100.0_dp) + + zde2=0.073_dp * zpbyone * (ptp1(jl,jk) / 298.15_dp)**1.5_dp ! merge this and the previous statement a la coaset. In + ! fact consider re-using it in coaset. NB multiply by 4. + ! in subsequent usage, zde2 is always multiplied by 4. + + !--- Mean molecule velocity (Moore, 1962 (S+P equ. 8.2)): + + zvelb=SQRT(8.0_dp * rerg * ptp1(jl,jk) / pi / wh2so4) ! merge the constants. isolate sqrt(t) since it usually doesn't vectorise. + + !--- ???Fuchs??? + + zxibc=8.0_dp * zde2 / pi / zvelb ! again merge constants. consider separate calc of 3*zxibc + + ! Use count median radius: + + zm6rp=pm6rp(jl,jk,jclass) + + !--- Distance from particle up to which the kinetic regime applies: + + zf1=( (zm6rp + zxibc)**3 - (zm6rp**2 + zxibc**2)**1.5_dp ) / & + (3.0_dp * zm6rp * zxibc) - zm6rp + + !--- Diffusive flux to single particle surface: + ! (Elisabetta's thesis: fraction in equ. 2.26) + +!ORIGINAL-FORMULATION pcsi(jl,jk,jclass)=(4.0_dp * pi * zde2 * zm6rp ) / & +!ORIGINAL-FORMULATION ((4.0_dp * zde2) / (zvelb * zm6rp * caccso4(jclass)) + & +!ORIGINAL-FORMULATION (zm6rp/(zm6rp+zf1)) ) + +!NEW-FORMULATION + pcsi(jl,jk,jclass)=(4.0_dp * pi * zde2 * zm6rp * zvelb * zm6rp * caccso4(jclass) * (zm6rp+zf1)) / & + ( 4.0_dp * zde2 * (zm6rp+zf1) + & + zvelb * zm6rp * caccso4(jclass) * zm6rp ) + + !--- Total diffusive flux to all particles in the respective mode: + ! (per concentration of gas phase sulfate) + + pcsi(jl,jk,jclass)=pcsi(jl,jk,jclass) * paernl(jl,jk,jclass) + + !--- Total diffusive flux to all particles in all modes: + ! (per concentration of gas phase sulfate) + + pcs(jl,jk)=pcs(jl,jk)+ pcsi(jl,jk,jclass) + + END IF + END DO + END DO +END DO + +END SUBROUTINE m7_h2so4_cs + + + + +SUBROUTINE m7_prod_cond(kproma, kbdim, klev, krow, & + pso4g, dpso4g, paerml, & + pso4_5, pso4_6, pso4_7, & + pcs, pcsi, paclc, pdz) + ! + ! Authors: + ! -------- + ! + ! 2000 J. Wilson and E. Vignati(original code) + ! 2001 P. Stier (f90-version, changes, comments) + ! 2008 J. Kazil + ! - cloud correction + ! - new time integration scheme + ! - comments + ! + ! Interface: + ! ---------- + ! + ! *m7_prod_cond* is called from *m7* before *m7_nuck* + ! + ! Purpose: + ! -------- + ! + ! *prod_cond* performs the production/condensation part of the time + ! integration of the differential equation for sulfate production/condensation + ! /nucleation over a time step, removes the condensing H2SO4 from the gas + ! phase and distributes it onto the individual aerosol modes, given their + ! H2SO4 condensation sinks. Inside clouds, all H2SO4 is removed from the gas + ! phase. + + USE mo_kind, ONLY: dp + USE mo_time_control, ONLY: time_step_len + USE mo_physical_constants, ONLY: avo + USE mo_ham_m7ctl, ONLY: iso4ns,iso4ks,iso4as,iso4cs,cmin_aernl + USE mo_ham, ONLY: naerocomp, mw_so4, nclass +#ifdef HAMMOZ + USE mo_time_control, ONLY: delta_time + USE mo_ham_streams, ONLY: d_cond_so4 +#endif + + IMPLICIT NONE + + ! + ! Input/output: + ! + + INTEGER :: kproma, kbdim, klev, krow ! ECHAM indices + + REAL(dp):: pso4g(kbdim,klev) ! [H2SO4(g)] [molec. cm-3] + REAL(dp):: dpso4g(kbdim,klev) ! [H2SO4(g)] production rate [molec. cm-3] + REAL(dp):: paerml(kbdim,klev,naerocomp) ! aerosol mass for individual compounds [molec. cm-3 for sulfate and ug m-3 for bc, oc, ss, and dust] + REAL(dp):: pso4_5(kbdim,klev) ! H2SO4 condensing on insoluble mode 5 [molec. cm-3] + REAL(dp):: pso4_6(kbdim,klev) ! H2SO4 condensing on insoluble mode 6 [molec. cm-3] + REAL(dp):: pso4_7(kbdim,klev) ! H2SO4 condensing on insoluble mode 7 [molec. cm-3] + REAL(dp):: pcs(kbdim,klev) ! H2SO4 condensation sink of the aerosol population [s-1] + REAL(dp):: pcsi(kbdim,klev,nclass) ! H2SO4 condensation sink of the individual aerosol modes [s-1] + REAL(dp):: paclc(kbdim,klev) ! Cloud cover [0,1] + REAL(dp):: pdz(kbdim,klev) ! layer thickness dz for diagnostics [m] + + ! + ! Local variables: + ! + + INTEGER :: jl,jk + + REAL(dp):: zqtmst + REAL(JPRD):: zh2so4_cf0 ! Start [H2SO4(g)] [molec. cm-3] in the cloud-free part of the grid box (JPRD for precision) + REAL(JPRD):: zh2so4_cf1 ! End [H2SO4(g)] [molec. cm-3] in the cloud-free part of the grid box (JPRD for precision) + REAL(JPRD):: zh2so4_cy0 ! Start [H2SO4(g)] [molec. cm-3] in the cloudy part of the grid box (JPRD for precision) + REAL(JPRD):: zh2so4_cy1 ! End [H2SO4(g)] [molec. cm-3] in the cloudy part of the grid box (JPRD for precision) + + REAL(JPRD):: zfcond_cf ! [H2SO4(g)] condensing during the time step in the cloud-free part of the grid box (JPRD for precision) + REAL(JPRD):: zfcond_cy ! [H2SO4(g)] condensing during the time step in the cloudy part of the grid box (JPRD for precision) + + REAL(JPRD):: zpcs_safe ! Floored condensation sink for safe division (JPRD for precision) + REAL(JPRD):: zdpso4g ! Production rate in JPRD (JPRD for precision) + REAL(JPRD):: zpcs_ts ! pcs * time_step_len in JPRD (JPRD for precision) + + REAL(dp):: cc ! Corrected cloud cover [0,1] + + ! Initialisations: + + zqtmst=1.0_dp/time_step_len + + ! Calculation of the new sulfate aerosol masses and of the mass of sulfate + ! condensing on the respective modes: + + DO jk=1,klev + DO jl=1,kproma + + IF (pcs(jl,jk) > 1.0E-10_dp) THEN ! Regular H2SO4 condensation sink of the aerosol + + ! Floor pcs for safe division and promote to JPRD for precision-critical condensation calculation + zpcs_safe = MAX(REAL(pcs(jl,jk), JPRD), 1.0E-10_JPRD) + zdpso4g = REAL(dpso4g(jl,jk), JPRD) + zpcs_ts = zpcs_safe * REAL(time_step_len, JPRD) + + ! Safety check on the cloud fraction: + cc = min(paclc(jl,jk),1.0_dp) + cc = max(cc,0.0_dp) + + ! + ! Cloud-free part of the grid box: + ! + + ! Start [H2SO4(g)]: + zh2so4_cf0 = REAL(pso4g(jl,jk), JPRD) + + ! End [H2SO4(g)]: + zh2so4_cf1 = & + (zh2so4_cf0 - zdpso4g/zpcs_safe)*EXP(-zpcs_ts) & + + zdpso4g/zpcs_safe + + ! Safety check: + zh2so4_cf1 = MAX(zh2so4_cf1, 0.0_JPRD) + + ! + ! Cloudy part of the grid box: + ! + + ! Start [H2SO4(g)]: + zh2so4_cy0 = REAL(pso4g(jl,jk), JPRD) + + ! End [H2SO4(g)]: + zh2so4_cy1 = 0.0_JPRD + + ! + ! New grid box-averaged [H2SO4(g)]: + ! + + pso4g(jl,jk) = REAL((1.0_JPRD-REAL(cc,JPRD))*zh2so4_cf1 + REAL(cc,JPRD)*zh2so4_cy1, dp) + + ! [H2SO4(g)] that condensed onto aerosol particles during the time step + ! in the cloud-free and cloudy part of the grid box: + + zfcond_cf = (1.0_JPRD-REAL(cc,JPRD))*(zh2so4_cf0 - zh2so4_cf1 + zdpso4g*REAL(time_step_len,JPRD)) + zfcond_cy = REAL(cc,JPRD)*(zh2so4_cy0 - zh2so4_cy1 + zdpso4g*REAL(time_step_len,JPRD)) + + ! Distribute H2SO4(g) condensing in the cloud-free part of the grid box + ! on the soluble and insoluble aerosol modes according to their + ! condensation sinks: + + paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + REAL(REAL(pcsi(jl,jk,iso4ns),JPRD)/zpcs_safe*zfcond_cf, dp) + paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + REAL(REAL(pcsi(jl,jk,iso4ks),JPRD)/zpcs_safe*zfcond_cf, dp) + paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + REAL(REAL(pcsi(jl,jk,iso4as),JPRD)/zpcs_safe*zfcond_cf, dp) + paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + REAL(REAL(pcsi(jl,jk,iso4cs),JPRD)/zpcs_safe*zfcond_cf, dp) + + ! Number of H2SO4 molecules condensing on the insoluble modes: + ! (Transfer from insoluble to soluble modes is calculated in m7_concoag) + + pso4_5(jl,jk) = REAL(REAL(pcsi(jl,jk,5),JPRD)/zpcs_safe*zfcond_cf, dp) + pso4_6(jl,jk) = REAL(REAL(pcsi(jl,jk,6),JPRD)/zpcs_safe*zfcond_cf, dp) + pso4_7(jl,jk) = REAL(REAL(pcsi(jl,jk,7),JPRD)/zpcs_safe*zfcond_cf, dp) + + ! Commit the H2SO4(g) condensing in the cloudy part of the grid box + ! to the largest aerosol mode, assuming that that mode contributes + ! aerosol particles that activated and became cloud droplets: + + IF (pcsi(jl,jk,iso4cs) > 0.0_dp) THEN + paerml(jl,jk,iso4cs) = paerml(jl,jk,iso4cs) + REAL(zfcond_cy, dp) + ELSEIF (pcsi(jl,jk,iso4as) > 0.0_dp) THEN + paerml(jl,jk,iso4as) = paerml(jl,jk,iso4as) + REAL(zfcond_cy, dp) + ELSEIF (pcsi(jl,jk,iso4ks) > 0.0_dp) THEN + paerml(jl,jk,iso4ks) = paerml(jl,jk,iso4ks) + REAL(zfcond_cy, dp) + ELSEIF (pcsi(jl,jk,iso4ns) > 0.0_dp) THEN + paerml(jl,jk,iso4ns) = paerml(jl,jk,iso4ns) + REAL(zfcond_cy, dp) + ELSEIF (pcsi(jl,jk,7) > 0.0_dp) THEN + pso4_7(jl,jk) = pso4_7(jl,jk) + REAL(zfcond_cy, dp) + ELSEIF (pcsi(jl,jk,6) > 0.0_dp) THEN + pso4_6(jl,jk) = pso4_6(jl,jk) + REAL(zfcond_cy, dp) + ELSEIF (pcsi(jl,jk,5) > 0.0_dp) THEN + pso4_5(jl,jk) = pso4_5(jl,jk) + REAL(zfcond_cy, dp) + ENDIF + + ! Vertically integrate mass of condensed sulfate for diagnostics, + ! converting [molec. cm-3] to [kg(SO4) m-2]: +#ifdef HAMMOZ + d_cond_so4(jl,krow) = d_cond_so4(jl,krow) & + + REAL((((zfcond_cf + zfcond_cy)*REAL(mw_so4,JPRD)*1.E3_JPRD)/REAL(avo,JPRD)) & + *REAL(pdz(jl,jk),JPRD)*REAL(zqtmst,JPRD)*REAL(delta_time,JPRD), dp) +#endif + ELSE ! H2SO4 condensation sink of the aerosol extremely small: + + ! New grid box-averaged [H2SO4(g)]: + pso4g(jl,jk) = pso4g(jl,jk) + time_step_len*dpso4g(jl,jk) + + ! Number of H2SO4 molecules condensing on the insoluble modes: + ! (Transfer from insoluble to soluble modes is calculated in m7_concoag) + pso4_5(jl,jk) = 0.0_dp + pso4_6(jl,jk) = 0.0_dp + pso4_7(jl,jk) = 0.0_dp + + END IF + END DO + END DO + +END SUBROUTINE m7_prod_cond + + +SUBROUTINE m7_nuck(kproma, kbdim, klev, krow, & + papp1, ptp1, prhp1, paclc, pipr, & + ph2so4, pcs, panew, pa4delt, pdz, & + ppbl, pforest, pout_dnuc) + ! + ! Authors: + ! -------- + ! + ! 2000 J. Wilson and E. Vignati (original code) + ! 2001-2003 P. Stier + ! - F90-version + ! - Changes + ! - Comments + ! - Modularisation + ! - Implemented H2SO4/H2O nucleation scheme (Vehkamaeki et al., JGR 2002) + ! 2008 J. Kazil + ! - Removed H2SO4/H2O nucleation (Kulmala et al., JGR 1998) + ! - Implemented neutral and charged H2SO4/H2O nucleation (Kazil and Lovejoy, ACP 2007) + ! - Implemented organic nucleation parameterizations: + ! activation nucleation (Kulmala et al., ACP 2006) + ! kinetic nucleation (Laakso et al., ACP 2004) + ! - Implemented a cloud correction + ! - Implemented new time integration scheme + ! + ! Interface: + ! ---------- + ! + ! *m7_nuck* is called from *m7* after *m7_prod_cond* + ! + ! Purpose: + ! -------- + ! + ! *m7_nuck* performes the nucleation part of the time integration of the + ! differential equation for sulfate production/condensation/nucleation over a + ! time step. + ! + ! Method: + ! ------- + ! + ! First, the grid box averaged H2SO4 gas phase concentration is converted to + ! the H2SO4 gas phase concentration in the cloud-free portion of the grid box, + ! assuming that [H2SO4(g)] = 0 in the cloudy part. Then the nucleation rate J + ! is calculated for the cloud-free portion of the grid box and the resulting + ! change in gas phase H2SO4 integrated over the time step. From this change, + ! the number of newly formed aerosol particles is calculated. Finally, the + ! concentrations of H2SO4(g) and newly formed aerosol particles are converted + ! to grid box averaged values. + ! + ! Note: The removal rate of H2SO4 from the gas phase due to nucleation and its + ! conversion rate to freshly nucleated particles are approximated with n*J, + ! where n is the H2SO4 content of the smallest newly formed particles. These + ! are approximations which neglect the loss of freshly nucleated particles + ! containing < n H2SO4 molecules onto pre-existing aerosol, and the + ! contribution to new particle formation by coagulation. + ! + ! References: + ! ----------- + ! + ! Vignati, E., Modelling Interactions between Aerosols and + ! Gaseous Compounds in the Polluted Marine Atmosphere. PhD-Thesis, + ! RISO National Laborartory Copenhagen, Riso-R-1163(EN), 1999 + + USE mo_time_control, ONLY: time_step_len!, delta_time + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: avo + USE mo_ham_m7ctl, ONLY: nsnucl, nonucl + USE mo_ham, ONLY: naerocomp, mw_so4 + USE mo_ham_m7_nucl, ONLY: nucl_vehkamaeki, nucl_kazil_lovejoy, & + nucl_activation, nucl_kinetic +#ifdef HAMMOZ + USE mo_time_control, ONLY: delta_time + USE mo_ham_streams, ONLY: d_nuc_so4 + USE mo_memory_g3b, ONLY: forest +#endif + IMPLICIT NONE + + ! + ! Input/output: + ! + + INTEGER :: kproma, kbdim, klev, krow ! ECHAM indices + + REAL(dp):: papp1(kbdim,klev) ! Atmospheric pressure at time t+1 [Pa] + REAL(dp):: ptp1(kbdim,klev) ! Atmospheric temperature at time t+1 [K] + REAL(dp):: prhp1(kbdim,klev) ! Relative humidity at time t+1 [0,1] + REAL(dp):: paclc(kbdim,klev) ! Cloud cover [0,1] + REAL(dp):: pipr(kbdim,klev) ! Ion pair production rate [cm-3 s-1] + REAL(dp):: ph2so4(kbdim,klev) ! Gas phase H2SO4 concentration [molec. cm-3] + REAL(dp):: pcs(kbdim,klev) ! H2SO4 condensation sink [s-1] + REAL(dp):: panew(kbdim,klev) ! Concentration of nucleated particles [cm-3] over a timestep + REAL(dp):: pa4delt(kbdim,klev,naerocomp) ! pa4delt(:,:,1) = Number of H2SO4 per cm-3 added + ! to the nucleation mode due to H2SO4 nucleation over a timestep + REAL(dp):: pdz(kbdim,klev) ! Layer thickness dz for diagnostics [m] + REAL(dp):: ppbl(kbdim) ! Planetary boundary layer top level + + REAL(dp), OPTIONAL :: pforest(kbdim) ! forest fraction + REAL(dp), OPTIONAL :: pout_dnuc(kbdim,klev,5) ! nucleation diagnostics + + ! + ! Local variables: + ! + + INTEGER :: jk,jl + + REAL(dp):: ztmst,zqtmst,zeps + + REAL(dp):: zrh(kbdim,klev) ! Relative humidity [%] + REAL(dp):: zh2so4_cf0(kbdim,klev) ! Initial gas phase H2SO4 concentration in the cloud-free portion of the grid box [molec. cm-3] + REAL(dp):: zh2so4_cf1(kbdim,klev) ! Final gas phase H2SO4 concentration in the cloud-free portion of the grid box [molec. cm-3] + REAL(dp):: zsnrate(kbdim,klev) ! H2SO4/H2O nucleation rate in the cloud-free portion of the grid box [cm-3 s-1] + REAL(dp):: zsns(kbdim,klev) ! Number of H2SO4 molecules new particles from H2SO4/H2O nucleation + REAL(dp):: zonrate(kbdim,klev) ! Organic aerosol nucleation rate in the cloud-free portion of the grid box [cm-3 s-1] + REAL(dp):: zons(kbdim,klev) ! Number of H2SO4 molecules new particles from organic nucleation + + REAL(dp):: znucrate ! Total nucleation (particle formation) rate + REAL(dp):: zsnucloss ! Total H2SO4(g) loss due to nucleation + ! Initialisations + + ztmst = time_step_len + + zqtmst = 1.0_dp/ztmst + + zeps = THRESHOLD + + ! Relative humidity [%]: + + zrh(1:kproma,:) = 100.0_dp*prhp1(1:kproma,:) + + ! Gas phase H2SO4 concentration in the cloud-free portion of the grid box: + + DO jk = 1, klev + DO jl = 1, kproma + + IF (paclc(jl,jk) >= 1.0_dp) THEN + zh2so4_cf0(jl,jk) = 0.0_dp + ELSEIF (paclc(jl,jk) <= 0.0_dp) THEN + zh2so4_cf0(jl,jk) = ph2so4(jl,jk) + ELSE + zh2so4_cf0(jl,jk) = ph2so4(jl,jk)/(1.0_dp-paclc(jl,jk)) + ENDIF + + ENDDO + ENDDO + + ! H2SO4/H2O nucleation: + + IF (nsnucl == 1) THEN + CALL nucl_vehkamaeki(kproma,kbdim,klev,ptp1,prhp1,zh2so4_cf0,zsnrate,zsns) + ELSE IF (nsnucl == 2) THEN + CALL nucl_kazil_lovejoy(kproma,kbdim,klev,ptp1,zrh,zh2so4_cf0,pcs,pipr,zsnrate,zsns) + ELSE + zsns(1:kproma,:) = 0.0_dp + zsnrate(1:kproma,:) = 0.0_dp + END IF + + ! Organic nucleation: +#ifdef HAMMOZ + IF (nonucl == 1) THEN + CALL nucl_activation(kproma,kbdim,klev,zh2so4_cf0,forest(:,krow),ppbl,zonrate,zons) + ELSEIF (nonucl == 2) THEN + CALL nucl_kinetic(kproma,kbdim,klev,zh2so4_cf0,forest(:,krow),ppbl,zonrate,zons) + ELSE + zons(1:kproma,:) = 0.0_dp + zonrate(1:kproma,:) = 0.0_dp + END IF +#else + ! when not in HAMMOZ forest fraction as parameter (pforest) and not module variable + IF (nonucl == 1) THEN + CALL nucl_activation(kproma,kbdim,klev,zh2so4_cf0,pforest(1:kproma),ppbl,zonrate,zons) + ELSEIF (nonucl == 2) THEN + CALL nucl_kinetic(kproma,kbdim,klev,zh2so4_cf0,pforest(1:kproma),ppbl,zonrate,zons) + ELSE + zons(1:kproma,:) = 0.0_dp + zonrate(1:kproma,:) = 0.0_dp + END If +#endif + DO jk = 1, klev + DO jl = 1, kproma + + ! Total nucleation (particle formation) rate: + znucrate = zsnrate(jl,jk) + zonrate(jl,jk) + + IF (znucrate > zeps) THEN + + ! H2SO4(g) loss due to nucleation: + zsnucloss = zsns(jl,jk)*zsnrate(jl,jk) + zons(jl,jk)*zonrate(jl,jk) + + ! Calculate the gas phase concentration after nucleation: + ! N(t) = N(0) - (zsnucloss * dt)/( 1 + pcs * dt) + ! [cm-3] = [cm-3] - ([cm-3 s-1] * [s])/([1] + [s-1] * [s]) + zh2so4_cf1(jl,jk) = zh2so4_cf0(jl,jk) - ztmst*zsnucloss/(1.0_dp+ztmst*pcs(jl,jk)) + + ! Safety check: + zh2so4_cf1(jl,jk) = max(zh2so4_cf1(jl,jk),0.0_dp) + zh2so4_cf1(jl,jk) = min(zh2so4_cf1(jl,jk),zh2so4_cf0(jl,jk)) + + ! Calculate concentration of nucleated H2SO4 from the net loss of gas + ! phase H2SO4 in the cloud-free grid box portion, and average it over + ! the grid box: + pa4delt(jl,jk,1) = (zh2so4_cf0(jl,jk)-zh2so4_cf1(jl,jk))*(1.0_dp-paclc(jl,jk)) + + ! Calculate the number of nucleated particles, making sure that total + ! H2SO4 (gas + aerosol contributions) is conserved: + panew(jl,jk) = pa4delt(jl,jk,1)*znucrate/zsnucloss + + ! Calculate the new grid box averaged gas phase H2SO4 concentration: + ph2so4(jl,jk) = ph2so4(jl,jk)-pa4delt(jl,jk,1) +#ifdef HAMMOZ + ! Vertically integrate the mass of nucleated sulfate for diagnostics; + ! convert [molec. cm-3] to [kg(S04) m-2]: + d_nuc_so4(jl,krow) = d_nuc_so4(jl,krow) & + + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk)*zqtmst*delta_time + +#else + !diagnostics: + ! 1: NS-mass production kg/s from nucleatiom (limited by amount of SO4) + ! 2: NS-number production rate #/s from nucleatiom (limited by amount of SO4 vs original #/s) + ! 3: original #/s from H2SO4/H2O nucleatiom + ! 4: original #/s from organic nucleatiom + ! 5: original #/s sum from organic and vehkamäki nucleation schemes + pout_dnuc(jl,jk,1) = & + + pa4delt(jl,jk,1)*mw_so4*1.E+03_dp/avo*pdz(jl,jk)*zqtmst + pout_dnuc(jl,jk,2) = & + + panew(jl,jk)*1.E+06_dp*zqtmst + pout_dnuc(jl,jk,3) = & + + zsnrate(jl,jk) *1.E+06_dp + pout_dnuc(jl,jk,4) = & + + zonrate(jl,jk)*1.E+06_dp + pout_dnuc(jl,jk,5) = (zsnrate(jl,jk) & + + zonrate(jl,jk))*1.E+06_dp +#endif + END IF + + END DO + END DO + +END SUBROUTINE m7_nuck + + +SUBROUTINE m7_dnum(kproma, kbdim, klev, krow, & + paerml, paernl, ptp1, & + papp1, pm6rp, prhop, & + !>>dod soa: added pttn + pso4_5, pso4_6, pso4_7, panew, pa4delt, pttn) + !<>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, timer_ham_m7_coaset, timer_ham_m7_delcoa + !<>dod soa + REAL(dp) :: pttn(kbdim,klev,naerocomp) + !<>dod opt deleted zbfract6 and zbfract7 (not used) + REAL(dp):: zbfract1(kbdim,klev,nclass-1),zbfract2(kbdim,klev,nclass-1), & + zbfract5(kbdim,klev,3) + !<>dod opt changed from 4-D (kbdim,klev,nclass,nclass) to 3-D (kbdim,klev,ncoag) + REAL(dp):: zcom(kbdim,klev,ncoag) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_coaset) + !<>dod opt added krow for debugging + IF (lscoag) CALL m7_coaset(kproma, kbdim, klev, krow, paernl, ptp1, & + papp1, pm6rp, prhop, zcom ) +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_coaset) + !<>dod opt changed indexing of zcom + za(jl,jk,1)=zcom(jl,jk,1)/2._dp ! Unimodal coagulation + za(jl,jk,2)=zcom(jl,jk,8)/2._dp ! only allowed for modes + za(jl,jk,3)=zcom(jl,jk,14)/2._dp ! 1,2,3 and 5. + za(jl,jk,4)=0._dp + za(jl,jk,5)=zcom(jl,jk,16)/2._dp + za(jl,jk,6)=0._dp + za(jl,jk,7)=0._dp + !<>dod opt changed indexing of zcom + zbfract1(jl,jk,1)=zcom(jl,jk,2)*paernl(jl,jk,2) + zbfract1(jl,jk,2)=zcom(jl,jk,3)*paernl(jl,jk,3) + zbfract1(jl,jk,3)=zcom(jl,jk,4)*paernl(jl,jk,4) + zbfract1(jl,jk,4)=zcom(jl,jk,5)*paernl(jl,jk,5) + zbfract1(jl,jk,5)=zcom(jl,jk,6)*paernl(jl,jk,6) + zbfract1(jl,jk,6)=zcom(jl,jk,7)*paernl(jl,jk,7) + !<>dod moved IF to try to improve prefetch + !<>dod changed zcom indexing...also commented out pointless calculation + zbfract2(jl,jk,2)=zcom(jl,jk,9)*paernl(jl,jk,3) + zbfract2(jl,jk,3)=zcom(jl,jk,10)*paernl(jl,jk,4) + ! zbfract2(jl,jk,4)=zcom(jl,jk,11)*paernl(jl,jk,5) + zbfract2(jl,jk,4)=0._dp + zbfract2(jl,jk,5)=zcom(jl,jk,12)*paernl(jl,jk,6) + zbfract2(jl,jk,6)=zcom(jl,jk,13)*paernl(jl,jk,7) + !<>dod moved IF to try to improve prefetch + !<>dod removed calculation for modes 6 and 7, which were not used + + END DO + END DO + + ELSE + + za(:,:,:) = 0._dp + zb(:,:,:) = 0._dp + zbfract1(:,:,:) = 0._dp + zbfract2(:,:,:) = 0._dp + zbfract5(:,:,:) = 0._dp + !>>dod removed modes 6 and 7 + + END IF !(lscoag) +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_delcoa) + !<>dod soa added krow and pttn to call of m7_delcoa + CALL m7_delcoa(kproma, kbdim, klev, krow, paerml, & + paernl, pm6rp, pttn, pa4delt, panew, & + za, zb, zbfract1, zbfract2, & + zbfract5, pso4_5, pso4_6, pso4_7 ) +#ifdef HAMMOZ + !>>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_delcoa) + !<>dod replaced isoa_ix + USE mo_species, ONLY: speclist + USE mo_ham_soa, ONLY: soaprop + !<>dod deleted arrays zsumm, sumn + !< re-introduction of the variables zsumm/-n + ! in the buggy version, zsumm + REAL(dp) :: zsumn(kbdim,klev,nclass), & ! new number concentration + zsumm(kbdim,klev,naerocomp) ! new mass concentration + + REAL(dp) :: zfconn(kbdim,klev,nclass), zfconm(kbdim,klev,nclass) + + REAL(dp) :: zdummy, & ! Unused output from m7_cumulative_normal + zr1, & ! Mode lower boundary (cm) + zr2, & ! Mode upper boundary (cm) + zmr1, & ! Mass equivalent of zr1 + zmr2, & ! Mass equivalent of zr2 + zdm, & ! Radius of average mass of the mode + zdm3, & ! zdm**3 + zdens ! density + + REAL(dp) :: zt ! see comments above + + REAL(dp) :: zeps + + REAL(dp) :: zcdf1, zr23, zmrad + + INTEGER :: ispec, iaero, isoans, isoaks, isoaas, isoacs + + !--------------------------------------------------------------------------------------------- + + + !------- executable procedure ---------------------------------------------------------------- + + !--- 0) Initialisations: ---------------------------------------------------------- + + zfconm(:,:,:) = 1._dp + zfconn(:,:,:) = 1._dp + + zeps = THRESHOLD ! threshold for numerical zero in CDF comparisons + + ! + !--- 1) Identify how much the mode jclass has grown into the next higher mode + ! All compound masses are expressed in cgs units in this subroutine + ! For sulphate, held in molecules per cm-3 in paerml, we1 have to convert units + + DO jclass=1,nsol-1 + + !--- Total volume mixing ratio the mode - assumed to be the sum of the vmr's of the + ! individual compounds + + ! Start with inorganics, bc and nonvolatiles (oc) + + SELECT CASE(jclass) + CASE(inucs) + ! Sulphate mmr in molecules cm-3 -> g cm-3 + ztotmass(1:kproma,:) = paerml(1:kproma,:,iso4ns)*zfacso4m + ! Sulphate in molecules cm-3 -> vmr + ztotvmr(1:kproma,:) = paerml(1:kproma,:,iso4ns)*zfacso4v + + CASE(iaits) + ztotmass(1:kproma,:) = paerml(1:kproma,:,iso4ks)*zfacso4m + & + zfac2cgs*(paerml(1:kproma,:,ibcks) + paerml(1:kproma,:,iocks)) + + ztotvmr(1:kproma,:) = paerml(1:kproma,:,iso4ks)*zfacso4v + & + zfac2cgs*(paerml(1:kproma,:,ibcks)/dbc+paerml(1:kproma,:,iocks)/doc) + + CASE(iaccs) + ztotmass(1:kproma,:) = paerml(1:kproma,:,iso4as)*zfacso4m + & + zfac2cgs*(paerml(1:kproma,:,ibcas) + paerml(1:kproma,:,iocas) + & + paerml(1:kproma,:,issas) + paerml(1:kproma,:,iduas) ) + + ztotvmr(1:kproma,:) = paerml(1:kproma,:,iso4as)*zfacso4v + & + zfac2cgs*(paerml(1:kproma,:,ibcas)/dbc+paerml(1:kproma,:,iocas)/doc+ & + paerml(1:kproma,:,issas)/dnacl+paerml(1:kproma,:,iduas)/ddust) + + END SELECT + + !--- Add SOA for all modes + + IF (nsoa == 1 .AND. sizeclass(jclass)%lsoainclass) THEN + DO jm = 1,nsoaspec ! SOA in ug m-3 -> vmr + ispec = soaprop(jm)%spid_soa + iaero = speclist(ispec)%iaerocomp(jclass) + zdens = 1.E-3_dp*aerocomp(iaero)%species%density + ztotmass(1:kproma,:) = ztotmass(1:kproma,:) + zfac2cgs*paerml(1:kproma,:,iaero) + ztotvmr(1:kproma,:) = ztotvmr(1:kproma,:) + & + zfac2cgs*paerml(1:kproma,:,iaero)/zdens + END DO + END IF + + !--- Set minimum radius and maximum radius: + + zr1 = crdiv(jclass) + zr2 = crdiv(jclass+1) + + !--- Radius of average mass for a lognormal distribution + ! @@@ TO DO: Move this to mo_ham_m7ctl + + zdm = EXP((LOG(zr1)+LOG(zr2))/2.0_dp)*cmr2ram(jclass) + zdm3 = zdm**3 + + !--- For calculating average mass of particles of radius zr1 and zr2 within the gridpoint loop + + zr23 = zr2**3 ! Mode upper boundary + zmr1 = z4piover3*(zr1**3) ! Mode volume lower boundary + + DO jk=1,klev + DO jl=1,kproma + + zmrad = pm6dry(jl,jk,jclass) + + IF ((paernl(jl,jk,jclass) > cmin_aernl) .AND. (zmrad > cminrad) & + .AND. ztotvmr(jl,jk) > 0._dp) THEN + + !--- Average mass of a particle in the mode + zttnj = ztotmass(jl,jk)/paernl(jl,jk,jclass) + + !--- Average particle density: + zavdens = ztotmass(jl,jk)/ztotvmr(jl,jk) + + !--- mass of a particle with radius zdm + zavnj = z4piover3*zdm3*zavdens + + !--- mass of a particle with radius zr2 + zmr2 = z4piover3*zr23*zavdens + + !--- If the average mass contained in the mode is larger than the average mass + ! for a particle with radius zdm, the transfer of number and mass is done, + ! from mode jclass to mode jclass+1. Not for the coarse mode, obviously, but + ! this is taken care of by the fact that zfconn =1 for the coarse mode + + IF (zttnj > zavnj) THEN + + IF (jclass /= icoas) THEN + + + !--- Calculate the cumulative of the log-normal number distribution: + ! Fraction of particles having radius < upper mode boundary + ! Input to m7_cumnor is t as described in the comments at the beginning of the + ! subroutine. t = [log(crdiv(jnum+1)-log(pm6dry(jclass))]/sigmaln(jclass) + ! t is the distance of the CMD of the mode from the upper threshold mode + ! diameter in terms of geometric standard deviations: + ! Output from m7_cumnor is zfconn(:,:,jclass), see description under 'parameters' + ! in the comments at the beginning of the subroutine + + zt = LOG(zr2/zmrad)/sigmaln(jclass) + !DIR$ INLINE + CALL m7_cumulative_normal(zt, zcdf1, zdummy) + + ! if mode cmr >> upper mode boundary (this can happen due to SOA condensation) + ! m7_cumulative_normal can return cumulative distribution functions < zeps at the mode + ! boundary. Then no transfer would take place even though the particles have grown + ! by more than an order of magnitude. So the following Q&D is applied until someone + ! thinks of something better. + + IF (zmrad > (zr2*10._dp)) THEN + zfconn(jl,jk,jclass) = 0._dp + ELSE + IF (zcdf1 > zeps) zfconn(jl,jk,jclass) = zcdf1 + END IF + + !--- Numbers transferred + znt=(1.0_dp-zfconn(jl,jk,jclass))*paernl(jl,jk,jclass) + + !---mass transferred + IF (ztotmass(jl,jk) > 0._dp .AND. paernl(jl,jk,jclass) > 0._dp .AND. znt > 0._dp) THEN + + !--- Mass remaining in the mode + zmrj = zfconn(jl,jk,jclass)*paernl(jl,jk,jclass)*zavnj + zmrj = MAX(zmrj, 0._dp) + + !--- Mass transferred + zmt = ztotmass(jl,jk)-zmrj + + zfconm(jl,jk,jclass)=zmrj/ztotmass(jl,jk) + + !--- If the average mass of particle transferred is smaller than the average mass + ! mass of particles with radius zmr2 then reduce the particles transferred + ! so that average mass per particle transferred is (zmr2*zavdens) + + IF ((zmt/znt) < zmr2 ) THEN + zfconn(jl,jk,jclass) = 1.0_dp - & + (zmt/zmr2)/paernl(jl,jk,jclass) + END IF + ELSE + zfconn(jl,jk,jclass) = 1._dp + zfconm(jl,jk,jclass) = 1._dp + END IF + + END IF + + END IF !--- end IF avg mass =< mass for radius zdm + END IF !--- end IF enough particles + + END DO + END DO + END DO + + ! ---- number concentrations ------------------------------------------------------------------------------- + + ! Nucleation mode: particles that stay in nucl. mode + + zsumn(1:kproma,:,inucs) = paernl(1:kproma,:,inucs)*zfconn(1:kproma,:,inucs) + + ! Aitken mode: particles that stay in aitken mode (do not transfer into accum. mode) plus + ! particles transferred from the nucl. mode (considering upwards transfer) + + zsumn(1:kproma,:,iaits) = paernl(1:kproma,:,iaits)*zfconn(1:kproma,:,iaits) + & + paernl(1:kproma,:,inucs)*(1._dp-zfconn(1:kproma,:,inucs)) + + ! Accumulation mode: particles that stay in accum. mode plus: + ! particles transferred from the aitken soluble mode + + zsumn(1:kproma,:,iaccs) = paernl(1:kproma,:,iaccs)*zfconn(1:kproma,:,iaccs) + & + paernl(1:kproma,:,iaits)*(1._dp-zfconn(1:kproma,:,iaits)) + + ! Coarse mode: particles that stay in coarse mode plus particles transferred from accum. mode + + zsumn(1:kproma,:,icoas) = paernl(1:kproma,:,icoas) + & + paernl(1:kproma,:,iaccs)*(1._dp-zfconn(1:kproma,:,iaccs)) + +!csld bug burden + ! Store the final number concentration + paernl(1:kproma,:,inucs) = zsumn(1:kproma,:,inucs) + paernl(1:kproma,:,iaits) = zsumn(1:kproma,:,iaits) + paernl(1:kproma,:,iaccs) = zsumn(1:kproma,:,iaccs) + paernl(1:kproma,:,icoas) = zsumn(1:kproma,:,icoas) + !end csld bug burden + ! ---- end number concentrations --------------------------------------------------------------------------- + + ! ---- sulphate mass --------------------------------------------------------------------------------------- + + ! Nucleation mode: mass that stays in nucl. mode + + zsumm(1:kproma,:,iso4ns) = paerml(1:kproma,:,iso4ns)*zfconm(1:kproma,:,inucs) + + ! Aitken mode: mass that stays in aitken mode plus mass transferred from the nucl. mode + + zsumm(1:kproma,:,iso4ks) = paerml(1:kproma,:,iso4ks)*zfconm(1:kproma,:,iaits) + & + paerml(1:kproma,:,iso4ns)*(1._dp-zfconm(1:kproma,:,inucs)) + + ! Accumulation mode: mass that stays in accum. mode plus mass transferred from the aitken mode + + zsumm(1:kproma,:,iso4as) = paerml(1:kproma,:,iso4as)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,iso4ks)*(1._dp-zfconm(1:kproma,:,iaits)) + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + + zsumm(1:kproma,:,iso4cs) = paerml(1:kproma,:,iso4cs) + & + paerml(1:kproma,:,iso4as)*(1._dp-zfconm(1:kproma,:,iaccs)) + + !csld bug burden + ! Store the final sulphate mass concentrations + paerml(1:kproma,:,iso4ns) = zsumm(1:kproma,:,iso4ns) + paerml(1:kproma,:,iso4ks) = zsumm(1:kproma,:,iso4ks) + paerml(1:kproma,:,iso4as) = zsumm(1:kproma,:,iso4as) + paerml(1:kproma,:,iso4cs) = zsumm(1:kproma,:,iso4cs) + !end csld + ! ---- end sulphate mass ----------------------------------------------------------------------------------- + + ! ---- SOA mass -------------------------------------------------------------------------------------------- + + IF (nsoa == 1) THEN + DO jm = 1,nsoaspec + ispec = soaprop(jm)%spid_soa + + ! Nucleation mode: mass that stays in nucl. mode + IF (sizeclass(inucs)%lsoainclass) THEN + isoans = speclist(ispec)%iaerocomp(inucs) + zsumm(1:kproma,:,isoans) = paerml(1:kproma,:,isoans)*zfconm(1:kproma,:,inucs) + END IF + + ! Aitken mode: mass that stays in aitken mode plus mass transferred from the nucl. mode + isoaks = speclist(ispec)%iaerocomp(iaits) + + zsumm(1:kproma,:,isoaks) = paerml(1:kproma,:,isoaks)*zfconm(1:kproma,:,iaits) + + IF (sizeclass(inucs)%lsoainclass) THEN + zsumm(1:kproma,:,isoaks) = zsumm(1:kproma,:,isoaks) + & + paerml(1:kproma,:,isoans)*(1._dp-zfconm(1:kproma,:,inucs)) + END IF + + ! Accumulation mode: mass that stays in accum. mode plus: + ! mass transferred from the aitken mode + isoaas = speclist(ispec)%iaerocomp(iaccs) + + zsumm(1:kproma,:,isoaas) = paerml(1:kproma,:,isoaas)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,isoaks)*(1._dp-zfconm(1:kproma,:,iaits)) + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + isoacs = speclist(ispec)%iaerocomp (icoas) + + zsumm(1:kproma,:,isoacs) = paerml(1:kproma,:,isoacs) + & + paerml(1:kproma,:,isoaas)*(1._dp-zfconm(1:kproma,:,iaccs)) + +!csld bug burden + IF (sizeclass(inucs)%lsoainclass) THEN + isoans = speclist(ispec)%iaerocomp(inucs) + paerml(1:kproma,:,isoans)=zsumm(1:kproma,:,isoans) + ENDIF + paerml(1:kproma,:,isoaks)=zsumm(1:kproma,:,isoaks) + paerml(1:kproma,:,isoaas)=zsumm(1:kproma,:,isoaas) + paerml(1:kproma,:,isoacs)=zsumm(1:kproma,:,isoacs) +!end csld + END DO + END IF + + ! ---- end SOA mass ---------------------------------------------------------------------------------------- + + ! ---- Black carbon (bc) and nonvolatile organic carbon (oc) mass ------------------------------------------ + + ! Aitken mode: mass that stays in aitken mode + + zsumm(1:kproma,:,ibcks) = paerml(1:kproma,:,ibcks)*zfconm(1:kproma,:,iaits) + + zsumm(1:kproma,:,iocks) = paerml(1:kproma,:,iocks)*zfconm(1:kproma,:,iaits) + + ! Accumulation mode: mass that stays in accum. mode plus: + ! mass transferred from the aitken mode + + zsumm(1:kproma,:,ibcas) = paerml(1:kproma,:,ibcas)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,ibcks)*(1._dp-zfconm(1:kproma,:,iaits)) + + zsumm(1:kproma,:,iocas) = paerml(1:kproma,:,iocas)*zfconm(1:kproma,:,iaccs) + & + paerml(1:kproma,:,iocks)*(1._dp-zfconm(1:kproma,:,iaits)) + + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + + zsumm(1:kproma,:,ibccs) = paerml(1:kproma,:,ibccs) + & + paerml(1:kproma,:,ibcas)*(1._dp-zfconm(1:kproma,:,iaccs)) + + zsumm(1:kproma,:,ioccs) = paerml(1:kproma,:,ioccs) + & + paerml(1:kproma,:,iocas)*(1._dp-zfconm(1:kproma,:,iaccs)) + +!csld bug burden + ! Store the final mass concentrations + paerml(1:kproma,:,ibcks) = zsumm(1:kproma,:,ibcks) + paerml(1:kproma,:,iocks) = zsumm(1:kproma,:,iocks) + paerml(1:kproma,:,ibcas) = zsumm(1:kproma,:,ibcas) + paerml(1:kproma,:,iocas) = zsumm(1:kproma,:,iocas) + paerml(1:kproma,:,ibccs) = zsumm(1:kproma,:,ibccs) + paerml(1:kproma,:,ioccs) = zsumm(1:kproma,:,ioccs) + !end csld + ! ---- end black carbon (bc) and nonvolatile organic carbon (oc) mass -------------------------------------- + + + ! ---- sea salt and dust mass ------------------------------------------------------------------------------ + + ! Accumulation mode: mass that stays in accum. mode + + zsumm(1:kproma,:,issas) = paerml(1:kproma,:,issas)*zfconm(1:kproma,:,iaccs) + + zsumm(1:kproma,:,iduas) = paerml(1:kproma,:,iduas)*zfconm(1:kproma,:,iaccs) + + ! Coarse mode: mass that stays in coarse mode plus mass transferred from accum. mode + + zsumm(1:kproma,:,isscs) = paerml(1:kproma,:,isscs) + & + paerml(1:kproma,:,issas)*(1._dp-zfconm(1:kproma,:,iaccs)) + + zsumm(1:kproma,:,iducs) = paerml(1:kproma,:,iducs) + & + paerml(1:kproma,:,iduas)*(1._dp-zfconm(1:kproma,:,iaccs)) + +!csld bug burden + ! ---- store the mass concentrations + paerml(1:kproma,:,issas) = zsumm(1:kproma,:,issas) + paerml(1:kproma,:,iduas) = zsumm(1:kproma,:,iduas) + paerml(1:kproma,:,isscs) = zsumm(1:kproma,:,isscs) + paerml(1:kproma,:,iducs) = zsumm(1:kproma,:,iducs) + !end csld + ! ---- end sea salt and dust mass -------------------------------------------------------------------------- + +END SUBROUTINE m7_dconc + + +SUBROUTINE m7_coaset(kproma, kbdim, klev, krow, paernl, ptp1, & + papp1, pm6rp, prhop, pcom ) + + ! + ! *m7_coaset* calculates the coagulation kernels between the modes + ! + ! Authors: + ! --------- + ! J. Wilson and E. Vignati, JRC/EI (original source) 09/2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! + ! Modifications: + ! -------------- + ! Philip Stier, MPI 2001 + ! Declan O'Donnell, MPI-M, 2009: performance improvements + ! + ! Purpose + ! --------- + ! This routine calculates the coaglation kernels between particles + ! with the count median radii of the three modes. + ! Coagulation allowed between the following modes: + ! soluble modes: 1+1=1, 2+2=2, 1+2=2, 1+3=3, 1+4=4, 2+3=3, 2+4=4 + ! insoluble modes: 2i+2i=2i + ! mixed modes: 1+2i=2, 1+4i=4, 2+2i=2, 2+4i=4, 3+2i=3, 4+2i=4 + ! + ! Interface: + ! ----------- + ! *m7_coaset* is called from *m7_dnum* + ! + ! Externals: + ! ----------- + ! none + ! + ! Reference: + ! ----------- + ! The calculations are based on: + ! Fuchs, N.A. (1964). The Mechanics of Aerosols. Pergamon Press. Oxford. + ! (Chapter VII, Section 49) + ! + ! Warning: + ! -------- + ! For optimization purposes currently only "physically reasonable" elements of the + ! coagulation kernel pcom are calculated in m7_concoag. These elements are specified + ! in the matrix locoagmask in mo_ham_m7ctl. Check carefully and adapt locoagmask + ! accordingly before changes in the code below. + ! + USE mo_ham, ONLY: nclass + USE mo_kind, ONLY: dp + USE mo_ham_m7ctl, ONLY: bk, ncoag, coag_modes, & + cmin_aernl, cminrad, cminrho + USE mo_math_constants, ONLY: pi, sqrt2 + ! + + IMPLICIT NONE + ! + !--- Parameter list: + ! + ! paernl = aerosol number for each mode [cm-3] + ! ptp1 = atmospheric temperature at time t+1 [K] + ! papp1 = atmospheric pressure at time t+1 [Pa] + ! pm6rp = mean mode actual radius (wet radius for soluble modes + ! and dry radius for insoluble modes) [cm] + ! prhop = mean mode particle density [g cm-3] + ! pcom(:,:,jm) = Coagulation coefficient + ! + !--- List of local variables: + ! + ! zwlc = mean free pathlength [] + ! zairvisc = air viscosity [] + ! zrpav = average radius of the two interacting modes + ! zpvx = volume of the xth interacting mode + ! zpmx = mass of the xth interacting mode + ! + ! zrknudx = knudsen number of the xth interacting mode + ! zpd2x = particle diffusion of the xth interacting mode + ! + !---subroutine interface + INTEGER, INTENT(IN) :: kproma, kbdim, klev, krow + REAL(dp), INTENT(IN) :: ptp1(kbdim,klev) + REAL(dp), INTENT(IN) :: papp1(kbdim,klev) + REAL(dp), INTENT(IN) :: pm6rp(kbdim,klev,nclass) + REAL(dp), INTENT(IN) :: prhop(kbdim,klev,nclass) + REAL(dp), INTENT(IN) :: paernl(kbdim,klev,nclass) + REAL(dp), INTENT(OUT) :: pcom(kbdim,klev,ncoag) + + !--- Local variables: + ! Parameters: + REAL(dp), PARAMETER :: zbkover6pi = bk / (6._dp*pi) + REAL(dp), PARAMETER :: z4piover3 = 4._dp*pi/3._dp + REAL(dp), PARAMETER :: z16pi = 16._dp*pi + REAL(dp), PARAMETER :: z8overpi = 8._dp/pi + REAL(dp), PARAMETER :: z8bkoverpi = 8._dp*bk/pi + REAL(dp), PARAMETER :: qsqrt2 = 1._dp / sqrt2 + + ! Local variables + INTEGER :: jm, jm2, jm1, jl, jk, jclass + ! + REAL(dp) :: zbtketc(kbdim,klev) + REAL(dp) :: zwlc(kbdim,klev) + REAL(dp) :: zpd(kbdim,klev,nclass) + REAL(dp) :: zcv2(kbdim,klev,nclass) + REAL(dp) :: zh2(kbdim,klev,nclass) + + LOGICAL :: lsuffaero(kbdim,klev,nclass) + + REAL(dp):: zairvisc, zeps, & + zrpvm, z2rpvm, zrpav, zpv1, & + zpm1, & + zcv2av, zrknud, & + ze, & + zpdav, zxd, & + zh2av, zcoc, zhu1, & + zhu2, zhu + + !---executable procedure + zeps = THRESHOLD !EPSILON(1._dp) + + !---1) gridpoint properties + DO jk=1,klev + DO jl=1,kproma + + !--- Mean free pathlength ? (from Knudsen Number below): + ! Parametrisation? + ! Grid point calculation, can be done once rather than 16 times. + ! old: + ! zpbyone=1000.0_dp / (papp1(jl,jk)/100.0_dp) + ! zwlc(jl,jk)=6.6e-6_dp * ptp1(jl,jk) / 293.15_dp * zpbyone + ! new: + zwlc(jl,jk) = 2.251E-3_dp * ptp1(jl,jk) / papp1(jl,jk) + + !--- Viscosity: (291.15..?) + zairvisc=1.827e-4_dp * (ptp1(jl,jk) / 291.15_dp)**0.74_dp + + !--- + zbtketc(jl,jk) = zbkover6pi * ptp1(jl,jk) / zairvisc + + END DO + END DO + + !---2) Per-mode properties + DO jclass=1,nclass + DO jk=1,klev + DO jl=1,kproma + + lsuffaero(jl,jk,jclass) = (paernl(jl,jk,jclass) > cmin_aernl .AND. & + pm6rp(jl,jk,jclass) > cminrad .AND. & + prhop(jl,jk,jclass) > cminrho) + + IF (lsuffaero(jl,jk,jclass)) THEN + + !---mode radius + zrpvm = pm6rp(jl,jk,jclass) + + !--- Volume and mass of mode: + zpv1=z4piover3 * zrpvm**3 + zpm1=zpv1 * prhop(jl,jk,jclass) + + !--- Squared mean particle velocity of mode: + zcv2(jl,jk,jclass)=z8bkoverpi * ptp1(jl,jk) / zpm1 + + !---Knudsen number of the mode: + zrknud=0.5_dp*zwlc(jl,jk)/zrpvm + + !---Diffusivity of the mode: + ze=EXP(-0.43_dp/zrknud) + zpd(jl,jk,jclass)=zbtketc(jl,jk) * (1.0_dp + zrknud*2.492_dp + zrknud*0.84_dp*ze) / zrpvm + + !--- Average mean free path of particles in the mode: + zxd=z8overpi * zpd(jl,jk,jclass) / SQRT(zcv2(jl,jk,jclass)) + + !--- Mean distance from surface after mean free path (Eq. 49.13): + z2rpvm = 2._dp*zrpvm + zh2(jl,jk,jclass)=(((z2rpvm + zxd)**3 - & + SQRT((z2rpvm*z2rpvm + zxd*zxd)**3) ) / & + (6.0_dp*zrpvm*zxd) - z2rpvm ) * sqrt2 + + ELSE + zpd(jl,jk,jclass) = 0._dp + zcv2(jl,jk,jclass) = 0._dp + zh2(jl,jk,jclass) = 0._dp + END IF + + END DO + END DO + END DO + + !--- 1) Calculation of the coagulation coefficient: --------------------------- + ! + DO jm=1,ncoag + + jm1 = coag_modes(jm)%mode1 + jm2 = coag_modes(jm)%mode2 + + DO jk=1,klev + DO jl=1,kproma + + IF (lsuffaero(jl,jk,jm1) .AND. lsuffaero(jl,jk,jm2)) THEN + !--- Average radius of the modes: + zrpav=0.5_dp*(pm6rp(jl,jk,jm1)+pm6rp(jl,jk,jm2)) + ! Note the pm6rp are > cimrad=1.e-8, so the following is not needed: + ! zrpav = MAX(zeps, 0.5_dp*(pm6rp(jl,jk,jm1)+pm6rp(jl,jk,jm2)) ) + + !--- Fuchs: G_r (below Eq. 49.27): + zcv2av=SQRT(zcv2(jl,jk,jm1) + zcv2(jl,jk,jm2)) + + !--- Average diffusivity of the modes: + zpdav=0.5_dp*(zpd(jl,jk,jm1) + zpd(jl,jk,jm2)) + + !--- Fuchs: delta_r !@@@ (why division by sqrt2?) + !>>dod deleted the division by sqrt(2) (redmine #58) + zh2av=SQRT(zh2(jl,jk,jm1)*zh2(jl,jk,jm1) + zh2(jl,jk,jm2)*zh2(jl,jk,jm2)) + !<>dod soa added pttn, removed bc, oc, dust averages + pa4av1, pa4av2, pttn, & + pso4_5, pso4_6, pso4_7, & +!<>dod soa + USE mo_ham, ONLY: nsoa, nsoaspec, naerocomp, nclass + USE mo_ham_soa, ONLY: soaprop + !>>dod deleted isoa_ix + USE mo_species, ONLY: speclist + !< zso4x/zcrtcst is the total number of particles that could be moved + ! from insoluble mode x to soluble modes. + ! + ! zcrit_x = total available number of particles in mode x that are moved from + ! insoluble mode x to the corresponding soluble mode. + !>>dod soa added krow + INTEGER :: kproma, kbdim, klev, krow + !<>dod soa removed bc, oc and du averages + pa4av1(kbdim,klev), pa4av2(kbdim,klev) + !<>dod soa + REAL(dp) :: pttn(kbdim,klev,naerocomp) + !<>dod soa + INTEGER :: jm, jn, jn2, jspec + !<= cmin_aernl .AND. zcrtcst(5)>zeps) THEN + zcrit_5=MIN(paernl(jl,jk,iaiti), zso45/zcrtcst(5)) + ELSE + zcrit_5=0._dp + END IF + IF(paernl(jl,jk,iacci) >= cmin_aernl .AND. zcrtcst(6)>zeps) THEN + zcrit_6=MIN(paernl(jl,jk,iacci), zso46/zcrtcst(6)) + ELSE + zcrit_6=0._dp + END IF + IF(paernl(jl,jk,icoai) >= cmin_aernl .AND. zcrtcst(7)>zeps) THEN + zcrit_7=MIN(paernl(jl,jk,icoai), zso47/zcrtcst(7)) + ELSE + zcrit_7=0._dp + END IF + + !--- 1.3) Number of particles moved from the mode 5 to 2 due to + ! interaction with 1 and due to condensation: + + paernl(jl,jk,iaits)=paernl(jl,jk,iaits)+zcrit_5 + paernl(jl,jk,iaiti)=paernl(jl,jk,iaiti)-zcrit_5 + + !--- 1.4) Mass moved from mode 5 to 2: + + pa4delt(jl,jk,2)=pa4delt(jl,jk,2)+pso4_5(jl,jk) + pa4delt(jl,jk,ibcks)=pa4delt(jl,jk,ibcks)+zcrit_5 * 1.E12_dp * pttn(jl,jk,ibcki) + pa4delt(jl,jk,iocks)=pa4delt(jl,jk,iocks)+zcrit_5 * 1.E12_dp * pttn(jl,jk,iocki) + + !>>dod soa + IF (nsoa ==1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(iaits) + jn2 = speclist(jspec)%iaerocomp(iaiti) + !<>dod soa + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(iaiti) + !<>dod soa + pa4delt(jl,jk,iso4as)=pa4delt(jl,jk,iso4as)+pso4_6(jl,jk) + pa4delt(jl,jk,iduas)=pa4delt(jl,jk,iduas)+zcrit_6 * 1.E12_dp * pttn(jl,jk,iduai) + !<>dod soa + paerml(jl,jk,iduai)=paerml(jl,jk,iduai)-zcrit_6 * 1.E12_dp * pttn(jl,jk,iduai) + !<>dod soa + pa4delt(jl,jk,iso4cs)=pa4delt(jl,jk,iso4cs)+pso4_7(jl,jk) + pa4delt(jl,jk,iducs)=pa4delt(jl,jk,iducs)+zcrit_7 * 1.E12_dp * pttn(jl,jk,iduci) + + !--- 1.11) Mass remaining in mode 7: + + paerml(jl,jk,iduci)=paerml(jl,jk,iduci)-zcrit_7 * 1.E12_dp * pttn(jl,jk,iduci) + + END DO + END DO + +END SUBROUTINE m7_concoag + + + SUBROUTINE m7_coat(pm6rp_lon_lev, pcrtcst) + + ! Purpose: + ! --------- + ! *m7_coat* calculates the number of sulfate + ! molecules required to coat a particle + ! with cLayerThickness of sulfate + ! + ! Author: + ! --------- + ! Philip Stier, MPI 2001 + ! + ! Interface: + ! --------- + ! *m7_coat* is called from *m7_concoag* + ! + + USE mo_ham, ONLY: nclass + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_ham_m7ctl, ONLY: so4_coating_threshold, & + cmr2ras + + IMPLICIT NONE + + INTEGER :: jclass + + REAL(dp) :: pm6rp_lon_lev(nclass) ! Ambient radii for current + ! longitude and level [cm] + REAL(dp) :: pcrtcst(nclass) ! Critical constant, i.e. number of + ! sulfate to cover an average particle + ! of the mode with a layer of the + ! thickness determined by cLayerThickness. + REAL(dp) :: zras(nclass) ! Radius of average surface + ! for a single particle [cm] + REAL(dp) :: zas(nclass) ! Average surface + ! for single particle [cm+2] + + REAL(dp), PARAMETER :: csurf_molec = 2.39E-15_dp ! Average cross-section + ! of a single H2SO4 molecule [cm+2] + + !--- 1) Calculate the radii of average surface for modes 5-7: + + zras(5) = pm6rp_lon_lev(5) * cmr2ras(5) + zras(6) = pm6rp_lon_lev(6) * cmr2ras(6) + zras(7) = pm6rp_lon_lev(7) * cmr2ras(7) + + DO jclass=5, 7 + + !--- 2) Calculate the average surface of an particle for modes 5-7: + + zas(jclass) = 4._dp * zras(jclass)**2 * pi + + !--- 3) Determine the number of sulfate molecules needed to form + ! a cLayerThickness thick layer of sulfate on the particles + ! in modes 5-7: + + pcrtcst(jclass) = (zas(jclass) / csurf_molec) * so4_coating_threshold + + END DO + + END SUBROUTINE m7_coat + + + + SUBROUTINE m7_delcoa(kproma, kbdim, klev, krow, paerml, & + !>>dod soa (added pttn) + paernl, pm6rp, pttn, pa4delt, panew, & + !<1 1+2=>2 1+3=>3, 2+2=>2 2+3=>3, 3+3=>3. + ! zc is now non zero for mode 1 only (nucleation). + ! All formation of higher mode particles is handled in dconc. + ! + ! For climatological studies, 5 day accumulation mode concs are + ! within a factor of 2 of the full model. + ! + ! Interface + ! ----------- + ! *m7_delcoa* is called from *m7_dnum* + ! + ! Externals + ! ----------- + ! none + ! + + USE mo_kind, ONLY: dp + USE mo_time_control, ONLY: time_step_len + USE mo_ham_m7ctl, ONLY: cmin_aernl, cmin_aerml, & + iaiti, ibcki, iocki, ibcks, & + iocks, ibcas, iocas, ibccs, & + ioccs, iacci, & + !>>dod soa + iso4ns, iso4ks, iso4as, iso4cs, & + icoai, iaits, inucs, iaccs, & + icoas + !<>dod deleted isoa_ix + USE mo_ham_soa, ONLY: soaprop + !<>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, timer_ham_m7_concoag +#endif + IMPLICIT NONE + + !--- Parameter list: + ! + ! paerml = total aerosol mass for each compound + ! [molec. cm-3 for sulphate; ug m-3 for others] + ! paernl = aerosol number for each mode [cm-3] + ! pm6rp = mean mode actual radius (wet radius for soluble modes + ! and dry radius for insoluble modes) [cm] + ! pa4delt(:,:,:) = change in H2SO4 mass of the respective mode over one timstep + ! due to: + ! - nucleation of H2SO4 (calculated in m7_nuck) + ! - coagulation (calculated in m7_concoag) + ! panew = number of nucleated particles (during 1 timestep) [1] + ! pa = unimodal coagulation coefficient (zcom(mod)) [] + ! pb = inter-modal coagulation with higher modes + ! (zcom(mod) * n(jclass+1)) [] + ! pbfractx(:,:,y) = fraction of the total number of particles removed by + ! coagulation from mode x that is moved to mode y+1 [1] + ! pso4_x = mass of sulphate condensed on insoluble mode x [molec. cm-3] + ! + !--- Local variables: + ! + ! zansum = aerosol number in the respective mode [cm-3] + ! zxxsum = aerosol mass for compound xx in the respective + ! mode, e.g. xx = bc, oc, a4 (sulfate) + ! [g cm-3 for bc,oc and molec. cm-3 for sulfate] + ! zxxav = average mass of a sulfate particle in the respective + ! mode [molecules] + ! zxxavy = average mass of species xx in mode y [] + ! where xx is ss, du, bc, oc, or a4 for sulfate + ! [molecules for sulfate and ug for others] + ! zanli(:,:,:) = Number of particles moved by the inter-modal + ! coagulation [] + ! zansq(:,:,:) = Number of particles moved by the intra-modal + ! coagulation [] + ! zaernt(:,:,:) = New particle number n(t+dt) after the integration + ! of the aerosol dynamics equation [cm-3] + + !--- Parameters: + + INTEGER :: kproma, kbdim, klev, krow + + REAL(dp):: paerml(kbdim,klev,naerocomp), paernl(kbdim,klev,nclass), & + pa4delt(kbdim,klev,naerocomp), panew(kbdim,klev), & + pm6rp(kbdim,klev,nclass) + !>>dod soa + REAL(dp) :: pttn(kbdim,klev,naerocomp) + !<>dod soa: removed arrays of average particle mass (replaced by pttn) + REAL(dp):: za4av1(kbdim,klev), za4av2(kbdim,klev) + !<>dod replaced arrays zansq and zaernt with scalars + REAL(dp):: zanli(kbdim,klev,nclass), zansq, zaernt + !<>dod soa + REAL(dp) :: zbcmass, zocmass, zsoamass + INTEGER :: jspec, isoans, isoaks, isoaas, isoacs, jn2 + !<>dod soa deleted array initialisations but inserted zanli + zanli(:,:,:) = 0._dp + !<>dod soa : do nothing. + !< cmin_aernl) THEN + + !--- 1.1) Case of no coagulation: + ! + ! (pa(jl,jk,iaiti) < 1.e-15 .AND. pb(jl,jk,iaiti) < 1.e-15) + ! + ! => Nothing to be done + + !--- 1.2) Case with coagulation: + + IF (pa(jl,jk,iaiti) >= zmin_coag .OR. pb(jl,jk,iaiti) >= zmin_coag) THEN + + !--- 1.2.1) Case of no inter-modal coagulation: + ! dn/dt = -a*n**2 => + ! n(t) = n0/(1 + n0*a*(t-t0)) + + IF (pb(jl,jk,iaiti) < zmin_coag) THEN + zaernt = zansum/(1.0_dp+zansum*pa(jl,jk,iaiti)*ztmst) + !---zanli unchanged = 0 + zansq = zansum-zaernt + + !--- 1.2.2) Case with inter- and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n => + ! n(t) = (b*n0*exp(-b(t-t0)))/((n0*a)(1-exp(-b(t-t0)))+b) + ELSE + !--- Calculate n(t+dt): + ze1=EXP(-pb(jl,jk,iaiti)*ztmst) + ztop=pb(jl,jk,iaiti)*zansum*ze1 + zbot=zansum*pa(jl,jk,iaiti)*(1.0_dp-ze1)+pb(jl,jk,iaiti) + zaernt=ztop/zbot + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Total change in particle numbers of the mode due to coagulation: + zatot=zansum-zaernt + !--- Contribution of the intra-modal coagulation: + zanse=zansum*zansum*pa(jl,jk,iaiti) + !--- Contribution of the inter-modal coagulation: + zanle=zansum*pb(jl,jk,iaiti) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,iaiti)=zatot*zanle/(zanse+zanle) + !--- Number of particles moved by the intra-modal coagulation: + zansq=zatot*zanse/(zanse+zanle) + + END IF + + !--- 1.2.3) Change masses of the insoluble aitken mode due to + ! intra-modal coagulation and the coagulation with the + ! nucleation mode (transfers to the soluble modes + ! of the particles coagulating with the nucleation mode + ! are done in m7_concoag): + paerml(jl,jk,ibcki) = zaernt * pttn(jl,jk,ibcki) * 1.e12_dp + paerml(jl,jk,iocki) = zaernt * pttn(jl,jk,iocki) * 1.e12_dp + + + !--- 1.2.4) Change the numbers of the insoluble aitken mode due to + ! intra-modal coagulation: + + paernl(jl,jk,iaiti)=zaernt + pbfract5(jl,jk,1)*zanli(jl,jk,iaiti) + + !--- 1.2.5) Store changes in masses of compounds in the insoluble + ! aitken mode due to inter-modal coagulation: + ! (zanli(:,:,x) = total number of particles moved from mode x + ! pbfract5(:,:,x)= fraction of the total number of particles + ! moved from mode 5 that is moved to mode x ) + + pa4delt(jl,jk,ibcks)=pbfract5(jl,jk,2)*zanli(jl,jk,iaiti)*pttn(jl,jk,ibcki)*1.e12_dp + pa4delt(jl,jk,iocks)=pbfract5(jl,jk,2)*zanli(jl,jk,iaiti)*pttn(jl,jk,iocki)*1.e12_dp + pa4delt(jl,jk,ibcas)=pbfract5(jl,jk,3)*zanli(jl,jk,iaiti)*pttn(jl,jk,ibcki)*1.e12_dp + pa4delt(jl,jk,iocas)=pbfract5(jl,jk,3)*zanli(jl,jk,iaiti)*pttn(jl,jk,iocki)*1.e12_dp + + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(iaiti) + !<>dod deleted isoa_ix + jn = speclist(jspec)%iaerocomp(iaits) + jn2 = speclist(jspec)%iaerocomp(iaccs) + + pa4delt(jl,jk,jn) = pbfract5(jl,jk,2)*zanli(jl,jk,iaiti) * zsoamass + pa4delt(jl,jk,jn2) = pbfract5(jl,jk,3)*zanli(jl,jk,iaiti) * zsoamass + !< cmin_aernl) THEN + + za4av=za4sum/zansum + + IF (jclass.EQ.1) THEN + za4av1(jl,jk)=za4av + ELSE IF (jclass.EQ.2) THEN + za4av2(jl,jk)=za4av + END IF + + !--- 2.1) Case of no coagulation: + ! + IF (pa(jl,jk,jclass) < zmin_coag .AND. pb(jl,jk,jclass) < zmin_coag) THEN + !--- Nucleation in mode 1 only. + ! Nothing to be done for other modes. + + IF(jclass.EQ.1) THEN + paerml(jl,jk,iso4ns)=za4sum + paernl(jl,jk,inucs)=zansum + + END IF + + !--- 2.2) Case with coagulation: + + ELSE + + !--- 2.2.1) Case of no nucleation: + + !--- Not Mode 1 or Nucleation rate below 1/s: + + IF ( (jclass .NE. 1) .OR. (panew(jl,jk)/ztmst < 1.0_dp) ) THEN + + paernl(jl,jk,jclass)=zansum + + !--- 2.2.1a) Case of no inter-modal coagulation: + ! dn/dt = -a*n**2 => + ! n(t) = n0/(1 + n0*a*(t-t0)) + + IF (pb(jl,jk,jclass) < zmin_coag) THEN + zaernt=zansum/(1.0_dp+zansum*pa(jl,jk,jclass)*ztmst) + !---zanli unchanged (=0) + zansq=zansum-zaernt + + !--- 2.2.1b) Case with inter- and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n => + ! n(t) = (b*n0*exp(-b(t-t0)))/((n0*a)(1-exp(-b(t-t0)))+b) + + ELSE + !--- Calculate n(t+dt): + ze1=EXP(-pb(jl,jk,jclass)*ztmst) + ztop=pb(jl,jk,jclass)*zansum*ze1 + zbot=zansum*pa(jl,jk,jclass)*(1.0_dp-ze1)+pb(jl,jk,jclass) + zaernt=ztop/zbot + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Total change in particle numbers of the mode due to coagulation: + zatot=zansum-zaernt + !--- Contribution of the intra-modal coagulation: + zanse=zansum*zansum*pa(jl,jk,jclass) + !--- Contribution of the inter-modal coagulation: + zanle=zansum*pb(jl,jk,jclass) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,jclass)=zatot*zanle/(zanse+zanle) + !--- Number of particles moved by the intra-modal coagulation: + zansq=zatot*zanse/(zanse+zanle) + END IF + + !--- 2.2.2) Case with nucleation: + + ELSE IF ( (jclass .EQ. 1) .AND. (panew(jl,jk)/ztmst >= 1.0_dp) ) THEN + + !--- 2.2.2a) Nucleation, inter- and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n + c => + ! n(t) = -(b/(2a)) + + ! R/2a * [ ((1 - (-2ax0-b+R)/(+2ax0+b+R))exp(-Rt)) / + ! ((1 + (-2ax0-b+R)/(+2ax0+b+R))exp(-Rt)) ] + ! where: R=SQRT(b**2+4ac) + ! + ! If b/=0 then always a/=0. The only case where a would be 0 + ! and b unequal zero is the case of no pre-existing particles + ! in the nucleation mode but pre-existing particles in other + ! modes. For this case a is calculated for an assumed radius + ! of a critical cluster in m7_coaset. + + IF (pb(jl,jk,jclass) >= zmin_coag) THEN + !--- Calculate n(t): + !--- c: + zc=panew(jl,jk)/ztmst + !--- R: + zf1=pb(jl,jk,jclass)*pb(jl,jk,jclass)+4.0_dp*pa(jl,jk,jclass)*zc + zr1=SQRT(zf1) + !--- exp(-Rt): + ze1=EXP(-zr1*ztmst) + !--- 2ax0+b: + zf2=2.0_dp*pa(jl,jk,jclass)*paernl(jl,jk,jclass)+pb(jl,jk,jclass) + !--- Term in squared bracket: + zf3=ze1*(zr1-zf2)/(zr1+zf2) + zf4=(1.0_dp-zf3)/(1.0_dp+zf3) + !--- n(t): + zaernt=(zr1*zf4-pb(jl,jk,jclass))/2.0_dp/pa(jl,jk,jclass) + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Total change in particle numbers of the mode due to coagulation: + zatot=zansum-zaernt + !--- Contribution of the intra-modal coagulation: + zanse=zansum*zansum*pa(jl,jk,jclass) + !--- Contribution of the inter-modal coagulation: + zanle=zansum*pb(jl,jk,jclass) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,jclass)=zatot*zanle/(zanse+zanle) + !--- Number of particles moved by the intra-modal coagulation: + zansq=zatot*zanse/(zanse+zanle) + + !--- 2.2.2b) Nucleation and intra-modal coagulation: + ! dn/dt = -a*n**2 - b*n + c with b=0 => + ! dn/dt = -a*n**2 + c => + ! n(t) = R/2a * [ ((1 - (-2ax0+R)/(+2ax0+R))exp(-Rt)) / + ! ((1 + (-2ax0+R)/(+2ax0+R))exp(-Rt)) ] + ! where: R=SQRT(4ac) + ! + ! Can be shown to be equivalent to: + ! + ! n(t) = R1*((x0+R1)/(x0-R1)+exp(-SQRT(-4ac)t)) / + ! ((x0+R1)/(x0-R1)-exp(-SQRT(-4ac)t)) + ! where R1=SQRT(c/a) + + ELSE IF (pb(jl,jk,jclass) < zmin_coag) THEN + !--- c: + zc=panew(jl,jk)/ztmst + !--- R1: + zr1=SQRT(zc/pa(jl,jk,jclass)) + !--- exp(-Rt): + ze1=EXP(-zr1*2.0_dp*pa(jl,jk,jclass)*ztmst) + !--- n(t): + IF (ABS(paernl(jl,jk,jclass)-zr1) < SPACING(MAX(paernl(jl,jk,jclass),zr1))) THEN + zaernt=zr1 + ELSE + zf1=(paernl(jl,jk,jclass)+zr1)/(paernl(jl,jk,jclass)-zr1) + ztop=zr1*(zf1+ze1) + zbot=zf1-ze1 + IF (zbot < zmin_coag) THEN + zaernt=zansum + ELSE + zaernt=ztop/zbot + END IF + ENDIF + !--- Limit n(t+dt) to available particle in the mode: + zaernt=MIN(zaernt, zansum) + !--- Number of particles moved by the inter-modal coagulation: + zanli(jl,jk,jclass)=0.0_dp + !--- Number of particles moved by the intra-modal coagulation: + zansq=zansum-zaernt + END IF + END IF + !---2.2.3 New bit for insoluble/souble coagulation + !--- sum total insoluble+soluble paticles in mode jclass JJNW + IF (jclass .EQ. 1 .AND. zanli(jl,jk,jclass)>0.0_dp) THEN + zaerni=paernl(jl,jk,iaiti)+paernl(jl,jk,iacci)+paernl(jl,jk,icoai) + zaerns=zansum+paernl(jl,jk,iaits) + ! zaerns=zansum + ztotn=zaerns+zaerni + IF (zaerns .gt. zaerni .and. zaerni .gt. zeps) THEN !SF (#136): use zeps instead of 0._dp + ! calculate analytical solution no of mixed particles for coagulation + ! between paernl(jl,jk,jclass) soluble particles and zaerni insouble of + ! the same dimensions + IF (zaerni .gt. 1.0_dp) then + zanytni=4.0_dp*zaerni/((2.0_dp+pa(jl,jk,jclass)*ztmst*ztotn)* & + (2.0_dp+pa(jl,jk,jclass)*ztmst*(ztotn-zaerni))) + ELSE + zanytni = 0.0_dp + ENDIF + zanytnt=2.0_dp*ztotn/(2.0_dp+pa(jl,jk,jclass)*ztmst*ztotn) + zanytns=4.0_dp*zaerns/((2.0_dp+pa(jl,jk,jclass)*ztmst*ztotn)* & + (2.0_dp+pa(jl,jk,jclass)*ztmst*(ztotn-zaerns))) + zanytnm=zanytnt-(zanytni+zanytns) + zanytnm=min(zanytnm,zaerni) + zanytni=zaerni-zanytnm + zanytns=zaernt + + IF (za4av > 0._dp) THEN +!DIR$ UNROLL +!CDIR UNROLL=7 + DO kmod=1,nclass + zm6rp(kmod)=pm6rp(jl,jk,kmod) + END DO + CALL m7_coat(zm6rp,zcrtcst) + zamloss5=paernl(jl,jk,5)/zaerni*zanytnm*zcrtcst(5) + zanloss5=zamloss5/za4av + zamloss6=paernl(jl,jk,6)/zaerni*zanytnm*zcrtcst(6) + zanloss6=zamloss6/za4av + zamloss7=paernl(jl,jk,7)/zaerni*zanytnm*zcrtcst(7) + zanloss7=zamloss7/za4av + ELSE + zamloss5 = 0._dp + zamloss6 = 0._dp + zamloss7 = 0._dp + zanloss5 = 0._dp + zanloss6 = 0._dp + zanloss7 = 0._dp + END IF + ztloss=zanloss5+zanloss6+zanloss7 + zms=zansq*0.95_dp + + ztloss=min(ztloss,zansq*0.95_dp) + zbfofac=zanli(jl,jk,jclass)/(zanli(jl,jk,jclass)+ztloss) + zbfnfac=ztloss/(zanli(jl,jk,jclass)+ztloss) + zanli(jl,jk,jclass)=zanli(jl,jk,jclass)+ztloss + zansq=zansq-ztloss + zbftot=0.0_dp +!DIR$ UNROLL +!CDIR UNROLL=7 + DO kmod=1,nclass + IF(kmod>jclass) THEN + pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)*zbfofac + + + IF (kmod.GE.5) THEN + pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)+ & + zbfnfac*paernl(jl,jk,kmod)/zaerni + + END IF + zbftot=zbftot+pbfract1(jl,jk,kmod-jclass) + END IF + END DO +!DIR$ UNROLL +!CDIR UNROLL=7 + DO kmod=1,nclass + IF (kmod>jclass) THEN +!kai + ! Current value of THRESHOLD (epsilon of double precision) sits between TINY and + ! EPSILON. Fine, mimics original DP case when running in SP. + IF (abs(zbftot).gt.zeps) then + pbfract1(jl,jk,kmod-jclass)=pbfract1(jl,jk,kmod-jclass)/zbftot + ELSE + pbfract1(jl,jk,kmod-jclass)=0._dp + END IF + + END IF + END DO + END IF + END IF + !---- End of new inslouble/soluble caogulation routine JJNW + !--- 2.3) Change masses and numbers of the respective modes to account----------- + ! for intra-modal coagulation (zansq) and coagulation with + ! higher modes (zaernt): + ! + !--- 2.3.1) Change mass of the sulfur compounds: + + paerml(jl,jk,jclass)=(zaernt+zansq)*za4av + + !--- 2.3.2) Change mass of the carbon compounds: + + IF (jclass.EQ.2) THEN + paerml(jl,jk,ibcks)=(zaernt+zansq)*pttn(jl,jk,ibcks)*1.E12_dp + paerml(jl,jk,iocks)=(zaernt+zansq)*pttn(jl,jk,iocks)*1.E12_dp + ELSE IF (jclass.EQ.3) THEN + paerml(jl,jk,ibcas)=(zaernt+zansq)*pttn(jl,jk,ibcas)*1.E12_dp + paerml(jl,jk,iocas)=(zaernt+zansq)*pttn(jl,jk,iocas)*1.E12_dp + ELSE IF (jclass.EQ.4) THEN + paerml(jl,jk,ibccs)=(zaernt+zansq)*pttn(jl,jk,ibccs)*1.E12_dp + paerml(jl,jk,ioccs)=(zaernt+zansq)*pttn(jl,jk,ioccs)*1.E12_dp + END IF + + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (sizeclass(jclass)%lsoainclass .AND. (.NOT. soaprop(jm)%lvolatile)) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(jclass) + !<>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + isoans = speclist(jspec)%iaerocomp(inucs) + isoaks = speclist(jspec)%iaerocomp(iaits) + isoaas = speclist(jspec)%iaerocomp(iaccs) + isoacs = speclist(jspec)%iaerocomp(icoas) + + zsoamass = 1.E12_dp*pttn(jl,jk,isoans)*zanli(jl,jk,1) + + !---mass from nucs to aits + pa4delt(jl,jk,isoaks) = zsoamass * ( pbfract1(jl,jk,1) + & + !---add mass from nucs to aits due to coag with aiti + pbfract1(jl,jk,4) ) + + !---mass from nucs to accs + pa4delt(jl,jk,isoaas) = zsoamass * ( pbfract1(jl,jk,2) + & + !---add mass from nucs to accs due to coag with acci + pbfract1(jl,jk,5) ) + + !---mass from nucs to coas + pa4delt(jl,jk,isoacs) = zsoamass * ( pbfract1(jl,jk,3) + & + !---add mass from nucs to coas due to coag with coai + pbfract1(jl,jk,6) ) + !<>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + isoaks = speclist(jspec)%iaerocomp(iaits) + isoaas = speclist(jspec)%iaerocomp(iaccs) + isoacs = speclist(jspec)%iaerocomp(icoas) + + zsoamass = 1.E12_dp*pttn(jl,jk,isoaks)*zanli(jl,jk,2) + + !---mass from aits to accs + pa4delt(jl,jk,isoaas) = pa4delt(jl,jk,isoaas) + & + zsoamass * ( pbfract2(jl,jk,2) + & + !---add mass from aits to accs due to coag with acci + pbfract2(jl,jk,5) ) + + !---mass from aits to coas + pa4delt(jl,jk,isoacs) = pa4delt(jl,jk,isoacs) + & + zsoamass * ( pbfract2(jl,jk,3) + & + !---add mass from aits to coas due to coag with coai + pbfract2(jl,jk,6) ) + !<>dod soa + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (.NOT. soaprop(jm)%lvolatile) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + isoaks = speclist(jspec)%iaerocomp(iaits) + + zsoamass = 1.E12_dp*pttn(jl,jk,isoaks)*zanli(jl,jk,2) + + pa4delt(jl,jk,isoaks) = pa4delt(jl,jk,isoaks) + zsoamass * pbfract2(jl,jk,4) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_concoag) + !<>dod soa: added pttn, removed bc,oc and du averages + za4av1, za4av2, pttn, & + pso4_5, pso4_6, pso4_7, & + !<>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_concoag) + !<>dod soa + DO jclass=1,nclass + jm = speclist(id_so4)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_so4) + IF (jm > 0 .AND. jclass /= inucs) paerml(1:kproma,:,jm) = paerml(1:kproma,:,jm) + & + pa4delt(1:kproma,:,jm) + jm = speclist(id_bc)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_bc) + IF (jm > 0) paerml(1:kproma,:,jm)=paerml(1:kproma,:,jm)+pa4delt(1:kproma,:,jm) + jm = speclist(id_oc)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_oc) + IF (jm > 0) paerml(1:kproma,:,jm)=paerml(1:kproma,:,jm)+pa4delt(1:kproma,:,jm) + jm = speclist(id_du)%iaerocomp(jclass) !!mgs!! im7table(jclass,id_du) + IF (jm > 0) paerml(1:kproma,:,jm)=paerml(1:kproma,:,jm)+pa4delt(1:kproma,:,jm) + + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (sizeclass(jclass)%lsoainclass .AND. (.NOT. soaprop(jm)%lvolatile)) THEN + !>>dod deleted isoa_ix + jspec = soaprop(jm)%spid_soa + jn = speclist(jspec)%iaerocomp(jclass) + paerml(1:kproma,:,jn) = paerml(1:kproma,:,jn) + pa4delt(1:kproma,:,jn) + !< +!! \filename +!! mo_ham_m7_emi_seasalt.f90 +!! +!! \brief +!! This module contains several sea salt emission schemes. +!! +!! \author Kai Zhang (MPI-Met) (see also the individual subroutines) +!! +!! \responsible_coder +!! Kai Zhang, kai.zhang@pnnl.gov +!! +!! \revision_history +!! -# Kai Zhang (MPI-Met) - original code (2009) +!! +!! \limitations +!! [ Start an optional warning here ] +!! +!! \details +!! Use nseasalt in namelist hamctl to select the scheme you want: +!! - seasalt_emissions_monahan: nseasalt=1 +!! - seasalt_emissions_lsce: nseasalt=2 +!! - seasalt_emissions_mh: nseasalt=4 +!! - seasalt_emissions_guelle: nseasalt=5 +!! - seasalt_emissions_gong: nseasalt=6 +!! - seasalt_emissions_long nseasalt=7 +!! - seasalt_emissions_gong_SST nseasalt=8 +!! +!! \bibliographic_references +!! - see individual seasalt scheme routines +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Anton Laakso: Currently +!---- + +MODULE mo_ham_m7_emi_seasalt + + !---inherited types, data and functions + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + !---public member functions + PUBLIC :: start_emi_seasalt + !PUBLIC :: seasalt_emissions_monahan ! nseasalt=1 + !PUBLIC :: seasalt_emissions_lsce ! nseasalt=2 + !!PUBLIC :: seasalt_emissions_martensson !nseasalt=3 + !PUBLIC :: seasalt_emissions_mh !nseasalt=4 + !PUBLIC :: seasalt_emissions_guelle !nseasalt=5 + !PUBLIC :: seasalt_emissions_gong !nseasalt=6 + !PUBLIC :: seasalt_emissions_long !nseasalt=7 + PUBLIC :: seasalt_emissions_gong_SST !nseasalt=8 + + !---module data + REAL(dp), PARAMETER, PRIVATE :: ppww = 3.41_dp ! exponent of wind speed |u| (|u|**ppww) + + INTEGER, PARAMETER, PRIVATE :: nbin = 300 ! number of bins for the bin schemes + ! (Monahan (nseasalt=4), Guelle or Gong, Long) + REAL(dp), PARAMETER, PRIVATE :: dmta = 0.100E-06_dp ! lower diameter [m], bin schemes + REAL(dp), PARAMETER, PRIVATE :: dmtd = 1.000E-05_dp ! upper diameter [m], bin schemes + + REAL(dp), PARAMETER, PRIVATE :: dmtb_gong = 0.221E-06_dp ! diameter limit, [m], corresponding to + ! 0.2um wet radius at 80% RH (G03), 0.2*2/1.814 + REAL(dp), PARAMETER, PRIVATE :: dmtb_guelle = 8.000E-06_dp ! dry diameter limit, [m], corresonding + ! to 4um radius in G01 + + REAL(dp), PARAMETER, PRIVATE :: dbeg(3) = (/0.050E-6_dp, 0.100E-6_dp, 1.000E-6_dp/) ! ait, acc, coa + REAL(dp), PARAMETER, PRIVATE :: dend(3) = (/0.100E-6_dp, 1.000E-6_dp, 1.000E-5_dp/) ! ait, acc, coa + + REAL(dp), PRIVATE :: dmt(nbin) + + REAL(dp), PRIVATE :: rm(nbin) + REAL(dp), PRIVATE :: rd(nbin) + REAL(dp), PRIVATE :: bmn(nbin) + + REAL(dp), PRIVATE :: ss1_mon ! sea salt flux factor 1, Monahan (nseasalt=1) scheme + REAL(dp), PRIVATE :: ss2_mon ! sea salt flux factor 2, Monahan (nseasalt=1) scheme + + + CONTAINS + + SUBROUTINE start_emi_seasalt + + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_ham, ONLY: nseasalt + !USE mo_exception, ONLY: message, message_text, em_param + !USE mo_util_string, ONLY: separator + + IMPLICIT NONE + + !---local variables + ! intermediate variables in calculating flux factors ss1 and ss2 for the monahan (nseasalt=1) scheme + REAL(dp) :: zr1, zr2, zb1, zb2, zx1, zx2, zdr1, zdr2 + REAL(dp) :: zfact + + ! variables for constructing bins in the bin schemes + REAL(dp) :: zdx, zdd + INTEGER :: m + + !---executable procedure + + !---initialize the monahan (nseasalt=1) scheme (copy/paste ECHAM5/HAM2 code) + zr1=0.416_dp + zr2=3.49_dp + zb1=0.58_dp-1.54_dp*LOG10(zr1) + zb2=0.58_dp-1.54_dp*LOG10(zr2) + zx1=10._dp**(1.19_dp*EXP(-zb1*zb1)) + zx2=10._dp**(1.19_dp*EXP(-zb2*zb2)) + zdr1=0.5_dp + zdr2=4.5_dp + zfact=1.373_dp*4._dp/3._dp*pi*1.15e3_dp + ss1_mon=zfact*(1._dp+0.057_dp*zr1**1.05_dp)*zx1*zdr1*1.e-18_dp + ss2_mon=zfact*(1._dp+0.057_dp*zr2**1.05_dp)*zx2*zdr2*1.e-18_dp + + !IF (nseasalt==1) THEN + ! CALL message('', separator) + ! CALL message('', 'Monahan seasalt emissions:', level=em_param) + ! WRITE(message_text, '(a,e25.15,a,e25.15)') 'Factors for sea salt fluxes: 1st = ',ss1_mon, '2nd = ', ss2_mon + ! CALL message('', message_text, level=em_param) + ! CALL message('', separator) + !END IF + + !---construction of bins + ! dDp, take LOG scale + + zdx = (LOG(dmtd) - LOG(dmta) ) / REAL(nbin,dp) + + zdd = 0._dp + + DO m = 1, nbin + dmt(m) = EXP(LOG(dmta) + zdd) + zdd = zdd + zdx + END DO + + ! dry radius (m) + + rd(:) = dmt(:) * 0.5_dp + + ! wet radius (um) at RH=80% + + rm(:) = 2.0_dp*rd(:)*1.E+06_dp +#ifdef HAMMOZ + ! B: monahan and guelle schemes, also for larger particle in Gong scheme + bmn(:) = ( 0.380_dp - LOG10( rm(:) ) ) / 0.650_dp + + ! B: overwrite for smaller particles in the Gong scheme + IF (nseasalt == 6 .or. nseasalt == 8 ) THEN + DO m = 2,nbin + IF (dmt(m).GT.dmta .and. dmt(m).le.dmtb_gong) THEN + bmn(m) = ( 0.433_dp - LOG10( rm(m) ) ) / 0.433_dp + END IF + END DO + END IF +#else + + + ! alaak: openIFS - Gong used for all bins + IF (nseasalt == 6 .or. nseasalt == 8 ) THEN + bmn(:) = ( 0.433_dp - LOG10( rm(:) ) ) / 0.433_dp + END IF + + +#endif + END SUBROUTINE start_emi_seasalt + + + SUBROUTINE seasalt_emissions_gong_SST(kproma, kbdim, krow , sst, wind10m, ss_density, slf, alake, seaice, pmassf_as, pmassf_cs,pnumf_as, pnumf_cs, SSCAL) + + ! + ! Description: + ! ------------ + ! Calculates the emitted sea salt flux from the 10m wind speed following + ! Gong, 2003 + ! + ! method: M86/lab + ! size: 0.07um < r80 < 20um + ! wind speed: N.A. + ! SST: Explicit SST dependence, according to Sofiev et al 2011 + ! + ! currently Aitken mode particles are negelected. + ! + ! Authors: + ! ------------ + ! Kai Zhang, MPI-Met, 2009, modified by I. Tegen, 2016 + ! + ! References: + ! ------------ + ! 1. Monahan, E. C., D. E. Spiel, and K. L. Davidson, + ! A model of marine aerosol generation via whitecaps and wave disruption, + ! in Oceanic Whitecaps, edited by E. C. Monahan and G. MacNiochaill, + ! pp. 167–193, D. Reidel, Norwell, Mass., 1986. (M86) + ! + ! 2. S.L. Gong, + ! A parameterization of sea-salt aerosol source function for sub- and super-micron particles, + ! Global Biogeochemical Cycles 17 (2003) (4), p. 1097. (G03) + ! + ! 3. Sofiev, M., Soares,J.,Prank, M., deLeeuw, G., Kukkonen, J., A + ! regional-to-global model of emission and transport of sea salt particles + ! in the atmosphere, JGR (doi:0148‐0227/11/2010JD014713) + + ! + + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_species, ONLY: speclist + !USE mo_ham_species, ONLY: id_ss + !USE mo_memory_g3b, ONLY: slf, alake, seaice + !USE mo_vphysc, ONLY: vphysc + + IMPLICIT NONE + + !--- Parameters: + ! - + + + !--- I/O: + + INTEGER, INTENT(in) :: kproma !kproma + INTEGER, INTENT(in) :: kbdim !column + INTEGER, INTENT(in) :: krow !chunk + REAL(dp), INTENT(in) :: sst(kbdim),wind10m(kbdim),ss_density,slf(kbdim),alake(kbdim),seaice(kbdim) + REAL(dp),INTENT(out) :: pmassf_as(kbdim) ! mass flux of ss acc particles + REAL(dp),INTENT(out) :: pmassf_cs(kbdim) ! mass flux of ss coa particles + REAL(dp),INTENT(out) :: pnumf_as(kbdim) ! number flux of ss acc particles + REAL(dp),INTENT(out) :: pnumf_cs(kbdim) ! number flux of ss coa particles + REAL(dp), INTENT(in) ::SSCAL !SEASALT deactivation !Mch + !--- Local: + + REAL(dp):: zseafrac(kbdim) ! fraction of the gridcell covered by + ! non-iced sea water [0.-1.] + REAL(dp):: zmassf_ks(kbdim) ! mass flux of ss ait particles (currently not supported) + REAL(dp):: znumf_ks(kbdim) ! number flux of ss ait particles (currently not supported) + + + + + + + REAL(dp):: fi(kbdim,nbin) + REAL(dp):: p0,p1,p2,p3,dr + REAL(dp):: zav !particle volumn + REAL(dp):: SST_corr(1:kproma),SST_corr_1,SST_corr_2,dmtum(nbin) + REAL(dp):: SST_mask1(1:kproma),SST_mask2(1:kproma),SST_mask3(1:kproma),SST_corr_all(1:kproma) + + + + + INTEGER :: m + + ! initialize number flux for each bin (#/m2/s) + + fi = 0._dp + + ! calculate fraction of the gridcell of non ice-covered water +#ifdef HAMMOZ + zseafrac(1:kproma) = (1._dp-slf(1:kproma)-alake(1:kproma))*(1._dp-seaice(1:kproma)) +#else + !alaak: seaice fraction of gridbox in oifs: + zseafrac(1:kproma) = 1._dp-slf(1:kproma)-alake(1:kproma)-seaice(1:kproma) +#endif + zseafrac(1:kproma) = MAX(0._dp,MIN(zseafrac(1:kproma),1._dp)) + + !>>SF #458 (replacing where statements) + zseafrac(1:kproma) = MERGE( & + 0._dp, & + zseafrac(1:kproma), & + (slf(1:kproma) > 0.5_dp)) + !< micrometers + + SST_corr_1 = 0.092e0*dmtum(m)**(-0.96e0) ! valid for Tw=271.15K ; -2°C ! T base (Long) 25 deg + SST_corr_2 = 0.15e0*dmtum(m)**(-0.88e0) ! valid for Tw=278.15K ; 5°C + + ! SST_corr_1 = 0.19e0*dmtum(m)**(-0.60e0) ! valid for Tw=271.15K ; -2°CC T base (Long) 15 deg + ! SST_corr_2 = 0.31e0*dmtum(m)**(-0.56e0) ! valid for Tw=278.15K ; 5°C + + !SST_corr_1 = 0.13e0*dmtum(m)**(-0.78e0) ! valid for Tw=271.15K ; -2°CC T base (Long) 20 deg + !SST_corr_2 = 0.22e0*dmtum(m)**(-0.70e0) ! valid for Tw=278.15K ; 5°C + + + + SST_corr(1:kproma) = (SST_corr_1*(278.15e0-sst(1:kproma)) & + +SST_corr_2*(sst(1:kproma)-271.15e0))/7.e0 + + SST_mask1(1:kproma) = MERGE (SST_corr(1:kproma),0._dp,(sst(1:kproma) .LE. 278.15 )) + + SST_corr_1 = 0.15e0*dmtum(m)**(-0.88e0) ! valid for Tw=278.15K ; 5°C + SST_corr_2 = 0.48e0*dmtum(m)**(-0.36e0) ! valid for Tw=288.15K ; 15°C + + ! SST_corr_1 = 0.31e0*dmtum(m)**(-0.56e0) ! valid for Tw=278.15K ; 5°C + ! SST_corr_2 = 1.e0 ! valid for Tw=288.15K ; 15° + + !SST_corr_1 = 0.22e0*dmtum(m)**(-0.70e0) ! valid for Tw=278.15K ; 5°C + !SST_corr_2 = 0.70e0*dmtum(m)**(-0.18e0) ! valid for Tw=288.15K ; 15°C + + + SST_corr(1:kproma) = (SST_corr_1*(288.15e0-sst(1:kproma)) & + + SST_corr_2*(sst(1:kproma)-278.15e0))/1.e1 + + SST_mask2(1:kproma) = MERGE (SST_corr(1:kproma), 0._dp, & + (sst(1:kproma) .GT. 278.15 & + .AND. sst(1:kproma) .LE. 288.15)) + + + SST_corr_1 = 0.48e0*dmtum(m)**(-0.36e0) ! valid for Tw=288.15K ; 15°C + SST_corr_2 = 1.e0 ! valid for Tw=298.15K ; 25°C + + ! SST_corr_1 = 1.e0! valid for Tw=288.15K ; 15°C + ! SST_corr_2 = 2.08e0*dmtum(m)**(0.36e0) ! valid for Tw=298.15K ; 25°C + + + !SST_corr_1 = 0.70e0*dmtum(m)**(-0.18e0) ! valid for Tw=288.15K ; 15°C + !SST_corr_2 = 1.45e0*dmtum(m)**(0.18e0) ! valid for Tw=298.15K ; 25°C + + SST_corr(1:kproma) = (SST_corr_1*(298.15e0-sst(1:kproma)) & + +SST_corr_2*(sst(1:kproma)-288.15e0))/1.e1 + + SST_mask3(1:kproma) = MERGE (SST_corr(1:kproma), 0._dp, & + (sst(1:kproma) .GT. 288.15)) + + SST_corr_all(1:kproma)=SST_mask1(1:kproma)+SST_mask2(1:kproma)+SST_mask3(1:kproma) + !SST_corr_all(1:kproma) = MERGE (1._dp, SST_corr_all(1:kproma), & + !(vphysc%tsw(1:kproma) .GT. 298.15)) ! optional, limit T dependence to <25 deg C + + fi(1:kproma,m)=fi(1:kproma,m)*SST_corr_all(1:kproma) + + + zav = ss_density*4._dp/3._dp*pi*rd(m)**3 + ! mass flux (kg/m2/s) and number flux (#/m2/s) + + IF (dmt(m).GT.dbeg(1) .AND. dmt(m).LE.dend(1) ) THEN + znumf_ks(1:kproma) = znumf_ks(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) + zmassf_ks(1:kproma) = zmassf_ks(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav + END IF + + IF (dmt(m).GT.dbeg(2) .AND. dmt(m).LE.dend(2) ) THEN + pnumf_as(1:kproma) = pnumf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) * SSCAL + pmassf_as(1:kproma) = pmassf_as(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav * SSCAL + END IF + + IF (dmt(m).GT.dbeg(3) .AND. dmt(m).LE.dend(3) ) THEN + pnumf_cs(1:kproma) = pnumf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma) * SSCAL + pmassf_cs(1:kproma) = pmassf_cs(1:kproma) + fi(1:kproma,m)*zseafrac(1:kproma)*zav * SSCAL + END IF + + END DO + + END SUBROUTINE seasalt_emissions_gong_SST + + + + END MODULE mo_ham_m7_emi_seasalt + diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 new file mode 100644 index 00000000..b6fb0e91 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_m7_nucl.F90 @@ -0,0 +1,1132 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_m7_nucl.f90 +!! +!! \brief +!! mo_ham_m7_nucl provides routines for calculating aerosol nucleation rates. +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# Philip Stier (MPI-Met) - original code (2003-01) +!! -# Jan Kazil (MPI-Met) (2007-10-07) +!! +!! \limitations +!! None +!! +!! \details +!! This module provides routines for calculating nucleation rates for +!! neutral and charged H2SO4/H2O and neutral H2SO4/organic clusters. +!! +!! \bibliographic_references +!! - Vignati, E. (1999), Modelling Interactions between Aerosols and +!! Gaseous Compounds in the Polluted Marine Atmosphere. PhD-Thesis, +!! RISO National Laborartory Copenhagen, Riso-R-1163(EN) +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_m7_nucl + + USE mo_kind, ONLY: dp, JPRD + USE mo_netcdf + + IMPLICIT NONE + + ! Sulfate aerosol formation rates (cm-3 s-1) lookup table for the Kazil and + ! Lovejoy nucleation scheme: + + INTEGER, PRIVATE :: t_n,rh_n,h2so4_n,ipr_n,cs_n + + REAL(dp), PRIVATE, ALLOCATABLE :: t_table(:) ! Temperature + REAL(dp), PRIVATE, ALLOCATABLE :: rh_table(:) ! Relative humidity + REAL(dp), PRIVATE, ALLOCATABLE :: h2so4_table(:) ! [H2SO4(g)] + REAL(dp), PRIVATE, ALLOCATABLE :: ipr_table(:) ! Ionization rate + REAL(dp), PRIVATE, ALLOCATABLE :: cs_table(:) ! H2SO4 condensation sink + + REAL(dp), PRIVATE, ALLOCATABLE :: pfr_table(:,:,:,:,:) + +!! INCLUDE 'netcdf.inc' + +CONTAINS + +SUBROUTINE nucl_vehkamaeki(kproma, kbdim, klev, & ! ECHAM5 dimensions + ptp1, psatrat, pmolecH2SO4, & ! ECHAM5 temperature, water vapor saturaion ratio, [H2SO4]g + pxtrnucr, pntot ) ! nucleation rate, number of molecules in the critical cluster + ! + ! Authors: + ! --------- + ! C. TIMMRECK, MPI HAMBURG 2002 + ! + ! Purpose + ! --------- + ! Calculation of classical nucleation rate + ! + ! calculation of the nucleation rate after Vehkamaeki et al. (2002) + ! The calculation of the nucrate ZKNH2SO4 is in cm^-3 s^-1 + ! and a coarse approxmation for the first class + ! + ! Modifications: + ! -------------- + ! R. Hommel; rewrite in f90, adopted to ECHAM5; MPI HAMBURG; Dec. 2002 + ! P. Stier; bugfixes, modularisation and optimization; MPI HAMBURG; 2003-2004 + ! + ! H2SO4 still fixed to xxx molc/cm3, no sulfur cycle coupling yet + ! + ! References: + ! ----------- + ! Vehkamaeki et al. (2002), An improved parameterization for sulfuric + ! acid/water nucleation rates for tropospheric and stratospheric + ! conditions, J. Geophys. Res, 107, D22, 4622 + ! + ! Parameters + ! ---------- + ! prho = prhop_neu in *sam* + ! + ! psatrat = water vapor saturation ratio + ! + ! pxtrnucr = nucleation rate in [1/m3s] + ! xrhoc = density of the critical nucleus in kg/m^3 + ! zrxc = ? Not used as of 2025-06-23 - Commented PLS + + !---------------------------------------------------- + + IMPLICIT NONE + + !---------------------------------------------------- + + INTEGER :: kproma, kbdim, klev + + INTEGER :: jk, jl + + !---------------------------------------------------- + ! + + REAL(dp), intent(in) :: ptp1(kbdim,klev), psatrat(kbdim,klev) + REAL(dp), intent(in) :: pmolecH2SO4(kbdim,klev) + REAL(dp), intent(out) :: pxtrnucr(kbdim,klev) + REAL(dp), intent(out) :: pntot(kbdim,klev) + + !---------------------------------------------------- + ! Local Arrays + + !PLS REAL(JPRD):: zrxc(kbdim) + REAL(JPRD):: zrhoa, zrh, zt, x, zjnuc, zrc, zxmole, zntot + REAL(JPRD):: zlogrh, zlogrh2, zlogrh3, zlogrhoa, zlogrhoa2, zlogrhoa3, & + zix, zt2, zt3 + + !--- 0) Initializations: + + DO jk=1, klev + DO jl=1,kproma + + !----1.) Parameterization of nucleation rate after Vehkamaeki et al. (2002) + + ! t: temperature in K (190.15-300.15K) + ! zrh: saturatio ratio of water (0.0001-1) + ! zrhoa: sulfuric acid concentration in 1/cm3 (10^4-10^11 1/cm3) + ! jnuc: nucleation rate in 1/cm3s (10^-7-10^10 1/cm3s) + ! ntot: total number of molecules in the critical cluster (ntot>4) + ! x: molefraction of H2SO4 in the critical cluster + ! rc: radius of the critical cluster in nm + + ! Calculate nucleation only for valid thermodynamic conditions: + + zrhoa = max(REAL(pmolecH2SO4(jl,jk), KIND=JPRD),1.E+4_JPRD) + zrhoa = min(zrhoa,1.E11_JPRD) + + zrh = max(REAL(psatrat(jl,jk), KIND=JPRD),1.E-4_JPRD) + zrh = min(zrh,1.0_JPRD) + + zt = max(REAL(ptp1(jl,jk), KIND=JPRD) ,190.15_JPRD) + zt = min(zt,300.15_JPRD) + + zt2 = zt*zt + zt3 = zt2*zt + + ! Equation (11) - molefraction of H2SO4 in the critical cluster + + zlogrh = LOG(zrh) + zlogrh2 = zlogrh*zlogrh + zlogrh3 = zlogrh2*zlogrh + + zlogrhoa = LOG(zrhoa) + zlogrhoa2 = zlogrhoa*zlogrhoa + zlogrhoa3 = zlogrhoa2*zlogrhoa + + x=0.7409967177282139_JPRD - 0.002663785665140117_JPRD*zt & + + 0.002010478847383187_JPRD*zlogrh & + - 0.0001832894131464668_JPRD*zt*zlogrh & + + 0.001574072538464286_JPRD*zlogrh2 & + - 0.00001790589121766952_JPRD*zt*zlogrh2 & + + 0.0001844027436573778_JPRD*zlogrh3 & + - 1.503452308794887e-6_JPRD*zt*zlogrh3 & + - 0.003499978417957668_JPRD*zlogrhoa & + + 0.0000504021689382576_JPRD*zt*zlogrhoa + + zxmole=x + + zix = 1.0_JPRD/x + + ! Equation (12) - nucleation rate in 1/cm3s + + zjnuc=0.1430901615568665_JPRD + 2.219563673425199_JPRD*zt - & + 0.02739106114964264_JPRD*zt2 + & + 0.00007228107239317088_JPRD*zt3 + 5.91822263375044_JPRD*zix + & + 0.1174886643003278_JPRD*zlogrh + 0.4625315047693772_JPRD*zt*zlogrh - & + 0.01180591129059253_JPRD*zt2*zlogrh + & + 0.0000404196487152575_JPRD*zt3*zlogrh + & + (15.79628615047088_JPRD*zlogrh)*zix - & + 0.215553951893509_JPRD*zlogrh2 - & + 0.0810269192332194_JPRD*zt*zlogrh2 + & + 0.001435808434184642_JPRD*zt2*zlogrh2 - & + 4.775796947178588e-6_JPRD*zt3*zlogrh2 - & + (2.912974063702185_JPRD*zlogrh2)*zix - & + 3.588557942822751_JPRD*zlogrh3 + & + 0.04950795302831703_JPRD*zt*zlogrh3 - & + 0.0002138195118737068_JPRD*zt2*zlogrh3 + & + 3.108005107949533e-7_JPRD*zt3*zlogrh3 - & + (0.02933332747098296_JPRD*zlogrh3)*zix + & + 1.145983818561277_JPRD*zlogrhoa - & + 0.6007956227856778_JPRD*zt*zlogrhoa + & + 0.00864244733283759_JPRD*zt2*zlogrhoa - & + 0.00002289467254710888_JPRD*zt3*zlogrhoa - & + (8.44984513869014_JPRD*zlogrhoa)*zix + & + 2.158548369286559_JPRD*zlogrh*zlogrhoa + & + 0.0808121412840917_JPRD*zt*zlogrh*zlogrhoa - & + 0.0004073815255395214_JPRD*zt2*zlogrh*zlogrhoa - & + 4.019572560156515e-7_JPRD*zt3*zlogrh*zlogrhoa + & + (0.7213255852557236_JPRD*zlogrh*zlogrhoa)*zix + & + 1.62409850488771_JPRD*zlogrh2*zlogrhoa - & + 0.01601062035325362_JPRD*zt*zlogrh2*zlogrhoa + & + 0.00003771238979714162_JPRD*zt2*zlogrh2*zlogrhoa + & + 3.217942606371182e-8_JPRD*zt3*zlogrh2*zlogrhoa - & + (0.01132550810022116_JPRD*zlogrh2*zlogrhoa)*zix + & + 9.71681713056504_JPRD*zlogrhoa2 - & + 0.1150478558347306_JPRD*zt*zlogrhoa2 + & + 0.0001570982486038294_JPRD*zt2*zlogrhoa2 + & + 4.009144680125015e-7_JPRD*zt3*zlogrhoa2 + & + (0.7118597859976135_JPRD*zlogrhoa2)*zix - & + 1.056105824379897_JPRD*zlogrh*zlogrhoa2 + & + 0.00903377584628419_JPRD*zt*zlogrh*zlogrhoa2 - & + 0.00001984167387090606_JPRD*zt2*zlogrh*zlogrhoa2 + & + 2.460478196482179e-8_JPRD*zt3*zlogrh*zlogrhoa2 - & + (0.05790872906645181_JPRD*zlogrh*zlogrhoa2)*zix - & + 0.1487119673397459_JPRD*zlogrhoa3 + & + 0.002835082097822667_JPRD*zt*zlogrhoa3 - & + 9.24618825471694e-6_JPRD*zt2*zlogrhoa3 + & + 5.004267665960894e-9_JPRD*zt3*zlogrhoa3 - & + (0.01270805101481648_JPRD*zlogrhoa3)*zix + + zjnuc=EXP(zjnuc) ! add. Eq. (12) [1/(cm^3s)] + + + ! Equation (13) - total number of molecules in the critical cluster + + zntot=-0.002954125078716302_JPRD - 0.0976834264241286_JPRD*zt + & + 0.001024847927067835_JPRD*zt2 - 2.186459697726116e-6_JPRD*zt3 - & + 0.1017165718716887_JPRD*zix - 0.002050640345231486_JPRD*zlogrh - & + 0.007585041382707174_JPRD*zt*zlogrh + & + 0.0001926539658089536_JPRD*zt2*zlogrh - & + 6.70429719683894e-7_JPRD*zt3*zlogrh - & + (0.2557744774673163_JPRD*zlogrh)*zix + & + 0.003223076552477191_JPRD*zlogrh2 + & + 0.000852636632240633_JPRD*zt*zlogrh2 - & + 0.00001547571354871789_JPRD*zt2*zlogrh2 + & + 5.666608424980593e-8_JPRD*zt3*zlogrh2 + & + (0.03384437400744206_JPRD*zlogrh2)*zix + & + 0.04743226764572505_JPRD*zlogrh3 - & + 0.0006251042204583412_JPRD*zt*zlogrh3 + & + 2.650663328519478e-6_JPRD*zt2*zlogrh3 - & + 3.674710848763778e-9_JPRD*zt3*zlogrh3 - & + (0.0002672510825259393_JPRD*zlogrh3)*zix - & + 0.01252108546759328_JPRD*zlogrhoa + & + 0.005806550506277202_JPRD*zt*zlogrhoa - & + 0.0001016735312443444_JPRD*zt2*zlogrhoa + & + 2.881946187214505e-7_JPRD*zt3*zlogrhoa + & + (0.0942243379396279_JPRD*zlogrhoa)*zix - & + 0.0385459592773097_JPRD*zlogrh*zlogrhoa - & + 0.0006723156277391984_JPRD*zt*zlogrh*zlogrhoa + & + 2.602884877659698e-6_JPRD*zt2*zlogrh*zlogrhoa + & + 1.194163699688297e-8_JPRD*zt3*zlogrh*zlogrhoa - & + (0.00851515345806281_JPRD*zlogrh*zlogrhoa)*zix - & + 0.01837488495738111_JPRD*zlogrh2*zlogrhoa + & + 0.0001720723574407498_JPRD*zt*zlogrh2*zlogrhoa - & + 3.717657974086814e-7_JPRD*zt2*zlogrh2*zlogrhoa - & + 5.148746022615196e-10_JPRD*zt3*zlogrh2*zlogrhoa + & + (0.0002686602132926594_JPRD*zlogrh2*zlogrhoa)*zix - & + 0.06199739728812199_JPRD*zlogrhoa2 + & + 0.000906958053583576_JPRD*zt*zlogrhoa2 - & + 9.11727926129757e-7_JPRD*zt2*zlogrhoa2 - & + 5.367963396508457e-9_JPRD*zt3*zlogrhoa2 - & + (0.007742343393937707_JPRD*zlogrhoa2)*zix + & + 0.0121827103101659_JPRD*zlogrh*zlogrhoa2 - & + 0.0001066499571188091_JPRD*zt*zlogrh*zlogrhoa2 + & + 2.534598655067518e-7_JPRD*zt2*zlogrh*zlogrhoa2 - & + 3.635186504599571e-10_JPRD*zt3*zlogrh*zlogrhoa2 + & + (0.0006100650851863252_JPRD*zlogrh*zlogrhoa2)*zix + & + 0.0003201836700403512_JPRD*zlogrhoa3 - & + 0.0000174761713262546_JPRD*zt*zlogrhoa3 + & + 6.065037668052182e-8_JPRD*zt2*zlogrhoa3 - & + 1.421771723004557e-11_JPRD*zt3*zlogrhoa3 + & + (0.0001357509859501723_JPRD*zlogrhoa3)*zix + + zntot=EXP(zntot) ! add. Eq. (13) + + + ! Equation (14) - radius of the critical cluster in nm + + !PLS zrc=EXP(-1.6524245_JPRD+0.42316402_JPRD*x+0.33466487_JPRD*LOG(zntot)) ! [nm] + + ! Conversion [nm -> m] + + !PLS zrxc(jl)=zrc*1e-9_JPRD + + !----1.2) Limiter + + IF(zjnuc<1.e-7_JPRD .OR. zntot<4.0_JPRD) zjnuc=0.0_JPRD + + ! limitation to 1E+10 [1/cm3s] + + zjnuc=MIN(zjnuc,1.e10_JPRD) + + pxtrnucr(jl,jk) = REAL(zjnuc, KIND=dp) + + ! convert total number of molecules in the critical cluster + ! to number of sulfate molecules: + + pntot(jl,jk)=REAL(zntot*zxmole, KIND=dp) + + ENDDO ! kproma + + ENDDO ! klev + + END SUBROUTINE nucl_vehkamaeki + + !============================================================================= + + SUBROUTINE nucl_kazil_lovejoy(kproma,kbdim,klev, & + ptemp,prh,ph2so4,pcs,pipr, & + ppfr,pns) + + ! *nucl_kazil_lovejoy* returns the formation rate of sulfate aerosol + ! particles containing a fixed number of H2SO4 molecules. The particle + ! formation rate is determined by interpolating a lookup table that was + ! generated with the code PARNUC, which implements the method described by + ! Kazil and Lovejoy (2007). Currently. lookup tables for different + ! nucleation processes (neutral and/or negative nucleation of H2SO4 nad H2O) + ! and with different resolutions are available. + ! + ! References: + ! + ! Kazil J., and Lovejoy, E. R., A semi-analytical method for + ! calculating rates of new sulfate aerosol formation from the gas phase, + ! Atmos. Chem. Phys., 7, 3447-3459, 2007 + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + ! + ! Input variables: + ! + + INTEGER :: kproma, & ! " geographic block number of locations + kbdim, & ! " geographic block maximum number of locations + klev ! " numer of levels + + REAL(dp):: ptemp(kbdim,klev), & ! Temperature (K) + prh(kbdim,klev), & ! Relative humidity (%) + ph2so4(kbdim,klev), & ! H2SO4 gas phase concentration (cm-3) + pcs(kbdim,klev), & ! H2SO4 condensation sink (s-1) + pipr(kbdim,klev) ! Ion pair production rate (cm-3 s-1) + + ! + ! Output variables: + ! + + REAL(dp) :: ppfr(kbdim,klev) ! Sulfate aerosol formation rate (cm-3 s-1) + REAL(dp) :: pns(kbdim,klev) ! Number of H2SO4 molecules in the newly formed aerosol particles + + ! + ! Local variables: + ! + + REAL(dp) :: ztemp, & ! Temperature (K) + zrh, & ! Relative humidity (%) + zh2so4, & ! H2SO4 gas phase concentration (cm-3) + zipr, & ! Ionization rate (cm-3 s-1) + zcs ! H2SO4 condensation sink (s-1) + + ! Interpolation coefficients: + + REAL(dp) :: zc(32) + + ! Temporary values: + + REAL(dp) :: zv,zw,zx,zy,zz, & + zv_,zw_,zx_,zy_,zz_, & + zvw,zxy,zv_w,zx_y,zvw_,zxy_,zv_w_,zx_y_, & + zxyz,zxyz_,zx_yz,zx_yz_,zxy_z,zxy_z_,zx_y_z,zx_y_z_ + + ! Array indices: + + INTEGER :: ik + + INTEGER :: i_temp_0,i_rh_0,i_h2so4_0,i_ipr_0,i_cs_0 + INTEGER :: i_temp_1,i_rh_1,i_h2so4_1,i_ipr_1,i_cs_1 + + ! Loop indices: + + INTEGER :: ji,jj + + ! Logical variables: + + LOGICAL :: lerror,lset_zero + + ! Number of H2SO4 molecules in the newly formed aerosol: + pns(1:kproma,:) = 15.0_dp + + ! + ! Calculate the nucleation rate by interpolating the lookup table: + ! + + DO ji=1,klev ! Levels loop + DO jj=1,kproma ! Geographic locations loop + + ztemp = ptemp(jj,ji) + zrh = prh(jj,ji) + zh2so4 = ph2so4(jj,ji) + zipr = pipr(jj,ji) + zcs = pcs(jj,ji) + + ! Check if the current variables which particle formation depends upon + ! are within the limits of the particle formation lookup table, and if + ! not, take appropriate action: + + lerror = .false. + lset_zero = .false. + + IF (ztemp < t_table(1)) THEN + lerror = .true. + ztemp = t_table(1) + ENDIF + + IF (ztemp > t_table(t_n)) THEN + lerror = .true. + ztemp = t_table(t_n) + lset_zero = .true. + ENDIF + + IF (zrh < rh_table(1)) THEN + lerror = .true. + zrh = rh_table(1) + lset_zero = .true. + ENDIF + + IF (zrh > rh_table(rh_n)) THEN + lerror = .true. + zrh = rh_table(rh_n) + ENDIF + + IF (zh2so4 < h2so4_table(1)) THEN + lerror = .true. + zh2so4 = h2so4_table(1) + lset_zero = .true. + ENDIF + + IF (zh2so4 > h2so4_table(h2so4_n)) THEN + lerror = .true. + zh2so4 = h2so4_table(h2so4_n) + ENDIF + + IF (zipr < ipr_table(1)) THEN + lerror = .true. + zipr = ipr_table(1) + ENDIF + + IF (zipr > ipr_table(ipr_n)) THEN + lerror = .true. + zipr = ipr_table(ipr_n) + ENDIF + + IF (zcs < cs_table(1)) THEN + lerror = .true. + zcs = cs_table(1) + ENDIF + + IF (zcs > cs_table(cs_n)) THEN + lerror = .true. + zcs = cs_table(cs_n) + ENDIF + + ! If needed, set the particle formation rate to zero: + + IF (lset_zero) THEN + ppfr(jj,ji) = 0.0_dp + CYCLE + ENDIF + + ! Identify the intervals in the ambient conditions arrays where the + ! current ambient conditions are located: + + i_temp_0 = 1 + i_temp_1 = t_n + + DO WHILE(i_temp_1-i_temp_0.gt.1) + + ik = (i_temp_1+i_temp_0)/2 + + IF (t_table(ik).gt.ztemp) THEN + i_temp_1 = ik + ELSE + i_temp_0 = ik + ENDIF + + ENDDO + + i_rh_0 = 1 + i_rh_1 = rh_n + + DO WHILE(i_rh_1-i_rh_0.gt.1) + + ik = (i_rh_1+i_rh_0)/2 + + IF (rh_table(ik).gt.zrh) THEN + i_rh_1 = ik + ELSE + i_rh_0 = ik + ENDIF + + ENDDO + + i_h2so4_0 = 1 + i_h2so4_1 = h2so4_n + + DO WHILE(i_h2so4_1-i_h2so4_0.gt.1) + + ik = (i_h2so4_1+i_h2so4_0)/2 + + IF (h2so4_table(ik).gt.zh2so4) THEN + i_h2so4_1 = ik + ELSE + i_h2so4_0 = ik + ENDIF + + ENDDO + + i_ipr_0 = 1 + i_ipr_1 = ipr_n + + DO WHILE(i_ipr_1-i_ipr_0.gt.1) + + ik = (i_ipr_1+i_ipr_0)/2 + + IF (ipr_table(ik).gt.zipr) THEN + i_ipr_1 = ik + ELSE + i_ipr_0 = ik + ENDIF + + ENDDO + + i_cs_0 = 1 + i_cs_1 = cs_n + + DO WHILE(i_cs_1-i_cs_0.gt.1) + + ik = (i_cs_1+i_cs_0)/2 + + IF (cs_table(ik).gt.zcs) THEN + i_cs_1 = ik + ELSE + i_cs_0 = ik + ENDIF + + ENDDO + + ! Calculate coefficients for the interpolation of the lookup tables: + + zv = (ztemp-t_table(i_temp_0))/(t_table(i_temp_1)-t_table(i_temp_0)) + zw = (zrh-rh_table(i_rh_0))/(rh_table(i_rh_1)-rh_table(i_rh_0)) + zx = (zh2so4-h2so4_table(i_h2so4_0))/(h2so4_table(i_h2so4_1)-h2so4_table(i_h2so4_0)) + zy = (zipr-ipr_table(i_ipr_0))/(ipr_table(i_ipr_1)-ipr_table(i_ipr_0)) + zz = (zcs-cs_table(i_cs_0))/(cs_table(i_cs_1)-cs_table(i_cs_0)) + + zv_ = zv - 1.0_dp + zw_ = zw - 1.0_dp + zx_ = zx - 1.0_dp + zy_ = zy - 1.0_dp + zz_ = zz - 1.0_dp + + zvw = zv*zw + zvw_ = zv*zw_ + zv_w = zv_*zw + zv_w_ = zv_*zw_ + + zxy = zx*zy + zxy_ = zx*zy_ + zx_y = zx_*zy + zx_y_ = zx_*zy_ + + zxyz = zxy*zz + zxyz_ = zxy*zz_ + zxy_z = zxy_*zz + zx_yz = zx_y*zz + zxy_z_ = zxy_*zz_ + zx_yz_ = zx_y*zz_ + zx_y_z = zx_y_*zz + zx_y_z_ = zx_y_*zz_ + + zc(1) = zv_w_*zx_y_z_ + zc(2) = zv_w_*zx_y_z + zc(3) = zv_w_*zx_yz_ + zc(4) = zv_w_*zx_yz + zc(5) = zv_w_*zxy_z_ + zc(6) = zv_w_*zxy_z + zc(7) = zv_w_*zxyz_ + zc(8) = zv_w_*zxyz + zc(9) = zv_w*zx_y_z_ + zc(10) = zv_w*zx_y_z + zc(11) = zv_w*zx_yz_ + zc(12) = zv_w*zx_yz + zc(13) = zv_w*zxy_z_ + zc(14) = zv_w*zxy_z + zc(15) = zv_w*zxyz_ + zc(16) = zv_w*zxyz + zc(17) = zvw_*zx_y_z_ + zc(18) = zvw_*zx_y_z + zc(19) = zvw_*zx_yz_ + zc(20) = zvw_*zx_yz + zc(21) = zvw_*zxy_z_ + zc(22) = zvw_*zxy_z + zc(23) = zvw_*zxyz_ + zc(24) = zvw_*zxyz + zc(25) = zvw*zx_y_z_ + zc(26) = zvw*zx_y_z + zc(27) = zvw*zx_yz_ + zc(28) = zvw*zx_yz + zc(29) = zvw*zxy_z_ + zc(30) = zvw*zxy_z + zc(31) = zvw*zxyz_ + zc(32) = zvw*zxyz + + ! Interpolation of the particle formation rates table + ! within the current 5D hypercuboid: + + ppfr(jj,ji) = & + - zc(1)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_0) & + + zc(2)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_0) & + + zc(3)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_0) & + - zc(4)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_0) & + + zc(5)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_0) & + - zc(6)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_0) & + - zc(7)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_0) & + + zc(8)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_0) & + + zc(9)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_0) & + - zc(10)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_0) & + - zc(11)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_0) & + + zc(12)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_0) & + - zc(13)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_0) & + + zc(14)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_0) & + + zc(15)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_0) & + - zc(16)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_0) & + + zc(17)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_1) & + - zc(18)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_0,i_temp_1) & + - zc(19)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_1) & + + zc(20)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_0,i_temp_1) & + - zc(21)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_1) & + + zc(22)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_0,i_temp_1) & + + zc(23)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_1) & + - zc(24)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_0,i_temp_1) & + - zc(25)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_1) & + + zc(26)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_0,i_rh_1,i_temp_1) & + + zc(27)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_1) & + - zc(28)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_0,i_rh_1,i_temp_1) & + + zc(29)*pfr_table(i_cs_0,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_1) & + - zc(30)*pfr_table(i_cs_1,i_ipr_0,i_h2so4_1,i_rh_1,i_temp_1) & + - zc(31)*pfr_table(i_cs_0,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_1) & + + zc(32)*pfr_table(i_cs_1,i_ipr_1,i_h2so4_1,i_rh_1,i_temp_1) + + ppfr(jj,ji) = exp(ppfr(jj,ji)) + + ENDDO + ENDDO + + END SUBROUTINE nucl_kazil_lovejoy + + !============================================================================= + + SUBROUTINE nucl_activation(kproma,kbdim,klev,ph2so4,pforest,ppbl,ppfr,pns) + + ! *nucl_activation* returns the formation rate of aerosol particles from + ! organic nucleation (activation type). + ! + ! References: + ! + ! Kulmala, M., Lehtinen, K. E. J., and Laaksonen, A.: Cluster activation + ! theory as an explanation of the linear dependence between formation rate of + ! 3nm particles and sulphuric acid concentration, Atmos. Chem. Phys., 6, + ! 787-793, 2006 + ! + ! Riipinen, I., Sihto, S.-L., Kulmala, M., Arnold, F., Dal Maso, M., Birmili, + ! W., Saarnio, K., Teinila, K., Kerminen, V.-M., Laaksonen, A., and Lehtinen, + ! K. E. J.: Connections between atmospheric sulphuric acid and new particle + ! formation during QUEST III-IV campaigns in Heidelberg and Hyytiala, + ! Atmos. Chem. Phys., 7, 1899-1914, 2007. + + IMPLICIT NONE + + ! + ! Input variables: + ! + + INTEGER :: kproma, & ! " geographic block number of locations + kbdim, & ! " geographic block maximum number of locations + klev ! " numer of levels + + REAL(dp):: ph2so4(kbdim,klev), & ! Gas phase H2SO4 concentration [molec. cm-3] + ppbl(kbdim), & ! Planetary boundary layer top level + pforest(kbdim) ! Forest fraction + + ! + ! Output variables: + ! + + REAL(dp) :: ppfr(kbdim,klev) ! Aerosol formation rate (cm-3 s-1) + REAL(dp) :: pns(kbdim,klev) ! Number of H2SO4 molecules in the newly formed aerosol particles + + ! + ! Local variables: + ! + + INTEGER :: jk,jl + + ! Activation nucleation (Kulmala et al., ACP 2006), parameterized by + ! Riipinen et al., ACP 2007, using Hyytiala QUEST II campaign median. + ! Proceeds only over forests, in proportion to the forest fraction, + ! and only in the boundary layer. + + + DO jl = 1, kproma + ! Above the boundary layer: + DO jk = 1, nint(ppbl(jl)) - 1 + pns(jl,jk) = 0.0_dp + ppfr(jl,jk) = 0.0_dp + ENDDO + ! In the boundary layer: + DO jk = nint(ppbl(jl)), klev + pns(jl,jk) = 1.0_dp + ppfr(jl,jk) = 1.0E-6_dp*ph2so4(jl,jk)*pforest(jl) + ENDDO + ENDDO + + END SUBROUTINE nucl_activation + + !============================================================================= + + SUBROUTINE nucl_kinetic(kproma,kbdim,klev,ph2so4,pforest,ppbl,ppfr,pns) + + ! *nucl_kinetic* returns the formation rate of aerosol particles from + ! organic nucleation (kinetic type). + ! + ! References: + ! + ! Kuang, C., P. H. McMurry, A. V. McCormick, and F. L. Eisele, + ! Dependence of nucleation rates on sulfuric acid vapor concentration in + ! diverse atmospheric locations, J. Geophys. Res., 113, D10209, + ! doi:10.1029/2007JD009253, 2008 + ! + ! Laakso, L., Anttila, T., Lehtinen, K. E. J., Aalto, P. P., Kulmala, + ! M., Horrak, U., Paatero, J., Hanke, M., and Arnold, F.: Kinetic nucleation + ! and ions in boreal forest particle formation events, Atmos. Chem. Phys., 4, + ! 2353-2366, 2004 + ! + ! Sihto, S.-L., Kulmala, M., Kerminen, V.-M., Dal Maso, M., Petaja, T., + ! Riipinen, I., Korhonen, H., Arnold, F., Janson, R., Boy, M., Laaksonen, + ! A., and Lehtinen, K. E. J.: Atmospheric sulphuric acid and aerosol + ! formation: implications from atmospheric measurements for nucleation and + ! early growth mechanisms, Atmos. Chem. Phys., 6, 4079-4091, 2006 + + IMPLICIT NONE + + ! + ! Input variables: + ! + + INTEGER :: kproma, & ! " geographic block number of locations + kbdim, & ! " geographic block maximum number of locations + klev ! " numer of levels + + REAL(dp):: ph2so4(kbdim,klev), & ! Gas phase H2SO4 concentration [molec. cm-3] + ppbl(kbdim), & ! Planetary boundary layer top level + pforest(kbdim) ! Forest fraction + + ! + ! Output variables: + ! + + REAL(dp) :: ppfr(kbdim,klev) ! Aerosol formation rate (cm-3 s-1) + REAL(dp) :: pns(kbdim,klev) ! Number of H2SO4 molecules in the newly formed aerosol particles + + ! + ! Local variables: + ! + + INTEGER :: jk,jl + + ! Kinetic nucleation (Laakso et al., ACP 2004), parameterized by Kuang et + ! al., JGR 2008, using Hyytiala QUEST II campaign data (Sihto et al., ACP + ! 2006). Proceeds only over forests, in proportion to the forest fraction, + ! and only in the boundary layer. + + DO jl = 1, kproma + ! Above the boundary layer: + DO jk = 1, nint(ppbl(jl)) - 1 + pns(jl,jk) = 0.0_dp + ppfr(jl,jk) = 0.0_dp + ENDDO + ! In the boundary layer: + DO jk = nint(ppbl(jl)), klev + pns(jl,jk) = 2.0_dp + ppfr(jl,jk) = 3.86E-13_dp*ph2so4(jl,jk)*ph2so4(jl,jk)*pforest(jl) + ENDDO + ENDDO + + END SUBROUTINE nucl_kinetic + +!============================================================================= +#ifdef HAMMOZ + SUBROUTINE ham_nucl_initialize() + + ! *ham_nucl_initialize* reads data needed to calculate formation rates of + ! aerosol particles from the gas phase. + + USE mo_ham_m7ctl, ONLY: nsnucl + USE mo_netcdf + USE mo_mpi, ONLY: p_parallel,p_parallel_io,p_io,p_bcast + + IMPLICIT NONE + + ! + ! Local variables: + ! + + CHARACTER(LEN=32) :: file + + INTEGER :: i_status,i_nc_id,i_dim_id,i_var_id + + INTEGER :: ji + + REAL(dp) :: zvalue + + IF (nsnucl==2) THEN ! Kazil and Lovejoy nucleation scheme + + ! Read tabulated formation rates of sulfate aerosol particles containing + ! at least 15 H2SO4 molecules from the netCDF archive: + + file = 'parnuc.15H2SO4.nc' + + IF (p_parallel) THEN ! In parallel mode + + IF (p_parallel_io) THEN ! We are on the I/O processor + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the lenghts of the dimensions of the particle formation rate tables: + ! + + CALL IO_INQ_DIMID(i_nc_id,'temperature',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,t_n) + CALL IO_INQ_DIMID(i_nc_id,'RH',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,rh_n) + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_DIMID(i_nc_id,'H2SO4',i_dim_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,h2so4_n) + CALL IO_INQ_DIMID(i_nc_id,'ionization',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,ipr_n) + CALL IO_INQ_DIMID(i_nc_id,'condensation_sink',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,cs_n) + + i_status = nf_close(i_nc_id) + + ENDIF + + ! Broadcast the dimensions: + + CALL p_bcast(t_n,p_io) + CALL p_bcast(rh_n,p_io) + CALL p_bcast(h2so4_n,p_io) + CALL p_bcast(ipr_n,p_io) + CALL p_bcast(cs_n,p_io) + + ELSE ! In serial mode + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the lenghts of the dimensions of the particle formation rate tables: + ! + + CALL IO_INQ_DIMID(i_nc_id,'temperature',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,t_n) + + CALL IO_INQ_DIMID(i_nc_id,'RH',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,rh_n) + + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_DIMID(i_nc_id,'H2SO4',i_dim_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,h2so4_n) + + CALL IO_INQ_DIMID(i_nc_id,'ionization',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,ipr_n) + + CALL IO_INQ_DIMID(i_nc_id,'condensation_sink',i_dim_id) + CALL IO_INQ_DIMLEN(i_nc_id,i_dim_id,cs_n) + + i_status = nf_close(i_nc_id) + + ENDIF + + ! + ! Allocate memory for the ambient conditions and the particle + ! formation rate arrays: + ! + + ALLOCATE(t_table(t_n)) + ALLOCATE(rh_table(rh_n)) + ALLOCATE(h2so4_table(h2so4_n)) + ALLOCATE(ipr_table(ipr_n)) + ALLOCATE(cs_table(cs_n)) + + ALLOCATE(pfr_table(cs_n,ipr_n,h2so4_n,rh_n,t_n)) + + IF (p_parallel) THEN ! In parallel mode + + IF (p_parallel_io) THEN ! We are on the I/O processor + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the ambient conditions: + ! + + ! Temperature: + + CALL IO_INQ_VARID(i_nc_id,'temperature',i_var_id) + + DO ji = 1, t_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + t_table(ji) = zvalue + ENDDO + + ! RH: + + CALL IO_INQ_VARID(i_nc_id,'RH',i_var_id) + + DO ji = 1, rh_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + rh_table(ji) = zvalue + ENDDO + + ! [H2SO4]g: + + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_VARID(i_nc_id,'H2SO4',i_var_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_var_id) + + DO ji = 1, h2so4_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + h2so4_table(ji) = zvalue + ENDDO + + ! Ionization rate: + + CALL IO_INQ_VARID(i_nc_id,'ionization',i_var_id) + + DO ji = 1, ipr_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + ipr_table(ji) = zvalue + ENDDO + + ! H2SO4 condensation sink: + + CALL IO_INQ_VARID(i_nc_id,'condensation_sink',i_var_id) + + DO ji = 1, cs_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + cs_table(ji) = zvalue + ENDDO + + ! + ! Read the particle formation rate: + ! + + CALL IO_INQ_VARID(i_nc_id,'pfr',i_var_id) + i_status = nf_get_var_double(i_nc_id,i_var_id,pfr_table) + CALL nf_check(i_status,file) + + i_status = nf_close(i_nc_id) + + ENDIF + + ! Broadcast the ambient conditions: + + CALL p_bcast(t_table,p_io) + CALL p_bcast(rh_table,p_io) + CALL p_bcast(h2so4_table,p_io) + CALL p_bcast(ipr_table,p_io) + CALL p_bcast(cs_table,p_io) + + ! Broadcast the particle formation rates: + + CALL p_bcast(pfr_table,p_io) + + ELSE ! In serial mode + + i_status = nf_open(file,NF_NOWRITE,i_nc_id) + CALL nf_check(i_status,file) + + ! + ! Read the ambient conditions: + ! + + ! Temperature: + + CALL IO_INQ_VARID(i_nc_id,'temperature',i_var_id) + + DO ji = 1, t_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + t_table(ji) = zvalue + ENDDO + + ! RH: + + CALL IO_INQ_VARID(i_nc_id,'RH',i_var_id) + + DO ji = 1, rh_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + rh_table(ji) = zvalue + ENDDO + + ! [H2SO4]g: + + ! As the dimension/variable name used for the H2SO4 gas phase + ! concentration we try both '[H2SO4]' and 'H2SO4'. '[H2SO4]' is + ! obsolete, as newer versions of the netCDF library do not allow + ! special characters such as '[' as first character of a dimension/ + ! variable name, but lookup tables using '[H2SO4]' may still be in + ! use. + + i_status = NF_INQ_VARID(i_nc_id,'H2SO4',i_var_id) + IF (i_status /= nf_noerr) i_status = NF_INQ_DIMID(i_nc_id,'[H2SO4]',i_var_id) + + DO ji = 1, h2so4_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + h2so4_table(ji) = zvalue + ENDDO + + ! Ionization rate: + + CALL IO_INQ_VARID(i_nc_id,'ionization',i_var_id) + + DO ji = 1, ipr_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + ipr_table(ji) = zvalue + ENDDO + + ! H2SO4 condensation sink: + + CALL IO_INQ_VARID(i_nc_id,'condensation_sink',i_var_id) + + DO ji = 1, cs_n + i_status = nf_get_var1_double(i_nc_id,i_var_id,ji,zvalue) + CALL nf_check(i_status,file) + cs_table(ji) = zvalue + ENDDO + + ! + ! Read the particle formation rate: + ! + + CALL IO_INQ_VARID(i_nc_id,'pfr',i_var_id) + + i_status = nf_get_var_double(i_nc_id,i_var_id,pfr_table) + CALL nf_check(i_status,file) + + i_status = nf_close(i_nc_id) + + ENDIF + + ENDIF + + END SUBROUTINE ham_nucl_initialize + + !============================================================================= + + SUBROUTINE ham_nucl_cleanup() + + ! *ham_nucl_cleanup* deallocates the memory of the module mo_ham_m7_nucl. + + USE mo_ham_m7ctl, ONLY: nsnucl + + IMPLICIT NONE + + IF (nsnucl==2) THEN ! Kazil and Lovejoy nucleation scheme + + DEALLOCATE(t_table) + DEALLOCATE(rh_table) + DEALLOCATE(h2so4_table) + DEALLOCATE(ipr_table) + DEALLOCATE(cs_table) + + DEALLOCATE(pfr_table) + + ENDIF + + END SUBROUTINE ham_nucl_cleanup +#endif +END MODULE mo_ham_m7_nucl diff --git a/ifs-source/arpifs/m7/module/mo_ham_m7_trac.F90 b/ifs-source/arpifs/m7/module/mo_ham_m7_trac.F90 new file mode 100644 index 00000000..5309da8f --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_m7_trac.F90 @@ -0,0 +1,287 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_m7_trac.f90 +!! +!! \brief +!! mo_ham_m7_trac contains routines to requests tracers for ECHAM/HAM and +!! prescribes their physical and chemical properties. +!! It controls the aerosol physics by providing the necessary switches. +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original code (2001) +!! -# D. O'Donnell (MPI-Met) - code generalization and changes for soa (2009-02-xx) +!! -# K. Zhang (MPI-Met) - adaption for new species list and tracer defination (2009-08-11) +!! -# M.G. Schultz (FZ Juelich) - cleanup and adaptation to new structure (2009-11-20) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +!!### Questionable whether this module is needed with new emissions scheme. +!! idt_ seem to be used primarily for identiyfing tracers for emissions. + +MODULE mo_ham_m7_trac + + ! Parameters: + ! ----------- + ! User defined flags: density density [kg m-3] + ! osm osmotic coefficient [???] + ! nion number of ions the tracer + ! dissolves into [1] + + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: ntrac, & ! number of tracers + OFF, ON, & ! ON/OFF index + GAS, & ! phase indicators + AEROSOLMASS, & ! + AEROSOLNUMBER, & ! + SOLUBLE, & ! soluble indicator + INSOLUBLE, & + itrprog, itrdiag, itrpresc + USE mo_species, ONLY: speclist + USE mo_physical_constants, ONLY: rhoh2o + USE mo_ham_species, ONLY: id_dms, id_so2, id_so4g, id_oh, id_h2o2, id_o3, & + id_no2, id_so4, id_bc, id_oc, id_ss, id_du, id_wat + + IMPLICIT NONE + + !--- Public entities: + + PUBLIC :: idt_dms, idt_so2, idt_so4, idt_ocnv, & + idt_ms4ns, idt_ms4ks, idt_ms4as, idt_ms4cs, & + idt_mbcki, idt_mbcks, idt_mbcas, idt_mbccs, & + idt_mocki, idt_mocks, idt_mocas, idt_moccs, & + idt_mssas, idt_msscs, & + idt_mduai, idt_mduas, idt_mduci, idt_mducs, & + idt_nns, idt_nki, idt_nks, idt_nai, & + idt_nas, idt_nci, idt_ncs, & + idt_cdnc_ham, idt_icnc_ham, & + idt_mwans, idt_mwaks, idt_mwaas, idt_mwacs + + PUBLIC:: ham_m7_set_idt + PUBLIC:: ham_get_class_flag ! for tracer diagnostics + + !--- Module variables: + ! + ! Tracer indices: + ! + ! Legend: iABBCD + ! + ! A: m = particle mass mixing ratio, n number mixing ratio + ! BB: s4 = sulfate, bc/oc = black/organic carbon, du = dust, ss = seasalt + ! C: n = nucleation , k = Aitken, a = accumulation, c = coarse mode + ! D: i = insoluble, s = soluble + + INTEGER :: idt_dms ! mass mixing ratio dms + INTEGER :: idt_so2 ! mass mixing ratio so2 + INTEGER :: idt_so4 ! mass mixing ratio so4 + INTEGER :: idt_ocnv ! mass mixing ratio nonvolatile organic + + INTEGER :: idt_ms4ns ! mass mixing ratio sulfate nuclea. soluble + INTEGER :: idt_ms4ks ! mass mixing ratio sulfate aitken soluble + INTEGER :: idt_ms4as ! mass mixing ratio sulfate accum. soluble + INTEGER :: idt_ms4cs ! mass mixing ratio sulfate coarse soluble + INTEGER :: idt_mbcki ! mass mixing ratio black carbon aitken insoluble + INTEGER :: idt_mbcks ! mass mixing ratio black carbon aitken soluble + INTEGER :: idt_mbcas ! mass mixing ratio black carbon accum. soluble + INTEGER :: idt_mbccs ! mass mixing ratio black carbon coarse soluble + INTEGER :: idt_mocki ! mass mixing ratio organic carbon aitken insoluble + INTEGER :: idt_mocks ! mass mixing ratio organic carbon aitken soluble + INTEGER :: idt_mocas ! mass mixing ratio organic carbon accum. soluble + INTEGER :: idt_moccs ! mass mixing ratio organic carbon coarse soluble + INTEGER :: idt_mssas ! mass mixing ratio seasalt accum. soluble + INTEGER :: idt_msscs ! mass mixing ratio seasalt coarse soluble + INTEGER :: idt_mduai ! mass mixing ratio dust accum. insoluble + INTEGER :: idt_mduas ! mass mixing ratio dust accum. soluble + INTEGER :: idt_mduci ! mass mixing ratio dust coarse insoluble + INTEGER :: idt_mducs ! mass mixing ratio dust coarse soluble + INTEGER :: idt_mwans ! mass mixing ratio aerosol water nuclea. soluble + INTEGER :: idt_mwaks ! mass mixing ratio aerosol water aitken soluble + INTEGER :: idt_mwaas ! mass mixing ratio aerosol water accum. soluble + INTEGER :: idt_mwacs ! mass mixing ratio aerosol water coarse soluble + + + INTEGER :: idt_nns ! number mixing ratio nuclea. soluble + INTEGER :: idt_nki ! number mixing ratio aitken insoluble + INTEGER :: idt_nks ! number mixing ratio aitken soluble + INTEGER :: idt_nai ! number mixing ratio accum. insoluble + INTEGER :: idt_nas ! number mixing ratio accum. soluble + INTEGER :: idt_nci ! number mixing ratio coarse insoluble + INTEGER :: idt_ncs ! number mixing ratio coarse soluble + + INTEGER :: idt_cdnc_ham ! cloud droplet number concentration + INTEGER :: idt_icnc_ham ! ice cristal number concentration + + + CONTAINS + + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Define HAM tracers +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! to_be_filled +!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + + SUBROUTINE ham_m7_set_idt + + USE mo_ham, ONLY: aerocomp, aerowater, sizeclass + USE mo_ham_m7ctl, ONLY: inucs, iaits, iaccs, icoas, & + iaiti, iacci, icoai, & + iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, ibcki, & + iocks, iocas, ioccs, iocki, & + issas, isscs, & + iduas, iducs, iduai, iduci + + + idt_dms = speclist(id_dms)%idt + idt_so2 = speclist(id_so2)%idt + idt_so4 = speclist(id_so4g)%idt + + idt_ms4ns = aerocomp(iso4ns)%idt + idt_ms4ks = aerocomp(iso4ks)%idt + idt_ms4as = aerocomp(iso4as)%idt + idt_ms4cs = aerocomp(iso4cs)%idt + + idt_mbcks = aerocomp(ibcks)%idt + idt_mbcas = aerocomp(ibcas)%idt + idt_mbccs = aerocomp(ibccs)%idt + idt_mbcki = aerocomp(ibcki)%idt + + idt_mocks = aerocomp(iocks)%idt + idt_mocas = aerocomp(iocas)%idt + idt_moccs = aerocomp(ioccs)%idt + idt_mocki = aerocomp(iocki)%idt + + idt_mssas = aerocomp(issas)%idt + idt_msscs = aerocomp(isscs)%idt + + idt_mduas = aerocomp(iduas)%idt + idt_mducs = aerocomp(iducs)%idt + idt_mduai = aerocomp(iduai)%idt + idt_mduci = aerocomp(iduci)%idt + + idt_nns = sizeclass(inucs)%idt_no + idt_nks = sizeclass(iaits)%idt_no + idt_nas = sizeclass(iaccs)%idt_no + idt_ncs = sizeclass(icoas)%idt_no + idt_nki = sizeclass(iaiti)%idt_no + idt_nai = sizeclass(iacci)%idt_no + idt_nci = sizeclass(icoai)%idt_no + + idt_mwans = aerowater(inucs)%idt + idt_mwaks = aerowater(iaits)%idt + idt_mwaas = aerowater(iaccs)%idt + idt_mwacs = aerowater(icoas)%idt + +END SUBROUTINE ham_m7_set_idt + +!@brief: set a list of flag values and mode names for th eindividual aerosol modes +! +! The flag values depend on the optional property flags ldrydep, ... +! +! @author: Martin Schultz, FZ Juelich (2010-04-16) +! +SUBROUTINE ham_get_class_flag(nclass, classflag, classname, classnumname, & + ldrydep, lwetdep, lsedi) !>>dod added lsedi <nclass + USE mo_tracdef, ONLY: ln + !>>dod + USE mo_exception, ONLY:finish + !<>dod + + INTEGER :: jclass + + !>>dod + IF (PRESENT(lwetdep) .AND. PRESENT(ldrydep)) CALL finish('mo_ham_m7_trac', 'ham_get_class_flag received multiple requests') + IF (PRESENT(lwetdep) .AND. PRESENT(lsedi)) CALL finish('mo_ham_m7_trac', 'ham_get_class_flag received multiple requests') + IF (PRESENT(ldrydep) .AND. PRESENT(lsedi)) CALL finish('mo_ham_m7_trac', 'ham_get_class_flag received multiple requests') + ! + ! define number of values returned + nclass = aero_nclass + ! define values + DO jclass = 1,nclass + classname(jclass) = sizeclass(jclass)%shortname + !>>SF #299: added mode number name + classnumname(jclass) = 'NUM_'//TRIM(sizeclass(jclass)%shortname) + !<>dod: drydep is true for all modes + IF (PRESENT(ldrydep)) THEN + IF (ldrydep) classflag(:) = .TRUE. + END IF + !<>dod: so is wetdep... + IF (PRESENT(lwetdep)) THEN + IF (lwetdep) classflag(:) = .TRUE. + END IF + + !>>dod + IF (PRESENT(lsedi)) THEN + IF (lsedi) THEN + DO jclass = 1,nclass + classflag(jclass) = sizeclass(jclass)%lsed + END DO + END IF + END IF + !< +!! \filename +!! mo_ham_m7ctl.f90 +!! +!! \brief +!! mo_ham_m7ctl contains parameters, switches and initialization routines for the m7 aerosol module. +!! +!! \author Elisabetta Vignatti (JRC/EI) +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# E. Vignati and J. Wilson (JRC/EI) - original code (2000) +!! -# P. Stier (MPI-Met) (2001/2002) +!! -# J. Kazil (MPI-Met) (2008) +!! -# D. O'Donnell (MPI-Met) (2007-2007) +!! -# M.G. Schultz (FZ Juelich) - new module struture (2009) +!! +!! \limitations +!! Currently, there are two index lists for aerosol species: aero_idx in mo_species +!! and subm_aerospec in this module. I hope these are identical for the current model set-up +!! in preparation for CMIP5. Later, one may wish to distinguish between the two: aero_idx +!! could contain additional aerosol species (e.g. from MOZART or climatologies), and this could +!! mess up the M7 code. If this can be generalized: fine. if not we should keep the two +!! lists separate. mo_ham_rad (for example) works on aero_idx to be independent of M7 specifics. +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_m7ctl + + USE mo_kind, ONLY: dp + USE mo_math_constants, ONLY: pi + USE mo_physical_constants, ONLY: avo + USE mo_species, ONLY: nmaxspec + USE mo_ham, ONLY: HAM_M7, naeroclass, sigma_fine, sigma_coarse + + IMPLICIT NONE + + PRIVATE + + ! -- subroutines +#ifdef HAMMOZ + PUBLIC :: sethamM7 +#endif + PUBLIC :: m7_initialize + + ! -- variables + PUBLIC :: nwater, nsnucl, nonucl + PUBLIC :: lnucl_stat + PUBLIC :: inucs, iaits, iaccs, icoas, iaiti, iacci, icoai + + PUBLIC :: critn, cmin_aernl, cmin_aerml, cminvol, cminrad, cminrho, cdconv + PUBLIC :: wna2so4, wh2so4, wnacl, wnahso4 + PUBLIC :: dna2so4, dh2so4, dnacl, dnahso4 + PUBLIC :: dbc, doc, ddust + PUBLIC :: crh + + PUBLIC :: sigma, sigmaln + PUBLIC :: crdiv, caccso4, gmb, wvb, dh2o + PUBLIC :: bk, rerg, r_kcal + + PUBLIC :: so4_coating_threshold + PUBLIC :: cmr2ras, cmr2mmr, cmedr2mmedr, cmr2ram, ram2cmr + + !--- 1) Define and pre-set switches for the processes of M7: ----------------------- + + !--- Physical: + + INTEGER :: nwater = 1 ! Aerosol water uptake scheme: + ! + ! nwater = 0 Jacobson et al., JGR 1996 + ! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) + + INTEGER :: nsnucl = 1 ! Choice of the H2SO4/H2O nucleation scheme: + ! + ! nsnucl = 0 off + ! = 1 Vehkamaeki et al., JGR 2002 + ! = 2 Kazil and Lovejoy, ACP 2007 + + INTEGER :: nonucl = 1 ! Choice of the organic nucleation scheme: + ! + ! nonucl = 0 off + ! = 1 Activation nucleation, Kulmala et al., ACP 2006 + ! = 2 Activation nucleation, Laakso et al., ACP 2004 + + LOGICAL :: lnucl_stat = .FALSE. ! Sample the cloud-free volume as function of T, RH, [H2SO4(g)], + ! H2SO4 condensation sink, and ionization rate (memory intensive) + + !--- Mass index (in array aerml and ttn): + ! + ! Attention: + ! The mass of sulfate compounds is always given in [molec. cm-3] + ! whilst the mass of other compounds is given in [ug cm-3]. + ! + ! Compounds: + ! + ! so4 = sulphate + ! bc = black carbon + ! oc = organic carbon, + ! ss = sea salt + ! du = dust + ! + ! Modes: + ! + ! n = nucleation mode + ! k = aitken mode + ! a = accumulation mode + ! c = coarse mode + ! + ! Type: + ! + ! s = soluble mode + ! i = insoluble mode + + ! M7 aerosol mode indices + ! i*[n|k|a|c][i|s] : n = nucleation mode + ! k = aitken mode + ! a = accumulation mode + ! c = coarse mode + ! i = insoluble + ! s = soluble + ! empty matrix entries are not populated. + INTEGER, PUBLIC :: iso4ns, iso4ks, iso4as, iso4cs, & + ibcks, ibcas, ibccs, & + ibcki, & + iocks, iocas, ioccs, & + iocki, & + issas, isscs, & + iduas, iducs, & + iduai, iduci + + !--- Number index (in array aernl): + ! + + INTEGER, PARAMETER :: & + inucs=1, iaits=2, iaccs=3, icoas=4, iaiti=5, iacci=6, icoai=7 + ! MODE: | | | | | + ! nucl. | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! soluble | soluble | soluble | soluble | insol. | insol. | insol. | + + + !--- 4) Definition of the modes of M7: ------------------------------------------------------ + + !--- 4.1) Threshold radii between the different modes [cm]: + ! Used for the repartititioning in m7_dconc. + ! crdiv(jclass) is the lower bound and crdiv(jclass+1) is + ! the upper bound of the respective geometric mode. + + REAL(dp) :: crdiv(4)=(/ 0.0005E-4_dp, 0.005E-4_dp, 0.05E-4_dp, 0.5E-4_dp /) + ! | | | | + ! | | | | + ! nucleation aitken accum coarse mode + + !--- 4.2) Standard deviation for the modes: + + REAL(dp), PARAMETER :: sigma(naeroclass(HAM_M7))=(/ sigma_fine, sigma_fine, sigma_fine, sigma_coarse, & + sigma_fine, sigma_fine, sigma_coarse /) + + !--- Natural logarithm of the standard deviation of each mode: + ! Calulated in m7_initialize. + + REAL(dp) :: sigmaln(naeroclass(HAM_M7)) + + !--- 5) Conversion factors for lognormal particle size distributions: ------------- + ! Calulated in m7_initialize. + + REAL(dp) :: cmr2ras(naeroclass(HAM_M7)) ! Conversion factor: count median radius to radius of average surface + + REAL(dp) :: cmr2mmr(naeroclass(HAM_M7)) ! Conversion factor: count median radius to mass mean radius + + REAL(dp) :: cmedr2mmedr(naeroclass(HAM_M7)) ! Conversion factor: count median radius to mass median radius + + REAL(dp) :: cmr2ram(naeroclass(HAM_M7)) ! Conversion factor: count median radius to radius of average mass + + REAL(dp) :: ram2cmr(naeroclass(HAM_M7)) ! Conversion factor: radius of average mass to count median radius + + !--- 6) Assumed thresholds for occurence of specific quantities: ------------- + + REAL(dp), PARAMETER :: cmin_aerml = 1.E-15_dp , & ! threshold for aerosol mass + cmin_aernl = 1.E-10_dp , & ! threshold for aerosol number +!>>gf #240 + cminvol = 1.E-23_dp, & ! threshold for aerosol volume + cminrad = 1.E-8_dp, & ! threshold for aerosol radius + cminrho = 1.E-10_dp ! threshold for aerosol density + + !--- 6.1) Density conversion + + REAL(dp), PARAMETER :: cdconv = 1.E-3_dp ! density conversion from kg m-3 to g cm-3 + +!<>dod soa +!!mgs!! REAL(dp), PARAMETER :: ws = 32._dp ! atomic weight of sulphur +!!mgs!! !<>dod changed handling of coagulation + TYPE, PUBLIC :: t_coag + INTEGER :: mode1 + INTEGER :: mode2 + END TYPE t_coag + + INTEGER, PARAMETER, PUBLIC :: ncoag = 16 + + TYPE(t_coag), PUBLIC :: coag_modes(ncoag) + !<>dod soa + !---executable procedure + + sizeclass(1)%classname = "Nucleation soluble" + sizeclass(1)%shortname = "NS" + sizeclass(1)%self = 1 + sizeclass(1)%lsoluble = .TRUE. + sizeclass(1)%lsed = .FALSE. + sizeclass(1)%lsoainclass = .FALSE. + sizeclass(1)%lactivation = .FALSE. + + sizeclass(2)%classname = "Aitken soluble" + sizeclass(2)%shortname = "KS" + sizeclass(2)%self = 2 + sizeclass(2)%lsoluble = .TRUE. + sizeclass(2)%lsed = .FALSE. + sizeclass(2)%lsoainclass = .TRUE. + sizeclass(2)%lactivation = .TRUE. + + sizeclass(3)%classname = "Accumulation soluble" + sizeclass(3)%shortname = "AS" + sizeclass(3)%self = 3 + sizeclass(3)%lsoluble = .TRUE. + sizeclass(3)%lsed = .TRUE. + sizeclass(3)%lsoainclass = .TRUE. + sizeclass(3)%lactivation = .TRUE. + + sizeclass(4)%classname = "Coarse soluble" + sizeclass(4)%shortname = "CS" + sizeclass(4)%self = 4 + sizeclass(4)%lsoluble = .TRUE. + sizeclass(4)%lsed = .TRUE. + sizeclass(4)%lsoainclass = .TRUE. + sizeclass(4)%lactivation = .TRUE. + + sizeclass(5)%classname = "Aitken insoluble" + sizeclass(5)%shortname = "KI" + sizeclass(5)%self = 5 + sizeclass(5)%lsoluble = .FALSE. + sizeclass(5)%lsed = .FALSE. + sizeclass(5)%lsoainclass = .TRUE. + sizeclass(5)%lactivation = .FALSE. + + sizeclass(6)%classname = "Accumulation insoluble" + sizeclass(6)%shortname = "AI" + sizeclass(6)%self = 6 + sizeclass(6)%lsoluble = .FALSE. + sizeclass(6)%lsed = .TRUE. + sizeclass(6)%lsoainclass = .FALSE. + sizeclass(6)%lactivation = .FALSE. + + sizeclass(7)%classname = "Coarse insoluble" + sizeclass(7)%shortname = "CI" + sizeclass(7)%self = 7 + sizeclass(7)%lsoluble = .FALSE. + sizeclass(7)%lsed = .TRUE. + sizeclass(7)%lsoainclass = .FALSE. + sizeclass(7)%lactivation = .FALSE. + !<>dod optimisation of coagulation + ! nucleation mode + coag_modes(1)%mode1 = inucs + coag_modes(1)%mode2 = inucs + coag_modes(2)%mode1 = inucs + coag_modes(2)%mode2 = iaits + coag_modes(3)%mode1 = inucs + coag_modes(3)%mode2 = iaccs + coag_modes(4)%mode1 = inucs + coag_modes(4)%mode2 = icoas + coag_modes(5)%mode1 = inucs + coag_modes(5)%mode2 = iaiti + coag_modes(6)%mode1 = inucs + coag_modes(6)%mode2 = iacci + coag_modes(7)%mode1 = inucs + coag_modes(7)%mode2 = icoai + + ! aitken soluble mode + coag_modes(8)%mode1 = iaits + coag_modes(8)%mode2 = iaits + coag_modes(9)%mode1 = iaits + coag_modes(9)%mode2 = iaccs + coag_modes(10)%mode1 = iaits + coag_modes(10)%mode2 = icoas + coag_modes(11)%mode1 = iaits + coag_modes(11)%mode2 = iaiti + coag_modes(12)%mode1 = iaits + coag_modes(12)%mode2 = iacci + coag_modes(13)%mode1 = iaits +!gf(#135) coag_modes(13)%mode2 = icoas + coag_modes(13)%mode2 = icoai + + ! accumulation soluble mode + coag_modes(14)%mode1 = iaccs + coag_modes(14)%mode2 = iaccs + coag_modes(15)%mode1 = iaccs +!gf #158 coag_modes(15)%mode2 = iacci + coag_modes(15)%mode2 = iaiti + + ! aitken insoluble mode + coag_modes(16)%mode1 = iaiti + coag_modes(16)%mode2 = iaiti + + !--- 4) Set prescribed scavenging ratios + ! + !SF Note: this was formerly hardcoded in mo_ham_m7_wetdep_data. + ! In order to handle more transparently M7 and SALSA, it is + ! necessary to make this initialization dynamic. + + IF (.NOT. ALLOCATED(csr_strat_wat)) ALLOCATE(csr_strat_wat(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(csr_strat_mix)) ALLOCATE(csr_strat_mix(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(csr_strat_ice)) ALLOCATE(csr_strat_ice(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(csr_conv)) ALLOCATE(csr_conv(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(cbcr)) ALLOCATE(cbcr(naeroclass(HAM_M7))) + IF (.NOT. ALLOCATED(cbcs)) ALLOCATE(cbcs(naeroclass(HAM_M7))) + + csr_strat_wat(1:naeroclass(HAM_M7)) = (/0.10_dp, 0.25_dp, 0.85_dp, 0.99_dp, 0.20_dp, 0.40_dp, 0.40_dp/) + csr_strat_mix(1:naeroclass(HAM_M7)) = (/0.10_dp, 0.40_dp, 0.75_dp, 0.75_dp, 0.10_dp, 0.40_dp, 0.40_dp/) + csr_strat_ice(1:naeroclass(HAM_M7)) = (/0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp, 0.10_dp/) + csr_conv(1:naeroclass(HAM_M7)) = (/0.20_dp, 0.60_dp, 0.99_dp, 0.99_dp, 0.20_dp, 0.40_dp, 0.40_dp/) + !--- Mean mass scavenging coefficients normalized by rain-rate [kg m-2]: + ! Rain: Seinfeld & Pandis, Fig 20.15: + cbcr(1:naeroclass(HAM_M7)) = & + (/ 5.0E-4_dp, 1.0E-4_dp, 1.0E-3_dp, 1.0E-1_dp, 1.0E-4_dp, 1.0E-3_dp, 1.0E-1_dp /) + ! Snow: Little available, graphs in Prupbacher show similar order of magnitude in + ! collection efficiency as rain,therefore assume typical mean value as above: + cbcs(1:naeroclass(HAM_M7)) = & + (/ 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp, 5.0E-3_dp /) + + END SUBROUTINE m7_initialize + +#ifdef HAMMOZ + SUBROUTINE sethamM7 + + ! *sethamM7* modifies pre-set switches of the aeroM7ctl + ! namelist for the configuration of the + ! M7 component of the ECHAM/HAM aerosol model + ! + ! Authors: + ! -------- + ! Philip Stier, MPI-M 12/2002 + ! Jan Kazil, MPI-M 2008-03-03 20:34:52 + ! + ! *sethamM7* is called from *init_subm* in mo_submodel_interface + ! + + USE mo_mpi, ONLY: p_parallel_io, p_bcast, p_io + USE mo_namelist, ONLY: open_nml, position_nml, POSITIONED + USE mo_exception, ONLY: message, em_warn, em_info + USE mo_util_string, ONLY: separator + USE mo_ham, ONLY: lgcr + + IMPLICIT NONE + + INCLUDE 'ham_m7ctl.inc' + + ! Local variables: + + INTEGER :: ierr, inml, iunit + + ! Read the namelist with the switches: + + CALL message('',separator) + CALL message('sethamM7', 'Reading namelist ham_m7ctl...', level=em_info) + + + IF (p_parallel_io) THEN + + inml = open_nml('namelist.echam') + iunit = position_nml ('HAM_M7CTL', inml, status=ierr) + SELECT CASE (ierr) + CASE (POSITIONED) + READ (iunit, ham_m7ctl) + END SELECT + + ENDIF + ! Broadcast the switches over the processors: + + CALL p_bcast (nwater, p_io) + CALL p_bcast (nsnucl, p_io) + CALL p_bcast (nonucl, p_io) + CALL p_bcast (lnucl_stat, p_io) + + !--- error checking + IF (nsnucl > 1 .AND. .NOT. lgcr) THEN + CALL message('sethamM7', 'nsnucl > 1 requires lgcr=.TRUE.! Setting lgcr=.TRUE. now.', & + level=em_warn) + lgcr = .TRUE. + END IF + + !--- write the values of the switches: + CALL sethamM7_log(nwater,nsnucl,nonucl,lnucl_stat) + + END SUBROUTINE sethamM7 + + SUBROUTINE sethamM7_log(nwater,nsnucl,nonucl,lnucl_stat) + + ! *sethamM7_log* writes the values of the given switches in a given output + ! unit and conducts selceted consistency checks. + ! + ! Authors: + ! -------- + ! + ! 2008 Jan Kazil, MPI-M + + USE mo_exception, ONLY: message, message_text, em_param, em_error, em_info + USE mo_submodel, ONLY: print_value + USE mo_util_string, ONLY: separator + USE mo_ham, ONLY: lgcr + + IMPLICIT NONE + + ! + ! Input variables: + ! + + LOGICAL :: lnucl_stat + INTEGER :: nwater, nsnucl, nonucl + + CALL message('','',level=em_param) + CALL message('sethamM7','Initialization of the M7 aerosol module', level=em_info) + + CALL print_value('nwater', nwater) + SELECT CASE(nwater) + CASE (0) + CALL message('', ' --> Jacobson, Tabazadeh, and Turco (Jacobson et al., JGR 1996)', & + level=em_param) + CASE (1) + CALL message('', ' --> Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007)', & + level=em_param) + CASE DEFAULT + WRITE(message_text,'(a,i0,a)') 'nwater must be 0 or 1 (present value = ',nwater,')' + CALL message('sethamM7', message_text, level=em_error) + END SELECT + + + CALL print_value('nsnucl', nsnucl) + SELECT CASE(nsnucl) + CASE (0) + CALL message('', 'H2SO4/H2O nucleation off', & + level=em_param) + CASE (1) + CALL message('', ' --> Neutral H2SO4/H2O nucleation (Vehkamaeki et al., JGR 2002)', & + level=em_param) + CASE (2) + CALL message('', ' --> Neutral and charged H2SO4/H2O nucleation (Kazil and Lovejoy, ACP 2007)', & + level=em_param) + CASE DEFAULT + WRITE(message_text,'(a,i0,a)') 'nsnucl must be 0, 1 or 2 (present value = ',nsnucl,')' + CALL message('sethamM7', message_text, level=em_error) + END SELECT + + + CALL print_value('nonucl', nonucl) + SELECT CASE(nonucl) + CASE (0) + CALL message('', ' --> Organic aerosol nucleation off', & + level=em_param) + CASE (1) + CALL message('', ' --> Organic aerosol (activation) nucleation (Kulmala et al., ACP 2006)', & + level=em_param) + CASE (2) + CALL message('', ' --> Organic aerosol (kinetic) nucleation after (Laakso et al., ACP 2004)', & + level=em_param) + CASE DEFAULT + WRITE(message_text,'(a,i0,a)') 'nonucl must be 0, 1 or 2 (present value = ',nonucl,')' + CALL message('sethamM7', message_text, level=em_error) + END SELECT + + + IF (lnucl_stat) THEN + CALL message('', 'lnucl_stat=.TRUE. : Sampling the cloud-free volume as function of', & + level=em_param) + CALL message('', 'T, RH, [H2SO4(g)], H2SO4 condensation sink, and ionization rate', & + level=em_param) + END IF + + CALL message('', separator) + + END SUBROUTINE sethamM7_log +#endif + +END MODULE mo_ham_m7ctl diff --git a/ifs-source/arpifs/m7/module/mo_ham_rad.F90 b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 new file mode 100755 index 00000000..bd67c688 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_rad.F90 @@ -0,0 +1,2504 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_rad.f90 +!! +!! \brief +!! mo_ham_rad holds the parameters and routines for +!! the calculation of the optical parameters +!! for the aerosol distribution simulated +!! by the ECHAM/HAM aerosol module. +!! +!! \author Olivier Boucher (Univ. Lille) +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! [ John Doe, john.doe@blabla.com -Compulsory- ] +!! +!! \revision_history +!! -# O. Boucher (Univ. Lille) - original csource of some radiation routines (2003) +!! -# P. Stier (MPI-Met) - (2003-05-08) +!! -# P. Stier (Caltech) - adaption to ECHAM5/HAM, additional routines, refractive indices (2007) +!! -# S. Rast (MPI-Met) - adaptation to echam5.3.2 (2007-03) +!! -# D. O'Donnell (MPI-Met) - SOA (XXXX) +!! -# K. Zhang (MPI-Met) - submodel interface (2009-07) +!! -# M.G. Schultz (FZ Juelich) - cleanup (XXXX) +!! -# P. Stier (Uni Oxford) - adaptation to RRTM-SW (2010) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! -# H. Kokkola (FMI) - modified to include SALSA (2013-06) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! - Stier et al., ACP, 2005 (SW, volume weighted refractive indices) +!! - Stier et al., ACPD, 2007 (LW, mixing rules,...) +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_rad + + USE mo_ham_rad_data, ONLY: Nwv_sw, Nwv_sw_opt, Nwv_lw, & + Nwv_tot, Nwv_sw_tot, & + cnr, cni, & + log_x0_min, log_x0_max, & + log_ni_min, & + x0_min, x0_max, & + nnrmax, nnimax, ndismax, & + nr_min, nr_max, ni_min, ni_max, & + inc_nr, inc_ni, & + lambda, lambda_sw_opt, & + ham_rad_data_initialize + USE mo_ham, ONLY: naerocomp, & + aerocomp, & + aerowater, & + nraddiag, nrad, & + sizeclass, & + nclass + USE mo_ham, ONLY: subm_aerospec + USE mo_kind, ONLY: dp, THRESHOLD + USE mo_species, ONLY: speclist, naerospec, nmaxspec + !>>dod soa + USE mo_ham_species, ONLY: id_oc, id_wat !!mgs!! , naerospec=>ham_naerospec, aerospec=>ham_aerospec + !<>dod omp bugfix + SUBROUTINE ham_rad_refrac_volume(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & + pxtm1, pnr, pni ) + !<>dod openmp bugfix + REAL(dp) :: zvsum(kbdim,klev), & + znrsum(kbdim,klev), & + znisum(kbdim,klev) + !<>dod openmp bugfix removed allocation of arrays + + + !---sum over aerosol compounds: + + zvsum(1:kproma,:) =0._dp + znrsum(1:kproma,:)=0._dp + znisum(1:kproma,:)=0._dp + + !>>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt) / zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + + + !---Weighted averaging: + DO jk=1,klev + DO jl=1,kproma + IF(zvsum(jl,jk)>zeps) THEN ! safe division + + pnr(jl,jk)=znrsum(jl,jk)/zvsum(jl,jk) + pni(jl,jk)=znisum(jl,jk)/zvsum(jl,jk) + + ELSE + + pnr(jl,jk)=0._dp + pni(jl,jk)=0._dp + + END IF + END DO + END DO + + !>>dod openmp bugfix removed deallocation of arrays + !<>dod omp bugfix + SUBROUTINE ham_rad_refrac_maxgar(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & + pxtm1, pnr, pni ) + !<>dod openmp bugfix removed allocatable property of arrays + LOGICAL :: lcore(kbdim,klev) + + REAL(dp) :: zvsum(kbdim,klev), zvcore(kbdim,klev), & + znrsum(kbdim,klev), znisum(kbdim,klev) + + COMPLEX :: ce ! component dielectric constant + + COMPLEX :: cn_eff(kbdim,klev), & ! mode effective refractive index + ce_eff(kbdim,klev), & ! mode effective dielectric constant + cn_0(kbdim,klev), & ! host medium effective refractive index + ce_0(kbdim,klev), & ! host medium effective dielectric constant + csum(kbdim,klev) ! local summation term + !<>dod openmp bugfix removed allocation of arrays + !<>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + !---volume of insoluble core: + + IF (.NOT. aerocomp(jn)%species%lwatsol) THEN + zvcore(1:kproma,:) = zvcore(1:kproma,:)+pxtm1(1:kproma,:,jt)/zdensity + END IF + + !--- Total mode volume and summation of refractive indices: + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + !<>dod openmp bugfix + DO jk=1,klev + DO jl=1,kproma + !<zeps) THEN ! Safe division + cn_eff(jl,jk)=CMPLX( znrsum(jl,jk)/zvsum(jl,jk) , znisum(jl,jk)/zvsum(jl,jk), kind=dp ) + ELSE + cn_eff(jl,jk)=CMPLX( 0.0_dp , 0.0_dp, kind=dp ) + END IF + + END DO + END DO + + !--- 2) Apply Maxwell-Garnett for regions with insoluble core: + + !--- Find regions with insoluble core: + + lcore(1:kproma,:)=.FALSE. + + !>>dod openmp bugfix + DO jk=1,klev + DO jl=1,kproma + !<0._dp) THEN + IF (zvcore(jl,jk) > zvsum(jl,jk)*zepsrel .AND. zvcore(jl,jk) < zvsum(jl,jk)*(1.0_dp-zepsrel)) THEN + lcore(jl,jk)=.TRUE. + END IF + END IF + END DO + END DO + + !--- 2.1) Calculate volume weighted refractive index of host medium: + + zvsum(1:kproma,:) = 0.0_dp + znrsum(1:kproma,:) = 0.0_dp + znisum(1:kproma,:) = 0.0_dp + + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + IF (aerocomp(jn)%species%lwatsol) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + END IF + + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN !Physical cutoff + + zv=pxtm1(jl,jk,jt)/zdensity + + znrsum(jl,jk)=znrsum(jl,jk)+cnr(kwv,ikey)*zv + znisum(jl,jk)=znisum(jl,jk)+cni(kwv,ikey)*zv + + zvsum(jl,jk) =zvsum(jl,jk)+zv + + END IF + END DO + END DO + + END IF + !<zeps .AND. lcore(jl,jk)) THEN ! Safe division + cn_0(jl,jk)=CMPLX( znrsum(jl,jk)/zvsum(jl,jk) , znisum(jl,jk)/zvsum(jl,jk), kind=dp ) + ELSE + cn_0(jl,jk)=CMPLX( 0.0_dp , 0.0_dp, kind=dp ) + END IF + + !--- Dielectric constant: + + ce_0(jl,jk)=cn_0(jl,jk)**2 + + END DO + END DO + + !--- 2.2) Apply Maxwell-Garnett mixing rule for insoluble core: + + !--- Calculate total mode volume + + zvsum(1:kproma,:) = 0.0_dp + + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + IF (aerocomp(jn)%species%lwatsol) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + zvsum(jl,jk) =zvsum(jl,jk)+pxtm1(jl,jk,jt)/zdensity + END IF + END DO + END DO + + END IF + END IF + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN + zvsum(jl,jk) =zvsum(jl,jk)+pxtm1(jl,jk,jt)/zdensity + END IF + END DO + END DO + END IF + + !--- Apply M&G for the insoluble core components embedded in soluble host medium: + + csum(1:kproma,:)=CMPLX(0.0_dp,0.0_dp, kind=dp) + + !>>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + + IF (.NOT. aerocomp(jn)%species%lwatsol) THEN + jt = aerocomp(jn)%idt + + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + + ce=CMPLX(cnr(kwv,ikey),cni(kwv,ikey), kind=dp)**2 + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps .AND. lcore(jl,jk)) THEN !Physical cutoff/safe division implied + + zvfrac=(pxtm1(jl,jk,jt)/zdensity) / zvsum(jl,jk) + + csum(jl,jk)=csum(jl,jk)+zvfrac*(ce-ce_0(jl,jk))/(ce+2.0_dp*ce_0(jl,jk)) + + END IF + END DO + END DO + + END IF + END IF + + END DO + !<>dod openmp bugfix + DO jk=1,klev + DO jl=1,kproma + !<>dod omp bugfix + SUBROUTINE ham_rad_refrac_brugge(kproma, kbdim, klev, krow, ktrac, kmod, kwv, & + pxtm1, pnr, pni ) + !<>dod soa + INTEGER :: ikey + !<>dod openmp bugfix removed allocatable property of arrays + + REAL(dp) :: zvsum(kbdim,klev) + + COMPLEX :: ce, cn_eff_old ! component dielectric constant + + COMPLEX :: cn_eff(kbdim,klev), & ! mode effective refractive index + ce_eff(kbdim,klev), & ! mode effective dielectric constant + cfe(kbdim,klev), & ! f(e) + cfep(kbdim,klev) ! f'(e) + + INTEGER, PARAMETER :: niter=7 ! maximum number of iterations + ! (1 year test run showed convergence + ! after 6 iterations everywhere ) + + + !---executable procedure + + zeps=THRESHOLD ! Used for both physical cutoff and safe division + + !>>dod deleted allocation of arrays + !<>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + zvsum(1:kproma,:) =zvsum(1:kproma,:)+pxtm1(1:kproma,:,jt)/zdensity + + END IF + + END DO + + ! Add aerosol water + IF (sizeclass(kmod)%lsoluble .AND. nrad(kmod) > 0) THEN + jt = aerowater(kmod)%idt + zdensity = aerowater(kmod)%species%density + ikey = aerowater(kmod)%species%iaerorad + + zvsum(1:kproma,:) =zvsum(1:kproma,:)+pxtm1(1:kproma,:,jt)/zdensity + + END IF + + + !--- 2) Calculate f(e0) and f'(e0) + ! and start Newtonian iteration: + + !--- First guess for effective dielectric constant: + + + !--- Newtonian iteration: + + !--- Choose POM values as initial guess (approximate zero) for Newton-Raphson method: + ! (Radiative properties of POM lie within range of other compounds) + + ce_eff(1:kproma,:)=CMPLX(cnr(kwv,speclist(id_oc)%iaerorad),cni(kwv,speclist(id_oc)%iaerorad), kind=dp)**2 + + DO jiter=1, niter + + cfe(1:kproma,:) = CMPLX(0.0_dp,0.0_dp, kind=dp) + cfep(1:kproma,:) = CMPLX(0.0_dp,0.0_dp, kind=dp) + + !>>dod soa + DO jn = 1,naerocomp + IF (aerocomp(jn)%iclass == kmod .AND. nrad(kmod) > 0) THEN + jt = aerocomp(jn)%idt + zdensity=aerocomp(jn)%species%density + ikey = aerocomp(jn)%species%iaerorad + + !--- Component dielectric constant: + + ce=CMPLX(cnr(kwv,ikey),cni(kwv,ikey), kind=dp)**2 + + DO jk=1,klev + DO jl=1,kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + !--- Component volume fraction: + + zvfrac = (pxtm1(jl,jk,jt)/zdensity) / zvsum(jl,jk) + + !--- Calculate f(e): + + cfe(jl,jk)=cfe(jl,jk) + & + zvfrac*(ce-ce_eff(jl,jk))/(ce+2.0_dp*ce_eff(jl,jk)) + + !--- Calculate f'(e): + + cfep(jl,jk)=cfep(jl,jk) + & + zvfrac*( (-3.0_dp*ce) / ( (ce+2.0_dp*ce_eff(jl,jk))**2 ) ) + + END IF + END DO + END DO + + !--- Solve for new approximation of effective dielectric constant: + + DO jk=1,klev + DO jl=1,kproma + IF(zvsum(jl,jk)>zeps) THEN + + ! IF (CABS(cfep(jl,jk))sigma + USE mo_math_constants, ONLY: pi + USE mo_physical_constants, ONLY: grav + USE mo_kind, ONLY: dp + USE mo_exception, ONLY: finish + USE mo_tracdef, ONLY: ntrac +#ifdef HAMMOZ + USE mo_ham_streams, ONLY: rwet +#endif +#ifdef SALSA + USE mo_ham_salsa, ONLY: rwet_salsa + USE mo_ham_salsactl, ONLY: fn2a, fn2b, nbin3 +#endif + USE mo_control, ONLY: ltimer + !>>dod split of mo_timer (#51) +#ifdef HAMMOZ + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, & + timer_ham_rad_fitplus, & + timer_ham_rad_refrac +#endif + USE mo_ham_rad_data, ONLY: nraddiagwv +#ifdef HAMMOZ + USE mo_ham_streams, ONLY: tau_mode +#endif + + + IMPLICIT NONE + + !--- Arguments: + + INTEGER,INTENT(IN) :: kproma , kbdim, klev, krow, kpband, kb_sw,kb_diag,ntype_diaf + + REAL(dp), INTENT(in) :: ppd_hl(kbdim,klev) ! pressure diff between half levels [Pa] + + REAL(dp),INTENT(IN) :: pxtm1(kbdim,klev,ntrac) ! tracer mass/number mixing ratio (t-dt) [kg/kg]/[#/kg] + + REAL(dp), INTENT(inout) :: aer_tau_lw_vr(kbdim,klev,kpband),& !< LW optical thickness of aerosols + aer_tau_sw_vr(kbdim,klev,kb_sw), & !< aerosol optical thickness + aer_cg_sw_vr(kbdim,klev,kb_sw), & !< aerosol asymmetry factor + aer_piz_sw_vr(kbdim,klev,kb_sw) !< aerosol single scattering albedo + + ! diagnostic aerosol optical properties + logical,intent(in) :: ldiag_aeropt ! logical for aerosol optics + real(dp),intent(in) :: lambda_diag(kb_diag) + real(dp),intent(inout) :: zaer_tau_diag(kbdim,klev,kb_diag) + real(dp),intent(inout) :: zaer_ssa_diag(kbdim,klev,kb_diag) + real(dp),intent(inout) :: zaer_asym_diag(kbdim,klev,kb_diag) + + REAL(dp) :: sigma_diag(kbdim,klev,kb_diag,nclass), & + omega_diag(kbdim,klev,kb_diag,nclass), & + asym_diag (kbdim,klev,kb_diag,nclass), & + nr_diag(kbdim,klev,kb_diag,nclass), & + ni_diag(kbdim,klev,kb_diag,nclass) + !--- Local Variables: +#ifdef HAMMOZ + +#else + REAL(dp), INTENT(in) :: rwet_m7(kbdim,klev,nclass) +#endif + INTEGER :: jclass, jl, jk, jwv, jwv_diag, itable, itrac, ikl + + REAL(dp) :: zeps + + REAL(dp) :: zxx(kbdim,klev), & ! size parameter + zdpg(kbdim,klev) ! auxiliary parameter dp/grav + + REAL(dp) :: zaer_tau_sw_vr(kbdim,klev,Nwv_sw_tot,nclass),& ! SW optical depth for each band and mode + zaer_tau_lw_vr(kbdim,klev,Nwv_lw,nclass),& ! LW optical depth for each band and mode + zaer_tau_diag_vr(kbdim,klev,kb_diag,nclass) ! diag optical depth for each band and mode + +!>>gf: needed to avoid architecture-dependent problems (Cray XT5) + REAL(dp) :: znr2d(kbdim,klev), & ! 2D subset of 4D array nr + zni2d(kbdim,klev), & ! 2D subset of 4D array ni + zsigma2d(kbdim,klev), & ! 2D subste of 4D array sigma + zomega2d(kbdim,klev), & ! 2D subste of 4D array omega + zasym2d(kbdim,klev) ! 2D subste of 4D array asym +!< rwet(jclass)%ptr +#endif + + DO jwv=1,Nwv_sw+Nwv_sw_opt + + !--- 1.1) Calculate volume averaged refractive index nr and ni: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_refrac) +#endif + !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) + ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) + ! Therefore intermediate variables znr2d and zni2d are introduced + !pls: no need to intialize them, they are intent(out) in ham_rad_refrac. Comment these 2 lines: + ! znr2d(1:kproma,:) = nr(1:kproma,:,jwv,jclass) + ! zni2d(1:kproma,:) = ni(1:kproma,:,jwv,jclass) + + CALL ham_rad_refrac(kproma, kbdim, klev, krow, & + ntrac, jclass, jwv, & + pxtm1, znr2d, zni2d ) + +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) +#endif + !--- 1.1) Calculate size parameter: +#ifdef HAMMOZ + zxx(1:kproma,:) = 2._dp*pi*rwet_p(1:kproma,:,krow)/lambda(jwv) +#else + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda(jwv) +#endif + + !--- 1.2) Table-lookup for optical properties: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_fitplus) +#endif + !gf: same as in the call to ham_rad_refrac, for the call to ham_rad_fitplus + + zsigma2d(1:kproma,:) = sigma(1:kproma,:,jwv,jclass) + zomega2d(1:kproma,:) = omega(1:kproma,:,jwv,jclass) + zasym2d(1:kproma,:) = asym(1:kproma,:,jwv,jclass) + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + IF (ABS(modesigma(jclass)-sigma_fine) < zeps*sigma_fine) THEN + itable=1 + ELSE IF (ABS(modesigma(jclass)-sigma_coarse) < zeps*sigma_coarse) THEN + itable=2 + ELSE + CALL finish('ham_rad','incompatible standard deviation in modal setup') + END IF + + CASE(HAM_SALSA) + +#ifdef SALSA + zxx(1:kproma,:) = 2._dp*pi*rwet_salsa(1:kproma,:,jclass)/lambda(jwv) + + IF(jclass < 6 .OR. (jclass > fn2a .AND. jclass < fn2b-(nbin3-1))) THEN + itable=1 + ELSE + itable=2 + END IF +#endif + END SELECT + + IF (itable == 1) THEN + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut1_sigma, zsigma2d, & + lut1_omega, zomega2d, & + lut1_g, zasym2d ) + + ELSE + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut2_sigma, zsigma2d, & + lut2_omega, zomega2d, & + lut2_g, zasym2d ) + + END IF +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_fitplus) +#endif + !>>gf: update the original 4d arrays + sigma(1:kproma,:,jwv,jclass) = zsigma2d(1:kproma,:)*lambda(jwv)*lambda(jwv) + omega(1:kproma,:,jwv,jclass) = zomega2d(1:kproma,:) + asym(1:kproma,:,jwv,jclass) = zasym2d(1:kproma,:) + nr(1:kproma,:,jwv,jclass) = znr2d(1:kproma,:) + ni(1:kproma,:,jwv,jclass) = zni2d(1:kproma,:) + !<0) THEN + DO jwv=1, Nwv_sw+Nwv_sw_opt + zaer_tau_sw_vr(1:kproma,:,jwv,jclass)=znum(1:kproma,:,jclass)*sigma(1:kproma,:,jwv,jclass) + END DO + END IF + END DO + + !--- Diagnose AOD for requested each mode (nrad) and wavelength (nraddiagwv): +#ifdef HAMMOZ + DO jclass=1, nclass + IF(nrad(jclass)>0) THEN + DO jwv=1, Nwv_sw+Nwv_sw_opt + IF (nraddiagwv(jwv)>0) THEN + tau_mode(jclass,jwv)%ptr(1:kproma,:,krow)=zaer_tau_sw_vr(1:kproma,:,jwv,jclass) + END IF + END DO + END IF + END DO +#endif + !--- Calculation of weighted properties and vertical reordering to RRTM structure: + + DO jwv=1, Nwv_sw !ham_ps +Nwv_sw_opt + + DO jclass=1, nclass + DO jk=1, klev +#ifdef HAMMOZ + ikl=klev+1-jk +#else + !No vertical reordering here + ikl=jk +#endif + DO jl=1, kproma + aer_tau_sw_vr(jl,jk,jwv)=aer_tau_sw_vr(jl,jk,jwv) + & + zaer_tau_sw_vr(jl,ikl,jwv,jclass) + aer_piz_sw_vr(jl,jk,jwv)=aer_piz_sw_vr(jl,jk,jwv) + & + zaer_tau_sw_vr(jl,ikl,jwv,jclass)*omega(jl,ikl,jwv,jclass) + aer_cg_sw_vr(jl,jk,jwv) =aer_cg_sw_vr(jl,jk,jwv) + & + zaer_tau_sw_vr(jl,ikl,jwv,jclass)*omega(jl,ikl,jwv,jclass)*asym(jl,ikl,jwv,jclass) + END DO + END DO + END DO + + DO jk=1, klev + DO jl=1, kproma + ! PLS - TODO: SAFE DIVISION + IF (aer_piz_sw_vr(jl,jk,jwv) > THRESHOLD ) THEN + aer_cg_sw_vr(jl,jk,jwv) =aer_cg_sw_vr(jl,jk,jwv)/aer_piz_sw_vr(jl,jk,jwv) + END IF + IF (aer_tau_sw_vr(jl,jk,jwv) > THRESHOLD ) THEN + aer_piz_sw_vr(jl,jk,jwv)=aer_piz_sw_vr(jl,jk,jwv)/aer_tau_sw_vr(jl,jk,jwv) + END IF + END DO + END DO + + END DO + + END IF + + !--- 2) Calculate optical properties for GCM LW bands: + + IF (ANY(nrad(:)==2) .OR. ANY(nrad(:)==3)) THEN + + DO jclass=1, nclass + IF (nrad(jclass)==2 .OR. nrad(jclass)==3) THEN + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr +#endif + + DO jwv=1, Nwv_lw + + jlwv = Nwv_sw+Nwv_sw_opt+jwv ! Total SW wavelengths + LW + + !--- 1.1) Calculate volume averaged refractive index nr and ni: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_refrac) +#endif + !gf: the former usage of nr(1:kproma,:,jwv,jclass) and ni(1:kproma,:,jwv,jclass) + ! directly in the call to ham_rad_refrac is causing architecture-dependent problems (Cray XT5) + ! Therefore intermediate variables znr2d and zni2d are introduced + !pls: no need to intialize them, they are intent(out) in ham_rad_refrac. Comment these 2 lines: + ! znr2d(1:kproma,:) = nr(1:kproma,:,jlwv,jclass) + ! zni2d(1:kproma,:) = ni(1:kproma,:,jlwv,jclass) + + CALL ham_rad_refrac(kproma, kbdim, klev, krow, & + ntrac, jclass, jlwv, & + pxtm1, znr2d, zni2d ) +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) +#endif + !--- 1.1) Calculate size parameter: +#ifdef HAMMOZ + zxx(1:kproma,:)=2._dp*pi*rwet_p(1:kproma,:,krow)/lambda(jlwv) +#else + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda(jlwv) +#endif + + !--- 1.2) Table-lookup for optical properties: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_fitplus) +#endif + !gf: same as in the call to ham_rad_refrac, for the call to ham_rad_fitplus + + zsigma2d(1:kproma,:) = sigma(1:kproma,:,jlwv,jclass) + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + + IF (ABS(modesigma(jclass)-sigma_fine) < zeps*sigma_fine) THEN + itable=3 + ELSE IF (ABS(modesigma(jclass)-sigma_coarse) < zeps*sigma_coarse) THEN + itable=4 + ELSE + CALL finish('ham_rad','incompatible standard deviation in modal setup') + END IF + + CASE(HAM_SALSA) +#ifdef SALSA + zxx(1:kproma,:)=2._dp*pi*rwet_salsa(1:kproma,:,krow)/lambda(jlwv) + + IF(jclass < 6 .OR. (jclass > fn2a .AND. jclass < fn2b-(nbin3-1))) THEN + itable=3 + ELSE + itable=4 + END IF +#endif + END SELECT + + IF (itable == 3) THEN + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut3_sigma, zsigma2d ) + + ELSE + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut4_sigma, zsigma2d ) + + END IF +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_fitplus) +#endif + !>>gf: update the original 4d arrays + sigma(1:kproma,:,jlwv,jclass) = zsigma2d(1:kproma,:) + nr(1:kproma,:,jlwv,jclass) = znr2d(1:kproma,:) + ni(1:kproma,:,jlwv,jclass) = zni2d(1:kproma,:) + !<0) THEN + DO jwv=1, Nwv_lw + jlwv = Nwv_sw+Nwv_sw_opt+jwv ! Total SW wavelengths + LW + + DO jk=1, klev +#ifdef HAMMOZ + ikl=klev+1-jk +#else + !No vertical reordering in openifs (here) + ikl=jk +#endif + DO jl=1, kproma + zaer_tau_lw_vr(jl,jk,jwv,jclass)=znum(jl,jk,jclass)*sigma(jl,jk,jlwv,jclass) + aer_tau_lw_vr(jl,ikl,jwv)=aer_tau_lw_vr(jl,ikl,jwv) + & + zaer_tau_lw_vr(jl,jk,jwv,jclass) + END DO + END DO + + !--- Diagnose AOD for requested each mode (nrad) and wavelength (nraddiagwv): +#ifdef HAMMOZ + IF (nraddiagwv(jwv)>0) THEN + tau_mode(jclass,jwv)%ptr(1:kproma,:,krow)=zaer_tau_lw_vr(1:kproma,:,jwv,jclass) + END IF +#endif + END DO + END IF + END DO + + END IF + + + + + + !--- 3) Calculate optical properties for diagnostic bands: + + IF (ldiag_aeropt) THEN + IF (ANY(nrad(:)==1) .OR. ANY(nrad(:)==3)) THEN + + DO jclass=1, nclass + IF (nrad(jclass)==1 .OR. nrad(jclass)==3) THEN + +#ifdef HAMMOZ + rwet_p => rwet(jclass)%ptr +#endif + + DO jwv=1,kb_diag + + !--- 1.1) Calculate volume averaged refractive index nr and ni: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_refrac) +#endif + ! Fill znr2d(1:kproma,:) with interpolated values; to becopied into nr_diag(1:kproma,:,jwv,jclass) + ! + ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] + call interp_refr_index(kproma, kbdim, klev, lambda, nr(:,:,:,jclass), lambda_diag(jwv), znr2d) + + ! Fill zni2d(1:kproma,:) with interpolated values; to becopied into ni_diag(1:kproma,:,jwv,jclass) + ! + ! should we do logarithmic interpolation for imaginary part? + call interp_refr_index(kproma, kbdim, klev, lambda, ni(:,:,:,jclass), lambda_diag(jwv), zni2d) + +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_refrac) +#endif + !--- 1.1) Calculate size parameter: +#ifdef HAMMOZ + zxx(1:kproma,:) = 2._dp*pi*rwet_p(1:kproma,:,krow)/lambda_diag(jwv) +#else + zxx(1:kproma,:) = 2._dp*pi*rwet_m7(1:kproma,:,jclass)/lambda_diag(jwv) +#endif + + !--- 1.2) Table-lookup for optical properties: +#ifdef HAMMOZ + IF (ltimer) CALL timer_start(timer_ham_rad_fitplus) +#endif + !gf: same as in the call to ham_rad_refrac, for the call to ham_rad_fitplus + + zsigma2d(1:kproma,:) = sigma_diag(1:kproma,:,jwv,jclass) + zomega2d(1:kproma,:) = omega_diag(1:kproma,:,jwv,jclass) + zasym2d(1:kproma,:) = asym_diag(1:kproma,:,jwv,jclass) + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + IF (ABS(modesigma(jclass)-sigma_fine) < zeps*sigma_fine) THEN + itable=1 + ELSE IF (ABS(modesigma(jclass)-sigma_coarse) < zeps*sigma_coarse) THEN + itable=2 + ELSE + CALL finish('ham_rad','incompatible standard deviation in modal setup') + END IF + + CASE(HAM_SALSA) + +#ifdef SALSA + zxx(1:kproma,:) = 2._dp*pi*rwet_salsa(1:kproma,:,jclass)/lambda(jwv) + + IF(jclass < 6 .OR. (jclass > fn2a .AND. jclass < fn2b-(nbin3-1))) THEN + itable=1 + ELSE + itable=2 + END IF +#endif + END SELECT + + IF (itable == 1) THEN + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut1_sigma, zsigma2d, & + lut1_omega, zomega2d, & + lut1_g, zasym2d ) + + ELSE + + CALL ham_rad_fitplus(kproma, kbdim, klev, & + zxx, znr2d, zni2d, & + itable, lut2_sigma, zsigma2d, & + lut2_omega, zomega2d, & + lut2_g, zasym2d ) + + END IF +#ifdef HAMMOZ + IF (ltimer) CALL timer_stop(timer_ham_rad_fitplus) +#endif + !>>gf: update the original 4d arrays + sigma_diag(1:kproma,:,jwv,jclass) = zsigma2d(1:kproma,:)*lambda_diag(jwv)*lambda_diag(jwv) + omega_diag(1:kproma,:,jwv,jclass) = zomega2d(1:kproma,:) + asym_diag(1:kproma,:,jwv,jclass) = zasym2d(1:kproma,:) + nr_diag(1:kproma,:,jwv,jclass) = znr2d(1:kproma,:) + ni_diag(1:kproma,:,jwv,jclass) = zni2d(1:kproma,:) + !<0) THEN + DO jwv=1, kb_diag + zaer_tau_diag_vr(1:kproma,:,jwv,jclass)=znum(1:kproma,:,jclass)*sigma_diag(1:kproma,:,jwv,jclass) + END DO + END IF + END DO + + !--- Diagnose AOD for requested each mode (nrad) and wavelength (nraddiagwv): +!#ifdef HAMMOZ +! DO jclass=1, nclass +! IF(nrad(jclass)>0) THEN +! DO jwv=1, kb_diag +! IF (nraddiagwv(jwv)>0) THEN +! tau_mode(jclass,jwv)%ptr(1:kproma,:,krow)=zaer_tau_sw_vr(1:kproma,:,jwv,jclass) +! END IF +! END DO +! END IF +! END DO +!#endif + !--- Calculation of weighted properties and vertical reordering to RRTM structure: + + DO jwv=1, kb_diag !ham_ps +Nwv_sw_opt + + DO jclass=1, nclass + DO jk=1, klev +#ifdef HAMMOZ + ikl=klev+1-jk +#else + !No vertical reordering here + ikl=jk +#endif + DO jl=1, kproma + + + !real(kind=jprb),intent(inout) :: zaer_tau_diag(kbdim,klev,kb_diag,ntype_diaf) + !real(kind=jprb),intent(inout) :: zaer_ssa_diag(kbdim,klev,kb_diag,ntype_diaf) + !real(kind=jprb),intent(inout) :: zaer_asym_diag(kbdim,klev,kb_diag,ntype_diaf) + + zaer_tau_diag(jl,jk,jwv) =zaer_tau_diag(jl,jk,jwv) + & + zaer_tau_diag_vr(jl,ikl,jwv,jclass) + zaer_ssa_diag(jl,jk,jwv) =zaer_ssa_diag(jl,jk,jwv) + & + zaer_tau_diag_vr(jl,ikl,jwv,jclass)*omega_diag(jl,ikl,jwv,jclass) + zaer_asym_diag(jl,jk,jwv) =zaer_asym_diag(jl,jk,jwv) + & + zaer_tau_diag_vr(jl,ikl,jwv,jclass)*omega_diag(jl,ikl,jwv,jclass)*asym_diag(jl,ikl,jwv,jclass) + END DO + END DO + END DO + + DO jk=1, klev + DO jl=1, kproma + ! PLS - TODO: SAFE DIVISION + IF (zaer_ssa_diag(jl,jk,jwv) > THRESHOLD) THEN + zaer_asym_diag(jl,jk,jwv) = zaer_asym_diag(jl,jk,jwv)/zaer_ssa_diag(jl,jk,jwv) + zaer_ssa_diag(jl,jk,jwv) = zaer_ssa_diag(jl,jk,jwv)/ zaer_tau_diag(jl,jk,jwv) + END IF + END DO + END DO + + END DO + + END IF + END IF ! ldiag_aeropt + + + !--- 4) Set echam fields to zero for diagnostic aerosol radiative properties only: + + IF (naerorad==2) THEN + aer_tau_lw_vr(1:kproma,:,:) = 0.0_dp + aer_tau_sw_vr(1:kproma,:,:) = 0.0_dp + aer_piz_sw_vr(1:kproma,:,:) = 0.0_dp + aer_cg_sw_vr(1:kproma,:,:) = 0.0_dp + END IF + + END SUBROUTINE ham_rad + + !---------------------------------------------------------------------------------------------------------------- + + SUBROUTINE interp_refr_index(kproma, kbdim, klev, wl_in, nr_in, wl_out, nr_out) + !! Interpolates refractive index nr_in(kbdim,klev,Nwv_tot) + !! at a single wavelength wl_out, result in nr_out(kbdim,klev) + + implicit none + + ! Input + integer, intent(in) :: kproma, kbdim, klev + real(dp), intent(in) :: wl_in(Nwv_tot) ! (Nwv_tot), unsorted + real(dp), intent(in) :: nr_in(kbdim,klev,Nwv_tot) ! (kbdim,klev,Nwv_tot) + real(dp), intent(in) :: wl_out ! single query wavelength + + ! Output + real(dp), intent(out) :: nr_out(kbdim, klev) + + ! Locals + integer :: idx_low, idx_high + real(dp) :: val_low, val_high, weight + + ! ---- Sort wl_in (insertion sort) ---- + + ! nearest smaller/equal + val_low = maxval(pack(wl_in, wl_in <= wl_out)) + idx_low = maxloc(wl_in, mask = wl_in == val_low, dim=1) + + ! nearest larger/equal + val_high = minval(pack(wl_in, wl_in > wl_out)) + idx_high = maxloc(wl_in, mask = wl_in == val_high, dim=1) + + weight = (wl_out-val_low)/(val_high-val_low) + + nr_out(1:kproma,1:klev) = (1.0_dp - weight) * nr_in(1:kproma,:,idx_low)+ weight*nr_in(1:kproma,:,idx_high) + + END SUBROUTINE interp_refr_index + + !---------------------------------------------------------------------------------------------------------------- + !>>dod removed wavelength from subroutine interface + SUBROUTINE ham_rad_fitplus(kproma, kbdim, klev, & + pxx, pnr, pni, & + ktable, plut1, pfit1, & + plut2, pfit2, & + plut3, pfit3 ) + !<>dod changed arrays to 2-dimensional (removed wavelength dimension since the + ! calling subroutine now contains the loop over the wavelengths) + REAL(dp), INTENT(out) :: pfit1(kbdim,klev) + REAL(dp), INTENT(out), OPTIONAL :: pfit2(kbdim,klev) + REAL(dp), INTENT(out), OPTIONAL :: pfit3(kbdim,klev) + + REAL(dp), INTENT(in) :: pnr(kbdim,klev), pni(kbdim,klev), pxx(kbdim,klev) + + REAL(dp), INTENT(in) :: plut1(0:Nnrmax(ktable), 0:Nnimax(ktable), 0:Ndismax(ktable)) + REAL(dp), INTENT(in), OPTIONAL :: plut2(0:Nnrmax(ktable), 0:Nnimax(ktable), 0:Ndismax(ktable)) + REAL(dp), INTENT(in), OPTIONAL :: plut3(0:Nnrmax(ktable), 0:Nnimax(ktable), 0:Ndismax(ktable)) + + !--- Local variables: + + LOGICAL, PARAMETER :: laerocom_diag=.FALSE. !-- Diagnostic for values out of range + LOGICAL, PARAMETER :: loint =.FALSE. !-- Linear interpolation in look-up table + + INTEGER :: jl,jk + + REAL(dp) :: zeps + + INTEGER :: Ndis, Nnr, Nni + !>>dod deleted security check + REAL(dp) :: xx1, xx2, nr1, nr2, ni1, ni2 + REAL(dp) :: fitndisnr, fitndisp1nr, fitndisnrp1, fitndisp1nrp1, fitndis, fitndisp1 + + !--- 0) + !>>dod moved calculation of inc_nr and inc_ni to mo_ham_rad_data + !<>dod deleted: clearly untested in parallel environment, so deleted rather than modified + + !--- 1) Quick and dirty linear interpolation: + ! + IF(loint) THEN + !>>dod WARNING : NEEDS UPDATING! DOES NOT WORK! + !>>dod removed loop over wavelengths + DO jk=1, klev + DO jl=1, kproma + IF ((pxx(jl,jk)>=x0_min(ktable)) .AND. (pxx(jl,jk)<=x0_max(ktable)) .AND. & + (pnr(jl,jk)>=nr_min(ktable)) .AND. (pnr(jl,jk)<=nr_max(ktable)) .AND. & + (pni(jl,jk)>=ni_min(ktable)) .AND. (pni(jl,jk)<=ni_max(ktable)) ) THEN + + Ndis=INT( (LOG(pxx(jl,jk))-LOG(x0_min(ktable))) / & + (LOG(x0_max(ktable)) -LOG(x0_min(ktable)))*REAL(Ndismax(ktable),dp) ) + Ndis=MIN(Ndismax(ktable)-1,MAX(0,Ndis)) + + xx1=EXP(LOG(x0_min(ktable))+(LOG(x0_max(ktable))-LOG(x0_min(ktable)))*REAL(Ndis,dp)/REAL(Ndismax(ktable),dp)) + xx2=EXP(LOG(x0_min(ktable))+(LOG(x0_max(ktable))-LOG(x0_min(ktable)))*REAL(Ndis+1,dp)/REAL(Ndismax(ktable),dp)) + + Nnr=INT((pnr(jl,jk)-nr_min(ktable))/inc_nr(ktable)) + Nnr=MIN(Nnrmax(ktable)-1,MAX(0,Nnr)) + + nr1=nr_min(ktable)+REAL(Nnr,dp)*inc_nr(ktable) + nr2=nr_min(ktable)+REAL(Nnr+1,dp)*inc_nr(ktable) + + Nni=INT((LOG(pni(jl,jk))-LOG(ni_min(ktable)))/inc_ni(ktable)) + Nni=MIN(Nnimax(ktable)-1,MAX(0,Nni)) + + ni1=EXP(LOG(ni_min(ktable))+REAL(Nni,dp)*inc_ni(ktable)) + ni2=EXP(LOG(ni_min(ktable))+REAL(Nni+1,dp)*inc_ni(ktable)) + + fitndisnr =plut1(Nnr,Nni,Ndis)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr,Nni+1,Ndis)-plut1(Nnr,Nni,Ndis)) + fitndisnrp1 =plut1(Nnr+1,Nni,Ndis)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr+1,Nni+1,Ndis)-plut1(Nnr+1,Nni,Ndis)) + fitndisp1nr =plut1(Nnr,Nni,Ndis+1)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr,Nni+1,Ndis+1)-plut1(Nnr,Nni,Ndis+1)) + fitndisp1nrp1 =plut1(Nnr+1,Nni,Ndis+1)+(pni(jl,jk)-ni1)/(ni2-ni1)* & + (plut1(Nnr+1,Nni+1,Ndis+1)-plut1(Nnr+1,Nni,Ndis+1)) + fitndis =fitndisnr+(pnr(jl,jk)-nr1)/(nr2-nr1)*(fitndisnrp1-fitndisnr) + fitndisp1 =fitndisp1nr+(pnr(jl,jk)-nr1)/(nr2-nr1)*(fitndisp1nrp1-fitndisp1nr) + + pfit1(jl,jk)=fitndis+(pxx(jl,jk)-xx1)/(xx2-xx1)*(fitndisp1-fitndis) + + ELSE + + pfit1(jl,jk)=0._dp + + END IF + END DO + END DO + !<>dod removed loop over wavelengths + DO jk=1, klev + DO jl=1, kproma + IF ((pxx(jl,jk)>=x0_min(ktable)) .AND. (pxx(jl,jk)<=x0_max(ktable)) .AND. & + (pnr(jl,jk)>=nr_min(ktable)) .AND. (pnr(jl,jk)<=nr_max(ktable)) .AND. & + (pni(jl,jk)>=ni_min(ktable)) .AND. (pni(jl,jk)<=ni_max(ktable)) ) THEN + Ndis=NINT( (LOG(pxx(jl,jk))-log_x0_min(ktable)) / & + (log_x0_max(ktable) - log_x0_min(ktable))*REAL(Ndismax(ktable),dp) ) + Ndis=MIN(Ndismax(ktable)-1,MAX(0,Ndis)) + + Nnr=NINT((pnr(jl,jk)-nr_min(ktable))/inc_nr(ktable)) + Nnr=MIN(Nnrmax(ktable)-1,MAX(0,Nnr)) + + Nni=NINT((LOG(pni(jl,jk))-log_ni_min(ktable))/inc_ni(ktable)) + Nni=MIN(Nnimax(ktable)-1,MAX(0,Nni)) + + pfit1(jl,jk)=plut1(Nnr,Nni,Ndis) + + IF (PRESENT(plut2)) pfit2(jl,jk) = plut2(Nnr, Nni,Ndis) + IF (PRESENT(plut3)) pfit3(jl,jk) = plut3(Nnr, Nni,Ndis) + + ELSE + + pfit1(jl,jk)=0._dp + IF (PRESENT(plut2)) pfit2(jl,jk) = 0._dp + IF (PRESENT(plut3)) pfit3(jl,jk) = 0._dp + + END IF + END DO + END DO + !<wavenum1, wavenum2_sw=>wavenum2 + USE mo_rrtm_params, ONLY: nbndlw + USE mo_lrtm_setup, ONLY: wavenum1, wavenum2 + USE mo_ham, ONLY: nrad, nham_subm, HAM_SALSA, HAM_M7 + USE mo_read_netcdf77, ONLY: read_var_nf77_3d + USE mo_util_string, ONLY: separator +#else !OIFS + !USE YOERAD ,ONLY : nbndlw=> STRATO_CMIP6_NTB !this is really stupid solution + ! commented by Lwu + USE YOMMP0 ,ONLY : MYPROC + USE MPL_MODULE ,ONLY : MPL_BROADCAST + USE TM5M7_DATA, ONLY : TM5M7_DATADIR + USE TM5M7_OPTICS_DATA, ONLY : NASWBAND,ASWBAND,wavenum1=>ALWWN1, wavenum2=>ALWWN2 +#endif + USE mo_read_netcdf77, ONLY: read_var_nf77_3d + USE mo_exception, ONLY: finish, message, message_text, em_param, em_error, & + em_info + USE mo_species, ONLY: aero_idx + + + + + + IMPLICIT NONE + + INTEGER, INTENT(in) :: nclass ! number of aerosol bins/modes + + INTEGER, PARAMETER :: jpsw = 14 !SF new rad scheme to check + + INTEGER :: jwv, iwv, jt, ierr + + LOGICAL :: lex + + CHARACTER(len=256) :: cfile + + INTEGER, PARAMETER :: RPRC = 1 !for OIFS + INTEGER, PARAMETER :: ITAG = 98784 !for OIFS +#ifdef HAMMOZ + CALL message('','') + CALL message('',separator) + CALL message('ham_rad_initialize','Parameter settings for the aerosol radiation interaction', & + level=em_info) + CALL message('','',level=em_param) +#endif + + nhamaer = nclass + + ! construct species indices from speclist into aerosol species list + aero_ridx(:) = 0 + DO jt = 1, naerospec + aero_ridx(aero_idx(jt)) = jt + END DO + + CALL ham_rad_data_initialize + + !--- 1) Set total number of wavelengths (GCM + optional): + + !--- 2) Consistency checks: + + !IF ( Nwv_sw /= jpsw .OR. Nwv_lw /= nbndlw) THEN! stratosphere aerosol should be updated + IF ( Nwv_sw /= jpsw ) THEN + + CALL finish('ham_rad_initialize','inconsistent number of wavelengths') + + END IF + + IF (ANY(nrad(:)==1)) THEN + IF ( SIZE(cnr,1) 0 ) THEN + + tau_2d_p => tau_2d(jwv)%ptr + tau_2d_p(1:kproma,krow) = 0._dp + + DO jclass=1, nclass + IF( nrad(jclass) > 0 )THEN + + tau_p => tau_mode(jclass,jwv)%ptr + + !--- Optical thickness per mode at optional wavelengths: + + tau_p(1:kproma,:,krow) = znum(1:kproma,:,jclass)*sigma(1:kproma,:,jwv,jclass) + + !--- 2) Vertical integral summed over all modes: + + + DO jk=1, klev + DO jl=1, kproma + tau_2d_p(jl,krow)=tau_2d_p(jl,krow)+tau_p(jl,jk,krow) + END DO + END DO + + END IF + + END DO + + END IF ! nraddiagwv(jwv)>0 + + !--- 2) 2D extended diatnostics of mode radiative parameters: + + IF (nraddiagwv(jwv)>1) THEN + + IF (nraddiag>0) THEN + + !--- Integrate mode radiative properties to 2D and weight with aerosol optical depth: + + znr_2d(1:kproma)=0.0_dp + zni_2d(1:kproma)=0.0_dp + + DO jclass=1, nclass + IF( nrad(jclass) > 0 )THEN + + tau_p => tau_mode(jclass,jwv)%ptr + + zomega(1:kproma)=0.0_dp + zsigma(1:kproma)=0.0_dp + zasym(1:kproma) =0.0_dp + znr(1:kproma) =0.0_dp + zni(1:kproma) =0.0_dp + ztau(1:kproma) =0.0_dp + + DO jk=1, klev + DO jl=1, kproma + zomega(jl)=zomega(jl)+omega(jl,jk,jwv,jclass)*tau_p(jl,jk,krow) + zsigma(jl)=zsigma(jl)+sigma(jl,jk,jwv,jclass)*tau_p(jl,jk,krow) + zasym(jl) =zasym(jl) +asym(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + znr(jl) =znr(jl) +nr(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + zni(jl) =zni(jl) +ni(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + znr_2d(jl)=znr_2d(jl)+nr(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + zni_2d(jl)=zni_2d(jl)+ni(jl,jk,jwv,jclass) *tau_p(jl,jk,krow) + ztau(jl) =ztau(jl) +tau_p(jl,jk,krow) + END DO + END DO + + !>>SF #458 (replacing WHERE statements) + ll1(1:kproma) = (ztau(1:kproma) > zeps) + ztmp1(1:kproma) = MERGE(ztau(1:kproma), 1._dp, ll1(1:kproma)) !SF 1._dp is a dummy val. + + ztmp1(1:kproma) = 1._dp / ztmp1(1:kproma) + + omega_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zomega(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + sigma_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zsigma(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + asym_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zasym(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + nr_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(znr(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + ni_2d_mode(jclass,jwv)%ptr(1:kproma,krow) = & + MERGE(zni(1:kproma)*ztmp1(1:kproma), 0._dp, ll1(1:kproma)) + + !< 0 )THEN + omega_mode(jclass,jwv)%ptr(1:kproma,:,krow)=omega(1:kproma,:,jwv,jclass) + sigma_mode(jclass,jwv)%ptr(1:kproma,:,krow)=sigma(1:kproma,:,jwv,jclass) + asym_mode(jclass,jwv)%ptr(1:kproma,:,krow) =asym(1:kproma,:,jwv,jclass) + nr_mode(jclass,jwv)%ptr(1:kproma,:,krow) =nr(1:kproma,:,jwv,jclass) + ni_mode(jclass,jwv)%ptr(1:kproma,:,krow) =ni(1:kproma,:,jwv,jclass) + END IF + END DO + END IF + + !--- 4) Calculate absorption optical depth: + + abs_2d(jwv)%ptr(1:kproma,krow)=0.0_dp + + DO jclass=1, nclass + IF(nrad(jclass)>0)THEN + + abs_p => abs_mode(jclass,jwv)%ptr + tau_p => tau_mode(jclass,jwv)%ptr + + !--- For each mode: + + abs_p(1:kproma,:,krow) =(1.0_dp-omega(1:kproma,:,jwv,jclass))*tau_p(1:kproma,:,krow) + + !--- Total vertical integral: + + DO jk=1, klev + abs_2d(jwv)%ptr(1:kproma,krow)=abs_2d(jwv)%ptr(1:kproma,krow)+abs_p(1:kproma,jk,krow) + END DO + + END IF + END DO + + !--- 5) Split up according to compounds + ! (based on volume average for optical thickness, + ! additionally weighted with ni for absorption ): + + zvcomp(1:kproma,:,:,:) = 0._dp + zvsum(1:kproma,:,:) = 0._dp + znivsum(1:kproma,:,:) = 0._dp + + DO jclass=1,nclass + DO jspec=1,naerospec + + !--- Check if species jspec exists in mode jclass: + + !ham_ps: this has been included until consistent definition of aerosol water as species within HAM / M7: + ! iaerocomp of water is currently set to -1 in mo_ham_init + IF (speclist(aero_idx(jspec))%iaerocomp(jclass)>0) THEN + + jt=aerocomp( speclist(aero_idx(jspec))%iaerocomp(jclass) )%idt + + zdensity=speclist(aero_idx(jspec))%density + + IF (nrad(jclass)>0) THEN + + ! jspec = aerocomp(jn)%spid + ! ikey = aerocomp(jn)%species%iaerorad + ikey=speclist(aero_idx(jspec))%iaerorad + + !--- Sum volume of compound weighted by volume: + + DO jk=1, klev + DO jl=1, kproma + IF(pxtm1(jl,jk,jt)>zeps) THEN + + !ham_ps:redundant + ! zv=pxtm1(jl,jk,jt)*zmassfac/zdensity + zv=pxtm1(jl,jk,jt)/zdensity + + zvcomp(jl,jk,jspec,jclass)=zvcomp(jl,jk,jspec,jclass) + zv + zvsum(jl,jk,jclass) =zvsum(jl,jk,jclass) + zv + znivsum(jl,jk,jclass) =znivsum(jl,jk,jclass) + zv * cni(jwv,ikey) + + END IF + END DO + END DO + END IF + + END IF + + END DO + END DO + + ! add aerosol water + + DO jclass=1,nclass + IF (nrad(jclass) > 0 .AND. sizeclass(jclass)%lsoluble) THEN + jt = aerowater(jclass)%idt + ikey = speclist(id_wat)%iaerorad + zdensity = speclist(id_wat)%density + + DO jk=1, klev + DO jl=1, kproma + zv=pxtm1(jl,jk,jt)/zdensity + + zvcomp(jl,jk,aero_ridx(id_wat),jclass)=zvcomp(jl,jk,aero_ridx(id_wat),jclass) + zv + zvsum(jl,jk,jclass) =zvsum(jl,jk,jclass) + zv + znivsum(jl,jk,jclass) =znivsum(jl,jk,jclass) + zv * cni(jwv,ikey) + END DO + END DO + END IF + END DO + + DO jspec=1,naerospec + + ztaucomp(1:kproma) =0._dp + zabscomp(1:kproma) =0._dp + !ham_ps:why m7 specific? + !ikey = speclist(subm_aerospec(jspec))%iaerorad + ikey=speclist(aero_idx(jspec))%iaerorad + + !--- Weighted averaging and vertical integration: + + DO jclass=1, nclass + IF (nrad(jclass) > 0) THEN + + tau_p => tau_mode(jclass,jwv)%ptr + abs_p => abs_mode(jclass,jwv)%ptr + + DO jk=1, klev + DO jl=1, kproma + IF (zvsum(jl,jk,jclass)>zeps) THEN + ztaucomp(jl)=ztaucomp(jl) + & + tau_p(jl,jk,krow)*zvcomp(jl,jk,jspec,jclass)/zvsum(jl,jk,jclass) + zabscomp(jl)=zabscomp(jl) + & + abs_p(jl,jk,krow)*zvcomp(jl,jk,jspec,jclass)*cni(jwv,ikey) / & + znivsum(jl,jk,jclass) + END IF + END DO + END DO + + END IF + END DO !jclass + + !--- Store in output streams: + + tau_comp(jspec,jwv)%ptr(1:kproma,krow)=ztaucomp(1:kproma) + abs_comp(jspec,jwv)%ptr(1:kproma,krow)=zabscomp(1:kproma) + + END DO !jspec + + END IF !nraddiagwv(jwv)>1 + + END DO !jwv + + !--- 5) Calculate Angstroem parameter between two wavelengths: + + IF (nradang(1)/=0 .AND. nradang(2)/=0) THEN + + !>>SF #458 (replacing WHERE statements) + ll1(1:kproma) = (tau_2d(nradang(1))%ptr(1:kproma,krow)>zeps) & + .AND. (tau_2d(nradang(2))%ptr(1:kproma,krow)>zeps) + + ztmp1(1:kproma) = MERGE(tau_2d(nradang(1))%ptr(1:kproma,krow), 1._dp, ll1(1:kproma)) !SF 1. is dummy + ztmp2(1:kproma) = MERGE(tau_2d(nradang(2))%ptr(1:kproma,krow), 1._dp, ll1(1:kproma)) !SF 1. is dummy + + ang(1:kproma,krow) = MERGE( & + LOG(ztmp2(1:kproma)/ztmp1(1:kproma)) / LOG(lambda(nradang(1))/lambda(nradang(2))), & + ang(1:kproma,krow), & + ll1(1:kproma)) + + !< +!! \filename +!! mo_ham_rad_data.f90 +!! +!! \brief +!! mo_ham_rad_data holds the parameters and routines for the calculation of the +!! optical parameters for the aerosol distribution simulated by the ECHAM/HAM aerosol module. +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# P. Stier (MPI-Met) - original code (2003-05-08) +!! -# P. Stier (Caltech) (2006-02) +!! -# S. Rast (MPI-Met) - adaption to echam5.3.2 (2007-03) +!! -# D. O'Donnell (MPI-Met) - changed to flexible number of species and added SOA (XXXX) +!! -# M.G. Schultz (FZ Juelich) - added irad... parameters and removed pseudo-flexibility +!! (this module requires manual editing anyhow if number of species is changed) (XXXX) +!! -# P. Stier (Uni Oxford) - adaptation to RRTM-SW (2010-02) +!! -# H. Kokkola (FMI) - modified to include SALSA (2013-06) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! - M. Hess, P. Koepke, and I. Schult (1998): Optical Properties of Aerosols and clouds: +!! The software package OPAC, Bull. Am. Met. Soc., 79, 831-844. +!! - Nilsson, B. (1979): Meteorological influence on aerosol extinction in the 0.2-40 um +!! wavelength range, Appl. Opt. 18, 3457-3473. +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_rad_data + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + PRIVATE + + !---public data + PUBLIC :: iradso4, iradbc, iradoc, iradss, iraddu, iradwat, iradsoa + + PUBLIC :: Nwv_sw, Nwv_sw_opt, Nwv_lw, & + Nwv_tot, Nwv_swlw, Nwv_sw_tot, & + cnr, cni, & + log_x0_min, log_x0_max, & + log_ni_min, & + x0_min, x0_max, & + nnrmax, nnimax, ndismax, & + nr_min, nr_max, ni_min, ni_max, & + inc_nr, inc_ni, & + lambda, lambda_sw_opt, & + nradang + + + !---public member functions + + PUBLIC :: ham_rad_data_initialize, nraddiagwv + + !--- species indices for radiation tables + + INTEGER, PARAMETER :: iradso4 = 1 + INTEGER, PARAMETER :: iradbc = 2 + INTEGER, PARAMETER :: iradoc = 3 + INTEGER, PARAMETER :: iradss = 4 + INTEGER, PARAMETER :: iraddu = 5 + INTEGER, PARAMETER :: iradwat = 6 + INTEGER, PARAMETER :: iradsoa = 7 + + INTEGER, PARAMETER :: naeroradspec = 7 ! for dimensioning of tables + + !--- Parameter space for the 4 lookup tables: + ! + ! Table 1 : SW fine std. dev: sigma_fine (1.59) + ! 2 : SW coarse sigma_coarse (2.00) + ! 3 : LW fine sigma_fine (1.59) + ! 4 : LW coarse sigma_coarse (2.00) + + INTEGER, PARAMETER :: Ndismax(4)=(/ 100, 100, 100, 100 /) + INTEGER, PARAMETER :: Nnrmax(4) =(/ 100, 100, 100, 100 /) + INTEGER, PARAMETER :: Nnimax(4) =(/ 200, 200, 200, 200 /) + + REAL(dp), PARAMETER :: nr_min(4)=(/ 1.33_dp, 1.33_dp, 1.0_dp, 1.0_dp /) !--min ref. ind. real + REAL(dp), PARAMETER :: nr_max(4)=(/ 2.00_dp, 2.00_dp, 3.0_dp, 3.0_dp /) !--max ref. ind. real + REAL(dp), PARAMETER :: ni_min(4)=(/ 1.E-9_dp, 1.E-9_dp, 1.E-9_dp, 1.E-9_dp /) !--min ref. ind. imag. + REAL(dp), PARAMETER :: ni_max(4)=(/ 1.00_dp, 1.00_dp, 2.0_dp, 2.0_dp /) !--max ref. ind. imag. + + REAL(dp) :: x0_min(4) + REAL(dp) :: x0_max(4) + REAL(dp) :: log_x0_min(4) + REAL(dp) :: log_x0_max(4) + REAL(dp) :: log_nr_min(4) + REAL(dp) :: log_nr_max(4) + REAL(dp) :: log_ni_min(4) + REAL(dp) :: log_ni_max(4) + + REAL(dp) :: inc_nr(4) + REAL(dp) :: inc_ni(4) + + !--- Indices and dimensions: + + INTEGER, PARAMETER :: Nwv_sw = 14, & !-- RRTM-SW GCM wavebands + Nwv_sw_opt = 2, & !--Optional SW wavebands (550nm+865nm) +! Nwv_sw_opt = 3, & !--Optional SW wavebands (550nm+865nm+440nm) + Nwv_sw_tot = Nwv_sw+Nwv_sw_opt, & + Nwv_lw = 16, & !--RRTM-LW GCM wavebands + Nwv_swlw = Nwv_sw+Nwv_lw, & + Nwv_tot = Nwv_sw+Nwv_sw_opt+Nwv_lw + + REAL(dp), PARAMETER :: lambda_sw_opt(2)=(/ 0.550E-6_dp, 0.865E-6_dp /) +! REAL(dp), PARAMETER :: lambda_sw_opt(3)=(/ 0.550E-6_dp, 0.865E-6_dp , 0.440E-6_dp/) + + !--- Define mask for output of wavelengths: + ! + ! nraddiagwv(jwv)=0 Off + ! =1 AOD + ! =2 AOD+AAOD + ! =3 AOD+AAOD+... + + INTEGER :: nraddiagwv(Nwv_tot) + + INTEGER :: nradang(2) + + !--- 1) Mid-band wavelengths: + ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] + + REAL(dp) :: lambda(1:Nwv_tot) + + +! REAL(dp), PARAMETER :: lambda(Nwv_tot) = (/ 3.46E-6_dp, 2.79E-6_dp, 2.33E-6_dp, 2.05E-6_dp, 1.78E-6_dp, 1.46E-6_dp, 1.27E-6_dp, 1.01E-6_dp, 0.70E-6_dp, 0.53E-6_dp, 0.39E-6_dp, 0.30E-6_dp, 0.23E-6_dp, 8.02E-6_dp, 0.340E-6_dp, 0.355E-6_dp, 0.380E-6_dp, 0.400E-6_dp, 0.440E-6_dp, 0.469E-6_dp, 0.500E-6_dp, 0.532E-6_dp, 0.555E-6_dp, 0.645E-6_dp, 0.670E-6_dp, 0.800E-6_dp, 0.858E-6_dp, 0.865E-6_dp, 0.1020E-6_dp, 0.1064E-6_dp /) + + + + !--- 2) LW refractive indices: + + REAL(dp) :: cnr(Nwv_tot, naeroradspec), & ! real part of refractive index + cni(Nwv_tot, naeroradspec) ! imaginary part of refractive index + + +CONTAINS + + SUBROUTINE ham_rad_data_initialize + + !---inherited types, data and functions + ! - + + USE mo_ham, ONLY: naerorad, nrad, nham_subm, HAM_M7, HAM_SALSA + + IMPLICIT NONE + + !---subroutine interface + ! - + + !---local variables + INTEGER :: itable + + !--- Initialize wavelength settings + + + !--- Default output masks for wavelengths, currently only for the optional wavelengths: + !ham_ps:radiation This could/should become namelist controlled + + IF (naerorad>0) THEN + + nraddiagwv(1:NWv_tot)=0 !--- Default: no diagnostic +#ifdef HAMMOZ + nraddiagwv(Nwv_sw+1:Nwv_sw+Nwv_sw_opt)=1 ! AOD only for all optional wavelengths + nraddiagwv(Nwv_sw+1)=2 ! Additional diagnostics for 550nm +#endif + IF (ANY(nrad(:)==2) .OR. ANY(nrad(:)==3)) THEN + nraddiagwv(Nwv_sw+Nwv_sw_opt+1)=1 ! AOD for first LW band + END IF + + !--- Define wavelengths for Angstroem diagnostics (currently first two optional wavelengths): +#ifdef HAMMOZ + nradang(1)=Nwv_sw+1 + nradang(2)=nradang(1)+1 +#endif + END IF + + + + !--- 1.0) SW Refractive Indices: + + ! Note the RRTM-SW specific band ordering: + ! 3.46, 2.79, 2.33, 2.05, 1.78, 1.46, 1.27, 1.01, 0.70, 0.53, 0.39, 0.30, 0.23, 8.02 [um] + + !--- Sulfate (Palmer & Williams, Appl.Opt., 1975; provided by Stefan Kinne): + + cnr(1:Nwv_sw,iradso4) = & + (/ 1.361_dp, 1.295_dp, 1.364_dp, 1.382_dp, 1.393_dp, 1.406_dp, & + 1.413_dp, 1.422_dp, 1.427_dp, 1.432_dp, 1.445_dp, 1.450_dp, & + 1.450_dp, 1.400_dp /) + + cni(1:Nwv_sw,iradso4) = & + (/ 1.400E-01_dp, 5.500E-02_dp, 2.100E-03_dp, 1.300E-03_dp, 5.100E-04_dp, 9.000E-05_dp, & + 7.900E-06_dp, 1.300E-06_dp, 5.200E-08_dp, 1.000E-09_dp, 1.000E-09_dp, 1.000E-09_dp, & + 1.000E-09_dp, 2.600E-01_dp /) + + !--- Optional Wavelengths at 550 and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradso4) = & + (/ 1.432_dp, 1.424_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradso4) = & + (/ 1.000E-09_dp, 7.384E-07_dp /) + + !--- Black Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): + ! + ! - at 550 nm: n=1.85-0.71i + ! - wavelength dependency scaled from OPAC (Hess et al., 1998) + + cnr(1:Nwv_sw,iradbc) = & + (/1.984_dp, 1.936_dp, 1.917_dp, 1.905_dp, 1.894_dp, 1.869_dp, & + 1.861_dp, 1.861_dp, 1.850_dp, 1.850_dp, 1.839_dp, 1.839_dp, & + 1.713_dp, 2.245_dp /) + + cni(1:Nwv_sw,iradbc) = & + (/ 8.975E-01_dp, 8.510E-01_dp, 8.120E-01_dp, 7.939E-01_dp, 7.765E-01_dp, 7.397E-01_dp, & + 7.274E-01_dp, 7.106E-01_dp, 6.939E-01_dp, 7.213E-01_dp, 7.294E-01_dp, 7.584E-01_dp, & + 7.261E-01_dp, 1.088E+00_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradbc) = & + (/ 1.85_dp, 1.85_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradbc) = & + (/ 7.10E-01_dp, 6.99E-01_dp /) + + !--- Organic Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): + ! + ! - wavelength dependency scaled from OPAC (Hess et al., 1998) + + cnr(1:Nwv_sw,iradoc) = & + (/ 1.530_dp, 1.510_dp, 1.510_dp, 1.420_dp, 1.464_dp, 1.520_dp, & + 1.420_dp, 1.420_dp, 1.530_dp, 1.530_dp, 1.530_dp, 1.443_dp, & + 1.530_dp, 1.124_dp /) + + cni(1:Nwv_sw,iradoc) = & + (/ 2.75E-02_dp, 7.33E-03_dp, 7.33E-03_dp, 4.58E-03_dp, 6.42E-03_dp, 1.43E-02_dp, & + 1.77E-02_dp, 2.01E-02_dp, 1.50E-02_dp, 7.70E-03_dp, 9.75E-03_dp, 1.63E-02_dp, & + 5.27E-03_dp, 7.24E-02_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradoc) = & + (/ 1.53_dp, 1.52_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradoc) = & + (/ 5.50E-03_dp, 1.10E-02_dp /) +!#endif + !--- Sea Salt (Nilsson, 1979): + + cnr(1:Nwv_sw,iradss) = & + (/ 1.480_dp, 1.400_dp, 1.440_dp, 1.450_dp, 1.450_dp, 1.460_dp, & + 1.470_dp, 1.470_dp, 1.480_dp, 1.490_dp, 1.500_dp, 1.510_dp, & + 1.510_dp, 1.400_dp /) + + cni(1:Nwv_sw,iradss) = & + (/ 1.300E-02_dp, 8.000E-03_dp, 2.500E-03_dp, 1.500E-03_dp, 1.000E-03_dp, 5.500E-04_dp, & + 3.300E-04_dp, 1.000E-04_dp, 1.000E-07_dp, 1.000E-08_dp, 2.000E-08_dp, 1.000E-06_dp, & + 1.000E-05_dp, 1.400E-02_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradss) = & + (/ 1.450_dp, 1.470_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradss) = & + (/ 1.000E-08_dp, 1.000E-8_dp /) + + !--- Dust (provided by Stefan Kinne, MPI-MET: + ! mainly based on Sokolik & Toon, JGR, 1999) + ! imaginary parts in the visible modified according to AERONET statistics + ! much less absorption in the VIS (mainly based on Kinne et.al, JGR, 2003): + + cnr(1:Nwv_sw,iraddu) = & + (/ 1.460_dp, 1.460_dp, 1.460_dp, 1.450_dp, 1.450_dp, 1.450_dp, & + 1.450_dp, 1.450_dp, 1.450_dp, 1.450_dp, 1.450_dp, 1.450_dp, & + 1.450_dp, 1.170_dp /) + + cni(1:Nwv_sw,iraddu) = & + (/ 1.180E-02_dp, 6.000E-03_dp, 2.500E-03_dp, 1.500E-03_dp, 1.000E-03_dp, 8.000E-04_dp, & + 6.000E-04_dp, 7.500E-04_dp, 9.500E-04_dp, 1.000E-03_dp, 2.500E-03_dp, 2.000E-02_dp, & + 2.500E-02_dp, 1.000E-01_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iraddu) = & + (/ 1.450_dp, 1.450_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iraddu) = & + (/ 1.000E-03_dp, 8.400E-4_dp /) + + !--- Water (provided by Stefan Kinne interpolated with code by Andy Lacis (NASA-GISS): + ! (Hale and Querry [1973] for 0.2 to 0.7 mm, + ! Palmer and Williams [1974] for 0.7 to 2.0 mm) + + cnr(1:Nwv_sw,iradwat) = & + (/ 1.423_dp, 1.244_dp, 1.283_dp, 1.300_dp, 1.312_dp, 1.319_dp, & + 1.324_dp, 1.328_dp, 1.331_dp, 1.335_dp, 1.341_dp, 1.350_dp, & + 1.377_dp, 1.300_dp /) + + cni(1:Nwv_sw,iradwat) = & + (/ 5.000E-02_dp, 1.300E-01_dp, 6.500E-04_dp, 6.700E-04_dp, 1.200E-04_dp, 1.100E-04_dp, & + 1.200E-05_dp, 2.100E-06_dp, 6.800E-08_dp, 2.800E-09_dp, 3.900E-09_dp, 1.700E-08_dp, & + 6.400E-08_dp, 4.000E-02_dp /) + + !--- Optional Wavelengths at 550nm and 865nm: + + cnr(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradwat) = & + (/ 1.335_dp, 1.329_dp /) + + cni(Nwv_sw+1:Nwv_sw+Nwv_sw_opt,iradwat) = & + (/ 2.800E-09, 1.186E-06 /) + + + !--- 2) LW refractive indices: + ! Note that the RRTM spectral bands are ordered with increasing wavenumber, + ! i.e. decreasing wavelengths. + + !--- Sulfate (Ammonium Sulfate from Toon and Pollack, 1976) + ! Interpolated with subroutine of Andy Lacis (NASA-GISS) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradso4) = & + (/ 1.889_dp, 1.588_dp, 1.804_dp, 1.537_dp, 1.709_dp, 1.879_dp, & + 2.469_dp, 0.685_dp, 1.427_dp, 0.956_dp, 1.336_dp, 1.450_dp, & + 1.489_dp, 1.512_dp, 1.541_dp, 1.602_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradso4) = & + (/ 0.967E-01_dp, 0.380E-01_dp, 0.287E-01_dp, 0.225E-01_dp, 0.200E-01_dp, 0.396E-01_dp, & + 0.269E+00_dp, 0.111E+01_dp, 0.705E-01_dp, 0.678E+00_dp, 0.143E-01_dp, 0.664E-02_dp, & + 0.657E-02_dp, 0.944E-02_dp, 0.148E-01_dp, 0.156E+00_dp /) + + !--- Black Carbon (Medium-absorbing values from Bond & Bergstrom, 2006): + ! + ! - at 550 nm: n=1.85-0.71i + ! - wavelength dependency scaled from OPAC (Hess et al., 1998) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradbc) = & + (/ 2.84_dp, 2.63_dp, 2.53_dp, 2.46_dp, 2.42_dp, 2.36_dp, & + 2.33_dp, 2.30_dp, 2.23_dp, 2.17_dp, 2.14_dp, 2.09_dp, & + 2.06_dp, 2.04_dp, 2.03_dp, 1.98_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradbc) = & + (/ 1.61E+00_dp, 1.42E+00_dp, 1.33E+00_dp, 1.28E+00_dp, 1.23E+00_dp, 1.18E+00_dp, & + 1.16E+00_dp, 1.14E+00_dp, 1.08E+00_dp, 1.04E+00_dp, 1.00E+00_dp, 9.73E-01_dp, & + 9.56E-01_dp, 9.46E-01_dp, 9.37E-01_dp, 8.91E-01_dp /) + + !--- Organic Carbon: + ! OPAC WaSo Category (M. Hess, P. Koepke, and I. Schult, 1998): + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradoc) = & + (/ 1.86_dp, 1.95_dp, 2.02_dp, 1.43_dp, 1.61_dp, 1.71_dp, & + 1.81_dp, 2.64_dp, 1.23_dp, 1.42_dp, 1.42_dp, 1.45_dp, & + 1.46_dp, 1.46_dp, 1.46_dp, 1.44_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradoc) = & + (/ 4.58E-01_dp, 2.35E-01_dp, 1.86E-01_dp, 1.82E-01_dp, 5.31E-02_dp, 4.52E-02_dp, & + 4.54E-02_dp, 3.76E-01_dp, 6.04E-02_dp, 5.30E-02_dp, 2.29E-02_dp, 1.27E-02_dp, & + 1.17E-02_dp, 9.28E-03_dp, 4.88E-03_dp, 5.95E-03_dp /) + + !--- Sea Salt: + ! (Shettle and Fenn, 1979; Nilsson, 1979; both based on Volz, 1972 measurements) + ! Inter with subroutine of Andy Lacis (NASA-GISS) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradss) = & + (/ 1.668_dp, 1.749_dp, 1.763_dp, 1.447_dp, 1.408_dp, 1.485_dp, & + 1.563_dp, 1.638_dp, 1.401_dp, 1.450_dp, 1.505_dp, 1.459_dp, & + 1.483_dp, 1.488_dp, 1.478_dp, 1.484_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradss) = & + (/ 0.981E+00_dp, 0.193E+00_dp, 0.111E+00_dp, 0.344E-01_dp, 0.192E-01_dp, 0.140E-01_dp, & + 0.179E-01_dp, 0.293E-01_dp, 0.138E-01_dp, 0.543E-02_dp, 0.180E-01_dp, 0.288E-02_dp, & + 0.251E-02_dp, 0.246E-02_dp, 0.175E-02_dp, 0.206E-02_dp /) + + !--- Dust (Irina Sokolik, personal communication, 2006): + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iraddu) = & + (/ 2.552_dp, 2.552_dp, 1.865_dp, 1.518_dp, 1.697_dp, 1.816_dp, & + 2.739_dp, 1.613_dp, 1.248_dp, 1.439_dp, 1.423_dp, 1.526_dp, & + 1.502_dp, 1.487_dp, 1.480_dp, 1.468_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iraddu) = & + (/ 0.7412_dp, 0.7412_dp, 0.5456_dp, 0.2309_dp, 0.1885_dp, 0.2993_dp, & + 0.7829_dp, 0.4393_dp, 0.1050_dp, 0.0976_dp, 0.0540_dp, 0.0228_dp, & + 0.0092_dp, 0.0053_dp, 0.0044_dp, 0.0101_dp /) + + !--- Water: + ! (Downing and Williams, 1975) + ! Interpolated with subroutine by Andy Lacis (NASA-GISS) + + cnr(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradwat) = & + (/ 1.689_dp, 1.524_dp, 1.401_dp, 1.283_dp, 1.171_dp, 1.149_dp, & + 1.230_dp, 1.264_dp, 1.295_dp, 1.314_dp, 1.312_dp, 1.316_dp, & + 1.327_dp, 1.333_dp, 1.348_dp, 1.416_dp /) + + cni(Nwv_sw+Nwv_sw_opt+1:Nwv_tot,iradwat) = & + (/ 0.618E+00_dp, 0.392E+00_dp, 0.428E+00_dp, 0.395E+00_dp, 0.317E+00_dp, 0.107E+00_dp, & + 0.481E-01_dp, 0.392E-01_dp, 0.347E-01_dp, 0.348E-01_dp, 0.132E+00_dp, 0.106E-01_dp, & + 0.151E-01_dp, 0.881E-02_dp, 0.483E-02_dp, 0.169E-01_dp /) + + !--- Secondary Organic Carbons: + ! Assume values of primary organics, i.e. OPAC WaSo Category (M. Hess, P. Koepke, and I. Schult, 1998): + + cni(:,iradsoa) = cni(:,iradoc) + cnr(:,iradsoa) = cnr(:,iradoc) + + !---calculations for optimisation of reading of lookup tables + + SELECT CASE(nham_subm) + + CASE(HAM_M7) + + x0_min=(/ 0.001_dp, 0.4_dp, 5.E-6_dp, 0.0015_dp /) !--min Mie parameter + x0_max=(/ 25.0_dp, 40.0_dp, 3._dp, 4._dp /) !--max Mie parameter + + CASE(HAM_SALSA) + + x0_min=(/ 0.001_dp, 0.16_dp, 5.E-6_dp, 0.0015_dp /) !--min Mie parameter + + x0_max=(/ 25.0_dp, 210.0_dp, 3._dp, 17._dp /) !--max Mie parameter + + END SELECT + + DO itable=1,4 + + log_x0_min(itable) = LOG(x0_min(itable)) + log_x0_max(itable) = LOG(x0_max(itable)) + + log_nr_min(itable) = LOG(nr_min(itable)) + log_nr_max(itable) = LOG(nr_max(itable)) + + log_ni_min(itable) = LOG(ni_min(itable)) + log_ni_max(itable) = LOG(ni_max(itable)) + + !--- Real part: + inc_nr(itable)=(nr_max(itable)-nr_min(itable))/REAL(Nnrmax(itable),dp) + + !--- Imaginary part in log-space: + inc_ni(itable)=(log_ni_max(itable)-log_ni_min(itable))/REAL(Nnimax(itable),dp) + + END DO + + + END SUBROUTINE ham_rad_data_initialize + +END MODULE mo_ham_rad_data diff --git a/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 new file mode 100644 index 00000000..0fb29e48 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_sedimentation.F90 @@ -0,0 +1,323 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_sedimentation.f90 +!! +!! \brief +!! Calculate sedimentation rates for aerosol tracers in the HAM model +!! +!! \author Michael Schulz (LSCE) +!! \author P. Stier (MPI-Met) +!! +!! \responsible_coder +!! [ John Doe, john.doe@blabla.com -Compulsory- ] +!! +!! \revision_history +!! -# Michael Schulz (LSCE) - original code (2001-02-05) +!! -# P. Stier (MPI-Met) - adapted to ECHAM5-HAM (2002) +!! -# Martin grav. Schultz (FZ Juelich) - adapted to ECHAM6-HAMMOZ (integrated in modular structure) (2009) +!! +!! \limitations +!! None +!! +!! \details +!! This module is derived from the former xt_sedimentation routine (ECHAM5-HAM). +!! +!! \bibliographic_references +!! - Seinfeld &Pandis (1998) +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_sedimentation + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: ham_prep_sedi, ham_sedimentation + + + CONTAINS + +!! The subroutine ham_prep_sedi calculates tracer-independent physical parameters +!! needed in the ham_sedimentation routine + + SUBROUTINE ham_prep_sedi(kproma, kbdim, klev, & + pt, pq, pap, paph, & + ptempc, & + pvis, plair, prho, & + pdpg, pdz ) + + USE mo_physical_constants, ONLY: rd, vtmpc1, grav, tmelt + + !--- parameters + INTEGER, INTENT(in) :: kproma, kbdim, klev ! indices + REAL(dp), INTENT(in) :: pt(kbdim, klev), & ! temperature + pq(kbdim, klev), & ! specific humidity + pap(kbdim, klev), & ! full level pressure + paph(kbdim, klev+1) ! half level pressure + REAL(dp), INTENT(out) :: ptempc(kbdim, klev), & ! temp. above melting + pvis(kbdim, klev), & ! air viscosity + plair(kbdim, klev), & ! mean free path length + prho(kbdim, klev), & ! air density + pdpg(kbdim, klev), & ! layer thickness (pressure) + pdz(kbdim, klev) ! layer thickness (length) + + !--- local variables + INTEGER :: jk + REAL(dp) :: ztmp1(kbdim,klev) !SF #458 + + !--- code + + !--- Temperature at t=t+1: + ptempc(1:kproma,:) = pt(1:kproma,:) - tmelt + + !--- Dynamic viscosity of air after Prup.Klett: pvis [Pa s] + !>>SF #458 (replacing where statements) + ztmp1(1:kproma,:) = 1.718_dp + 0.0049_dp*ptempc(1:kproma,:) + + pvis(1:kproma,:) = MERGE( & + ztmp1(1:kproma,:)*1.E-5_dp, & + (ztmp1(1:kproma,:) - 1.2E-05_dp*(ptempc(1:kproma,:)**2))*1.E-5_dp, & + (ptempc(1:kproma,:) >= 0._dp)) + !<eehol: add variables for implicit sedimentation solver + REAL(dp) :: zsedflx(kbdim), & ! sediflux per layer xx m-2 + zaeronwm1(kbdim), & ! next time step mixing ratio needed for next layer + zsolaers, & ! source term from above layer + zsolaerb, & ! sink to next layer + zgdp, & ! 1 per layer thickness (pressure) + zdtgdp, & ! time step len times 1 per layer thickness (pressure) + zaeronw ! implicit solver variable + !<--eehol + + !--- code + !--- initialize output + pvsedi(:,:) = 0._dp + psediflux(:,:) = 0._dp + psedifluxsurf(:) = 0._dp + + !--- lookup mode of the tracer and get wet radius and density + imod=trlist%ti(kt)%mode +#ifdef HAMMOZ + rwet_p => rwet(imod)%ptr + densaer_p => densaer(imod)%ptr +#endif + !--- Select diameter and limit it to maximal 50 um: + ! If tracer is: + ! aerosol number mixing ratio: use number median radius + ! aerosol mass mixing ratio: use mass median radius + + !TB + ! With SALSA bins are considered monodisperse so no need for cmedr2mmedr + + SELECT CASE(nham_subm) + CASE(HAM_M7) + IF (trlist%ti(kt)%nphase==AEROSOLNUMBER) THEN +#ifdef HAMMOZ + zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*2._dp , 50.E-6_dp) +#else + zmd(1:kproma,:)=MIN( prwetm7(1:kproma,:,imod)*2._dp , 50.E-6_dp) +#endif + ELSE IF (trlist%ti(kt)%nphase==AEROSOLMASS) THEN +#ifdef HAMMOZ + zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*cmedr2mmedr(imod)*2._dp , 50.E-6_dp) +#else + zmd(1:kproma,:)=MIN( prwetm7(1:kproma,:,imod)*cmedr2mmedr(imod)*2._dp , 50.E-6_dp) +#endif + ELSE + WRITE(message_text,'(a)') 'unexpected tracer phase' + CALL message('ham_sedimentation', message_text, level=em_error) + END IF + + !--- Slinn correction for sedimentation velocity of a + ! size distribution with a given sigma: + slinnfac=sigma(imod)**(2._dp*sigmaln(imod)) +#ifdef SALSA + CASE(HAM_SALSA) +#ifdef HAMMOZ + zmd(1:kproma,:)=MIN( rwet_p(1:kproma,:,krow)*2._dp , 50.E-6_dp) +#else + zmd(1:kproma,:)=MIN( prwetm7(1:kproma,:,imod)*2._dp , 50.E-6_dp) +#endif + !TB + !slinnfac not needed + slinnfac=1.0_dp +#endif + END SELECT + +!>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (zmd(1:kproma,:) > 0._dp) + + ztmp1(1:kproma,:) = MERGE(zmd(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF protection against division by 0 further below + ! 1._dp is a dummy value + !--- Stokes-velocity (S&P, Equation 8.42): +#ifdef HAMMOZ + ztmp2(1:kproma,:) = 2._dp/9._dp*(densaer_p(1:kproma,:,krow)-prho(1:kproma,:)) & + * grav/pvis(1:kproma,:)*(ztmp1(1:kproma,:)/2._dp)**2._dp +#else + ztmp2(1:kproma,:) = 2._dp/9._dp*(pdensaerm7(1:kproma,:,imod)-prho(1:kproma,:)) & + * grav/pvis(1:kproma,:)*(ztmp1(1:kproma,:)/2._dp)**2._dp +#endif + !--- With Cunnigham slip- flow correction (S&P, Equation 8.34): + SELECT CASE(nham_subm) + CASE(HAM_M7) + ztmp2(1:kproma,:) = ztmp2(1:kproma,:) & +!>>DN #328 + * (slinnfac + & + 1.246_dp*2._dp*plair(1:kproma,:) & + /ztmp1(1:kproma,:)*exp((0.5_dp*sigmaln(imod)**2._dp))) + !<eehol: adding implicit solver for sedimentation + !init variables carried out from one layer to the next + zsedflx(1:kproma) = 0.0_dp + zaeronwm1(1:kproma) = 0.0_dp + DO jk=1,klev + DO jl=1,kproma + zsolaers = 0.0_dp + zsolaerb = 0.0_dp + zgdp = 1/(pdpg(jl,jk)) + zdtgdp = time_step_len*zgdp + + !source from above + IF (jk > 1) THEN + zsedflx(jl) = zsedflx(jl)*zaeronwm1(jl) + zsolaers = zsolaers+zsedflx(jl)*zdtgdp + END IF + + !sink to next layer + zsedflx(jl) = pvsedi(jl,jk)*prho(jl,jk) + zsolaerb = zsolaerb+zdtgdp*zsedflx(jl) + + !implicit solver + zaeronw = (pxtp1(jl,jk)+zsolaers)/(1.0_dp+zsolaerb) + + !new time-step aero variable needed for next layer + zaeronwm1(jl) = zaeronw + + !tendency in unit of xx kg-1 s-1 + pxtte(jl,jk) = pxtte(jl,jk)+((zaeronw-pxtp1(jl,jk))/time_step_len) + + END DO + END DO + + DO jl=1,kproma + psedifluxsurf(jl) = prho(jl,klev)*zaeronwm1(jl)*pvsedi(jl,klev) + END DO + !--- Re-convert sedimentatation flux and add it to the mixing ratio tendency + ! of the box below (conversion with zdpg of the box below): + !pxtte(1:kproma,2:klev)=pxtte(1:kproma,2:klev) & + ! + (psediflux(1:kproma,1:(klev-1))/pdpg(1:kproma,2:klev)) + + END SUBROUTINE ham_sedimentation + +END MODULE mo_ham_sedimentation + diff --git a/ifs-source/arpifs/m7/module/mo_ham_soa.F90 b/ifs-source/arpifs/m7/module/mo_ham_soa.F90 new file mode 100644 index 00000000..981ade4a --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_soa.F90 @@ -0,0 +1,783 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_soa.f90 +!! +!! \brief +!! This module contains HAM routines related to the handling of secondary organic aerosols. +!! +!! \author Declan O'Donnell (MPI-M) +!! +!! \responsible_coder +!! Declan O'Donnell, declan.Odonnell@fmi.fi +!! +!! \revision_history +!! -# Declan O'Donnell (MPI-Met) - original code (YYYY) +!! -# Kai Zhang (MPI-Met) - rewrite species registeration part, change longname +!! and shortname to avoid duplicate longnames in species list (2009-08) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_soa + + !--- inherited types, data and functions + USE mo_kind, ONLY: dp + USE mo_ham, ONLY: nsoaspec, new_aerocomp + USE mo_tracdef, ONLY: ON, OFF, itrnone, itrdiag, itrprog, itrpresc + USE mo_ham_species, ONLY: id_oc + !USE mo_decomposition,ONLY: lc => local_decomposition + USE mo_species, ONLY: t_species, new_species + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL, ON, OFF + + IMPLICIT NONE + + !---public member functions +#ifdef HAMMOZ + PUBLIC :: soa_species + !>>dod deleted start_map_soaspec <>dod + PUBLIC :: set_soa_tracer_attr + !<>dod deleted dead code (t_soa_rxn) + !<< dod + TYPE, PUBLIC :: t_soa_prop ! SOA properties + LOGICAL :: lvolatile ! Volatile species T/F + REAL(dp) :: Kp ! 2-product model parameter: + ! partitioning coefficient + REAL(dp) :: tref ! 2-product model parameter: + ! temperature at which Kp was derived + REAL(dp) :: dH ! 2-product model parameter: + ! Enthalpy of vaporisation + INTEGER :: spid_tot ! Species id, prognostic species (gas+aerosol total mass) + INTEGER :: spid_soa ! Species id, diagnostic species (gas or aerosol) + END TYPE t_soa_prop + +!!mgs!! removed obsolete t_soa_species and replaced with soagas_idx + + !---public module data + + !---maximum number of SOA species + INTEGER, PARAMETER, PUBLIC :: nmaxsoa = 7 + + !---species identities for SOA precursors, gases and aerosols ### now in mo_soa_species + ! soa precursors + !>>csld #404 + !define new monoterpene species for use of MEGAN2.1 + INTEGER, PUBLIC :: id_apin, id_tbeta, id_bpin, id_lim, id_sab, id_myrc, id_car + !<>dod removed dead code (soa_rxn) + !<< dod + + !---model functional switches + LOGICAL, PUBLIC :: lso4_in_m0 = .FALSE. ! include sulphate in SOA absorbing mass? + + !---diagnostic fields... + REAL(dp), PUBLIC, POINTER :: d_prod_soa_mterp(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_isop(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_tol(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_xyl(:,:) + REAL(dp), PUBLIC, POINTER :: d_prod_soa_benz(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_mterp(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_isop(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_tol(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_xyl(:,:) + REAL(dp), PUBLIC, POINTER :: d_chem_sink_benz(:,:) + + !----------------------------------------------------------------------------------------------- + + CONTAINS + !----------------------------------------------------------------------------------------------- + + +#ifdef HAMMOZ + SUBROUTINE soa_species +!### NOTE: species type shall be changed to cover both gas-phase and aerosol definitions in one structure +!### Will require nphase as bit flags (1 = gas, 2=aerosol [4=liquid...]) - only one species per oxidation product then. + + USE mo_ham, ONLY: nsoalumping +!++mgs + USE mo_ham_rad_data, ONLY: iradsoa +!--mgs + !>> dod + ! USE mo_submodel, ONLY: lham, lhammoz + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL + !<< + IMPLICIT NONE + + !---local data: + INTEGER :: i + !---executable procedure + + + !---create precursors + ! Monoterpenes + !>>dod changed lwetdep to FALSE on the basis that it is negligible in runs where it was used + +!>>csld #404 new species for use of MEGAN2.1 + + CALL new_species(nphase = GAS, & + longname = 'alpha pinene', & + shortname = 'APIN', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_apin ) + + CALL new_species(nphase = GAS, & + longname = 't beta ocimene', & + shortname = 'TBETAOCI', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_tbeta ) + + CALL new_species(nphase = GAS, & + longname = 'b pinene', & + shortname = 'BPIN', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_bpin ) + + CALL new_species(nphase = GAS, & + longname = 'limonene', & + shortname = 'LIMON', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_lim ) + + CALL new_species(nphase = GAS, & + longname = 'sabinene', & + shortname = 'SABIN', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_sab ) + + CALL new_species(nphase = GAS, & + longname = 'myrcene', & + shortname = 'MYRC', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_myrc ) + + CALL new_species(nphase = GAS, & + longname = '3-carene', & + shortname = 'CARENE3', & + units = 'kg kg-1', & + mw = 136._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_car ) +!<>no, but I am not sure that it is not, either. It is reactive stuff, so dry dep. + ! is kept, wet dep is removed, as for monoterpenes...might delete drydep too, align with + ! the chemistry model + CALL new_species(nphase = GAS, & + longname = 'Isoprene', & + shortname = 'C5H8', & + units = 'kg kg-1', & + mw = 68._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_isop ) + !<> dod anthropogenics: removed henry since wetdep=F + CALL new_species(nphase = GAS, & + longname = 'Toluene', & + shortname = 'TOL', & + units = 'kg kg-1', & + mw = 92._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_tol ) + + ! Xylene + + CALL new_species(nphase = GAS, & + longname = 'Xylene', & + shortname = 'XYL', & + units = 'kg kg-1', & + mw = 106._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_xyl ) + + ! Benzene + + CALL new_species(nphase = GAS, & + longname = 'Benzene', & + shortname = 'BENZ', & + units = 'kg kg-1', & + mw = 66._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + lburden = .TRUE., & + idx = id_benz ) + + !<< dod + + !---create biogenic gas phase SOA species +!++mgs: note: ltrreq now moved to aerosol species to avoid duplicate subname 'gas' + + !>> dod + ! semi-volatile species are handled in a special way. Such species may exist both in the + ! gas and aerosol phases, and in many different aerosol size modes. Partitioning between + ! gas and aerosol is done with an equilibrium model. This has the consequence that from the + ! point of view of tracer transport, we do not actually need separate aerosol and gas phase + ! tracers: since both gas and aerosol are transported in the same way, we can simply transport + ! the total mass (gas+aerosol) and then diagnose the gas and aerosol masses using the + ! equilibrium model. This cuts the tracer transport requirements by a factor of 5 or so. + ! For purposes of calculating radiative effects, wet deposition, + ! etc., it is convenient to also implement the separated gas and aerosols as tracers. + + ! First the prognostic species (total). Define it as a gas, otherwise HAM will + ! allocate many tracers. + CALL new_species(nphase = GAS, & + longname = 'Monoterpene SOA Total 1', & + shortname = 'SOA_MT_T1', & + units = 'kg kg-1', & + mw = 186._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(1)%spid_tot ) + + + CALL new_species(nphase = GAS, & + longname = 'Monoterpene SOA Total 2', & + shortname = 'SOA_MT_T2', & + units = 'kg kg-1', & +!gf mw = 186._dp, & + mw = 168._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(2)%spid_tot ) + + + ! now the gases and aerosols... + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Monoterpene SOA 1', & + shortname = 'SOA_MT1', & + units = 'kg kg-1', & + mw = 186._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & +!gf(#94) henry = (/ 1.E4_dp, 0._dp /), & + henry = (/ 1.E5_dp, 0._dp /), & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(1)%spid_soa ) + + + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Monoterpene SOA 2', & + shortname = 'SOA_MT2', & + units = 'kg kg-1', & +!gf mw = 186._dp, & + mw = 168._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & + henry = (/ 1.E5_dp, 0._dp /), & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(2)%spid_soa ) + + + ! End of monoterpene definition + + ! Isoprene + + ! Prognostic species (total mass) + CALL new_species(nphase = GAS, & + longname = 'Isoprene SOA Total 1', & + shortname = 'SOA_IS_T1', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(3)%spid_tot ) + + CALL new_species(nphase = GAS, & + longname = 'Isoprene SOA Total 2', & + shortname = 'SOA_IS_T2', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + lburden = .FALSE., & + idx = soaprop(4)%spid_tot ) + + ! Diagnostic species. + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Isoprene SOA 1', & + shortname = 'SOA_IS1', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & +!gf(#94) henry = (/ 1.E4_dp, 0._dp /), & + henry = (/ 1.E5_dp, 0._dp /), & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(3)%spid_soa ) + + CALL new_species(nphase = GAS_OR_AEROSOL, & + longname = 'Isoprene SOA 2', & + shortname = 'SOA_IS2', & + units = 'kg kg-1', & + mw = 125._dp, & + tsubmname = 'HAM', & + itrtype = itrdiag, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & + henry = (/ 1.E5_dp, 0._dp /), & + lburden = .TRUE., & + density = 1320._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + idx = soaprop(4)%spid_soa ) + + ! End isoprene definitons + + !---create anthropogenic gas phase SOA species according to lumping parameter + ! + SELECT CASE(nsoalumping) + CASE(0) ! no lumping, all anthropogenics distinct + + CALL new_species(nphase = AEROSOL, & + longname = 'Toluene SOA', & + shortname = 'SOA_TOL', & + units = 'kg kg-1', & + mw = 124._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1450._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(5)%spid_soa ) + + + CALL new_species(nphase = AEROSOL, & + longname = 'Xylene SOA', & + shortname = 'SOA_XYL', & + units = 'kg kg-1', & + mw = 138._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1330._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(6)%spid_soa ) + + CALL new_species(nphase = AEROSOL, & + longname = 'Benzene SOA', & + shortname = 'SOA_BENZ', & + units = 'kg kg-1', & + mw = 98._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1450._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(7)%spid_soa ) + + CASE(1) ! lump all anthropogenics into one distinct SOA species + + CALL new_species(nphase = AEROSOL, & + longname = 'Anthropogenic SOA', & + shortname = 'ASOA', & + units = 'kg kg-1', & + mw = 124._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1450._dp, & + iaerorad = iradsoa, & + lwatsol = .TRUE., & + kappa = 0.06_dp, & !>>dod << + lburden = .TRUE., & + idx = soaprop(5)%spid_soa ) + + CASE(2) ! lump all anthropogenic SOA together with primary OC + + !! soaprop(5)%spid_soa = id_oc + + END SELECT + + !---SOA 2-product properties + + !---biogenics + ! monoterpene SOA + soaprop(1)%lvolatile = .TRUE. + !soaprop(1)%Kp = 0.0637_dp ! Presto et al EST 2005 + ! soaprop(1)%tref = 295._dp ! Presto et al EST 2005 + !soaprop(1)%Kp = 0.038 ! Griffin et al JGR 1999 + !soaprop(1)%tref = 307._dp ! Griffin et al JGR 1999 + soaprop(1)%Kp = 2.3_dp ! Saathoff et al ACPD 2008 + soaprop(1)%tref = 293.3_dp ! Saathoff et al ACPD 2008 + soaprop(1)%dH = 5.9E4_dp + + soaprop(2)%lvolatile = .TRUE. + !soaprop(2)%Kp = 0.0026_dp ! Presto et al EST 2005 + !soaprop(2)%tref = 295._dp ! Presto et al EST 2005 + !soaprop(2)%Kp = 0.326 ! Griffin et al JGR 1999 + !soaprop(2)%tref = 307._dp ! Griffin et al JGR 1999 + soaprop(2)%Kp = 0.028 ! Saathoff et al ACPD 2008 + soaprop(2)%tref = 293.3_dp ! Saathoff et al ACPD 2008 + soaprop(2)%dH = 2.4E4_dp + + ! isoprene SOA + soaprop(3)%lvolatile = .TRUE. + soaprop(3)%Kp = 0.00862 ! Henze and Seinfeld GRL 2006 + soaprop(3)%tref = 295._dp + soaprop(3)%dH = 4.2E4_dp + + soaprop(4)%lvolatile = .TRUE. + soaprop(4)%Kp = 1.62_dp ! Henze and Seinfeld GRL 2006 + soaprop(4)%tref = 295._dp + soaprop(4)%dH = 4.2E4_dp + + + !---anthropogenics according to lumping parameter + SELECT CASE(nsoalumping) + CASE(0) ! no lumping, all anthropogenics distinct + ! toluene SOA + soaprop(5)%lvolatile = .FALSE. + soaprop(5)%Kp = 0._dp + soaprop(5)%tref = 298._dp + soaprop(5)%dH = 0._dp + soaprop(5)%spid_tot = -1 + + ! xylene SOA + soaprop(6)%lvolatile = .FALSE. + soaprop(6)%Kp = 0._dp + soaprop(6)%tref = 298._dp + soaprop(6)%dH = 0._dp + soaprop(6)%spid_tot = -1 + + ! benzene SOA + soaprop(7)%lvolatile = .FALSE. + soaprop(7)%Kp = 0._dp + soaprop(7)%tref = 298._dp + soaprop(7)%dH = 0._dp + soaprop(7)%spid_tot = -1 + + nsoaspec = 7 + + CASE(1) ! lump all anthropogenics into one distinct SOA species + + soaprop(5)%lvolatile = .FALSE. + soaprop(5)%Kp = 0._dp + soaprop(5)%tref = 298._dp + soaprop(5)%dH = 0._dp + soaprop(5)%spid_tot = -1 + + nsoaspec = 5 + + CASE(2) + nsoaspec = 4 + END SELECT + + !---set species id for unused array elements to 'undefined' + IF (nsoaspec < nmaxsoa) THEN + soaprop(nsoaspec+1:nmaxsoa)%spid_tot = -1 + soaprop(nsoaspec+1:nmaxsoa)%spid_soa = -1 + END IF + + !---count the number of non-volatile species (needed by soa2prod and soa_part + ! see mo_ham_soa_processes). + nnvol = 0 + DO i=1,nsoaspec + IF (.NOT. soaprop(i)%lvolatile) nnvol = nnvol + 1 + END DO + + IF (nsoalumping == 2) nnvol = 1 + + END SUBROUTINE soa_species + + !----------------------------------------------------------------------------------------------- + + SUBROUTINE start_soa_aerosols(nmod, lsoainclass) + + USE mo_ham, ONLY: new_aerocomp + USE mo_species, ONLY: speclist + + IMPLICIT NONE + + INTEGER, INTENT(in) :: nmod + LOGICAL, INTENT(in) :: lsoainclass(nmod) + + !---local data: + INTEGER :: jn, jm, ispec + + !---executable procedure + + DO jn = 1,nmod + IF (lsoainclass(jn)) THEN + + DO jm=1,nsoaspec + + ispec = soaprop(jm)%spid_soa + + !---allocate memory for the aerosol phase tracers + IF (.NOT. ALLOCATED(speclist(ispec)%iaerocomp) ) THEN + ALLOCATE(speclist(ispec)%iaerocomp(nmod)) + speclist(ispec)%iaerocomp(:) = 0 + END IF + + speclist(ispec)%iaerocomp(jn) = new_aerocomp(jn, ispec, speclist(ispec)%itrtype) + END DO + END IF + END DO + + END SUBROUTINE start_soa_aerosols + !----------------------------------------------------------------------------------------------- + + !----------------------------------------------------------------------------------------------- + SUBROUTINE construct_soa_streams + + ! adds input and diagnostic output streams for SOA + ! called from: call_submodels + + ! Author: + ! Declan O'Donnell, MPI-M, 2007 + + !---inherited types, functions and data --- + + USE mo_memory_base, ONLY: new_stream, default_stream_setting, add_stream_element, add_stream_reference + USE mo_linked_list, ONLY: t_stream, SURFACE + USE mo_filename, ONLY: trac_filetype + + IMPLICIT NONE + + !--- subroutine interface --- + ! - + + !--- Local data --- + TYPE(t_stream), POINTER :: stream_soa + + !--- executable procedure --- +!++mgs ### Open a new soa stream (disentangling) + CALL new_stream(stream_soa, 'soadiag', filetype=trac_filetype) + + !---diagnostics + CALL default_stream_setting (stream_soa, units='kg m-2 s-1', lrerun=.TRUE., laccu=.TRUE., & + lpost=.TRUE., leveltype=SURFACE ) + + !>>dod redmine #113 + !--- Add standard fields for post-processing: + CALL add_stream_reference (stream_soa, 'geosp' ,'g3b', lpost=.TRUE.) + CALL add_stream_reference (stream_soa, 'lsp' ,'sp', lpost=.TRUE.) + CALL add_stream_reference (stream_soa, 'aps' ,'g3b', lpost=.TRUE.) + CALL add_stream_reference (stream_soa, 'gboxarea','geoloc', lpost=.TRUE.) + !< +!! \filename +!! mo_ham_species.f90 +!! +!! \brief +!! mo_ham_species assigns identities and properties to species in the HAM model +!! +!! \author Declan O'Donnell (MPI-Met) +!! +!! \responsible_coder +!! Declan O'Donnell, declan.Odonnell@fmi.fi +!! +!! \revision_history +!! -# Declan O'Donnell (MPI-Met) - original code (2008) +!! -# K. Zhang (MPI-Met) - seperate species list for ham; new_species (2009-07) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_species + + !--- inherited types, data and functions + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: jptrac + USE mo_species, ONLY: t_species + + + IMPLICIT NONE + + !--- public member functions + + PUBLIC :: ham_species + + !--- public module data + + + ! Maximum number of species in the model + INTEGER, PARAMETER, PUBLIC :: nmaxspec = 100 + + ! tracer request types + INTEGER, PARAMETER, PUBLIC :: inotr = 0 ! request no tracer + INTEGER, PARAMETER, PUBLIC :: idiagtr = 1 ! request a diagnostic (not transported) tracer + INTEGER, PARAMETER, PUBLIC :: iprogtr = 2 ! request a prognostic (transported) tracer + + ! ### keys to refractive index tables now in mo_ham_rad_data + + ! basic HAM model, gas phase compounds + INTEGER, PUBLIC :: id_dms, & ! Dimethyl sulphide + id_so2, & ! Sulphur dioxide + id_so4g, & ! Sulphate (gas) + id_oh, & ! Hydroxyl radical + id_h2o2, & ! Hydrogen Peroxide + id_o3, & ! Ozone + id_no2, & ! Nitrogen dioxide +!gf see #146 + id_no3!, & ! Nitrate radical +!gf + !id_ocnv ! Organic carbon (gas) !eehol: leave this out + + ! basic HAM model, aerosol phase compounds + INTEGER, PUBLIC :: id_so4, & ! Sulphate (aerosol) + id_bc, & ! Black carbon + id_oc, & ! Organic carbon + id_ss, & ! Sea Salt + id_du, & ! Dust + id_wat ! Aerosol water + + ! Number of model species + INTEGER, PUBLIC :: ham_nspec ! number of species in HAM + INTEGER, PUBLIC :: ham_naerospec ! number of aerosol species in HAM + + ! Model species. These arrays are overdimensioned: the sum of defined species + ! (gas plus aerosol) shall not exceed nmaxspec + TYPE(t_species), PUBLIC, ALLOCATABLE, TARGET :: ham_aerospec(:) + + + + CONTAINS + + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Register ham gas and aerosol species (except for SOA) +!! +!! @author +!! D. O'Dannel (MPI-Met) +!! K. Zhang (MPI-Met) +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! D. O'Dannel (MPI-Met) - original version - (2008-??) +!! K. Zhang (MPI-Met) - seperate species list for ham - (2009-07) +!! +!! @par This subroutine is called by +!! to-be-filled +!! +!! @par Externals: +!!
    +!!
  1. new_species +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE ham_species + + !---inherited types, data and functions + USE mo_ham, ONLY: nham_subm, HAM_SALSA, HAM_M7 + USE mo_submodel, ONLY: lham + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL, itrprog, itrpresc, itrnone + USE mo_species, ONLY: new_species + USE mo_ham_rad_data, ONLY: iradso4, iradbc, iradoc, iradss, iraddu, iradwat +!gf + USE mo_ham, ONLY: mw_so2, mw_so4, mw_dms +!gf + + IMPLICIT NONE + + !--- executable procedure ---- + + !--------- 0. Initialisations + + !--- instantiate the model species. start with the gas phase + IF (lham) THEN + + !--------- 1. Dimethyl Sulphide (DMS) + ! + + CALL new_species(nphase = GAS, & + longname = 'Dimethyl sulphide', & + shortname = 'DMS', & + units = 'kg kg-1', & +!gf mw = 62.019_dp, & + mw = mw_dms, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + henry = (/ 0.54_dp, 3460._dp /), & !csld(#275) + idx = id_dms ) + + !--------- 2. Sulphur Dioxide + ! + + CALL new_species(nphase = GAS, & + longname = 'Sulphur Dioxide', & + shortname = 'SO2', & + units = 'kg kg-1', & +!gf mw = 63.692_dp, & + mw = mw_so2, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + dryreac = 0._dp, & + henry = (/ 1.36_dp, 4250._dp /), & !csld(#275) + idx = id_so2 ) + + + !--------- 4. Hydroxyl Radical + ! + + CALL new_species(nphase = GAS, & + longname = 'Hydroxyl radical', & + shortname = 'OH', & + units = 'VMR', & + mw = 17.003_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 0._dp, & + henry = (/ 39._dp, 0._dp /), & !csld(#275) + idx = id_oh ) + + !--------- 5. Hydrogen Peroxide + ! + + CALL new_species(nphase = GAS, & + longname = 'Hydrogen peroxide', & + shortname = 'H2O2', & + units = 'VMR', & + mw = 34.005_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 1._dp, & + henry = (/ 8.44E4_dp, 7600._dp /), & !csld(#275) + idx = id_h2o2 ) + + !--------- 6. Ozone + ! + + CALL new_species(nphase = GAS, & + longname = 'Ozone', & + shortname = 'O3', & + units = 'VMR', & + mw = 48.0_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 1._dp, & + henry = (/ 1.03E-2_dp, 2830._dp /), & !csld(#275) + idx = id_o3 ) + + !--------- 7. Nitrogen Dioxide + ! + + CALL new_species(nphase = GAS, & + longname = 'Nitrogen dioxide', & + shortname = 'NO2', & + units = 'VMR', & + mw = 46.006_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + lwetdep = .FALSE., & + dryreac = 1._dp, & + henry = (/ 1.2E-2_dp, 2360._dp /), & !csld(#275) + idx = id_no2 ) +!gf see #146 + + !--------- 8. Nitrate radical + ! + + CALL new_species(nphase = GAS, & + longname = 'Nitrate radical', & + shortname = 'NO3', & + units = 'VMR', & + mw = 62.049_dp, & + tsubmname = 'HAM', & + itrtype = itrnone, & !gf #57 + ldrydep = .FALSE., & + henry = (/ 3.8E-2_dp, 0._dp /), & !csld(#275) + lwetdep = .FALSE., & + idx = id_no3 ) + +!gf + + !--------- 3.a Gas phase sulphate + ! (sulphate can be present in both the gas-phase and the aerosol phase) + ! density here is that of H2SO4 +!>>DT + CALL new_species(nphase = GAS, & + longname = 'Sulphuric acid', & + shortname = 'H2SO4', & + units = 'kg kg-1', & + mw = mw_so4, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + henry = (/ 1.3e15_dp, 20000._dp /), & !SF #571 + dryreac = 0._dp, & + idx = id_so4g ) +!<
>DT + CALL new_species(nphase = AEROSOL, & + longname = 'Sulphate', & + shortname = 'SO4', & + units = 'kg kg-1', & + mw = mw_so4, & + tsubmname = 'HAM', & + itrtype = itrprog, & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + density = 1841._dp, & + iaerorad = iradso4, & + lwatsol = .TRUE., & + lelectrolyte = .TRUE., & + nion = 2, & + osm = 1._dp, & + kappa = 0.60_dp, & + lburden = .TRUE., & + idx = id_so4 ) +!<
>dod<< + ldrydep = .TRUE., & + lwetdep = .TRUE., & + idx = id_ss ) + + + !--------- 12. Mineral Dust + ! + + CALL new_species(nphase = AEROSOL, & + longname = 'Dust', & + shortname = 'DU', & + units = 'kg kg-1', & + mw = 250._dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + density = 2650._dp, & + iaerorad = iraddu, & + lwatsol = .FALSE., & + ldrydep = .TRUE., & + lwetdep = .TRUE., & + idx = id_du ) + + + !--------- 13. Water (includes only water on aerosols, not water vapour, cloud water or cloud ice) + ! + + CALL new_species(nphase = AEROSOL, & + longname = 'Aerosol water', & + shortname = 'WAT', & + units = 'kg kg-1', & + mw = 18.0_dp, & + tsubmname = 'HAM', & + itrtype = itrprog, & + density = 1000._dp, & + iaerorad = iradwat, & + lwatsol = .TRUE., & + lemis = .FALSE., & + ldrydep = .FALSE., & + lwetdep = .FALSE., & + idx = id_wat ) + + + !--------- end of basic model aerosol phase species + END IF + END SUBROUTINE ham_species + +END MODULE mo_ham_species + diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 new file mode 100755 index 00000000..768ac6b8 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_subm.F90 @@ -0,0 +1,796 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_subm.f90 +!! +!! \brief +!! Module to provide interface to the aerosol microphysics schemes +!! +!! \author Martin G. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# The original code is from J. Feichter, J. Wilson and E. Vignatti, JRC Ispra +!! and was adapted for ECHAM by P. Stier, Oxford. Other contributions include +!! D. O'Donnell, K. Zhang and others +!! -# M.G. Schultz (FZ Juelich) - new code structure for integration into echam6-hammoz (2009-09-24) +!! -# T. Bergman (FMI) - nmod->nclass to facilitate new aerosol models (2013-02-05) +!! -# H. Kokkola (FMI) - generalization to include also SALSA aerosol microphysics (2014) +!! +!! \limitations +!! None +!! +!! \details +!! This module contains the ham_subm_interface routine and common routines +!! for aerosol microphysics interfaces. +!! This module contains the following subroutines which used to be individual files. +!! ham_subm_interface +!! subm_mass_sum +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_subm + +IMPLICIT NONE + +PRIVATE + +PUBLIC :: ham_subm_interface + + +CONTAINS + +! --------------------------------------------------------------------------- +! ham_subm_interface: called from mo_submodel_interface +! --------------------------------------------------------------------------- + +SUBROUTINE ham_subm_interface(kproma, kbdim, klev, krow, ktrac, & + pap, paph, & + pt, pq, pqs, & + pxtm1, pxtte, & + pm6rp, pm6dry, prhop, pww, & + paclc, pgrvolm1, ppbl, zout3, & + pforest,pout_dnuc) + ! + ! Authors: + ! -------- + ! + ! 1997 J. Feichter and J. Wilson (original code) + ! 2000 J. Feichter and E. Vignati (adopted to m7) + ! 2001 P. Stier + ! 2008 J. Kazil + ! - Ionization rate calculation + ! - Changed m7 interface and call + ! - Extended comments + ! 2008 D.O'Donnell, MPI-Met, Hamburg + ! - generalisation of the species (no more hardcoded so4, bc, oc, etc.) + ! - added sizeclass and new modules, removed dependency on mo_ham_m7_trac, + ! 2009 Kai Zhang, MPI-Met, Hamburg + ! - submodel interface + ! 2013 Harri Kokkola, FMI, Kuopio + ! - implementation of SALSA microphysics + ! - M7 microphysics routines separated to mo_ham_m7 + ! + ! + ! Method: + ! ------- + ! + ! The interface takes the tracer mixing ratios of the at the time t-dt, adds + ! the tendencies (pxtte) of the preceeding processes, converts the units, + ! calculates ambient and auxiliary quantities, and hands the appropriate + ! quantities to microphysics modules. A mass conservation check is performed + ! (before and after calling the microphysics) if requested. + ! + ! After the call of microfysical module, the returning concentrations are + ! reconverted to mixing ratios, the tendencies of the mixing ratios are + ! calculated and returned to ECHAM. + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: rd, vtmpc1, grav, avo, argas + USE mo_time_control, ONLY: time_step_len + !USE mo_echam_convect_tables, ONLY: tlucuaw, jptlucu1, jptlucu2 !eehol: removed ECHAM dependency + USE mo_exception, ONLY: finish, message, message_text, em_warn + USE mo_species, ONLY: speclist +#ifdef HAMMOZ + USE mo_ham, ONLY: lgcr, nsolact +#endif + USE mo_ham, ONLY: subm_ngasspec, subm_gasspec, subm_gasunitconv, & + subm_naerospec, subm_aerospec, subm_aerounitconv, & + subm_aero_idx, & + immr2ug, immr2molec, ivmr2molec + USE mo_ham_subm_species, ONLY: isubm_so4g, isubm_ocnv + USE mo_ham, ONLY: naerocomp, aerocomp, aerowater, mw_so4, mw_oc, & + sizeclass, nclass, & + nham_subm, & + HAM_BULK, & + HAM_M7, & + HAM_SALSA, nsol!, & + USE mo_tracer_processes, ONLY: xt_borrow +#ifdef HAMMOZ + USE mo_ham, ONLY: lmass_diag + USE mo_ham_streams, ONLY: rdry, rwet, densaer, relhum, ipr + USE mo_ham_gcrion, ONLY: solar_activity,gcr_ionization + !>>dod timers + USE mo_control, ONLY: ltimer + USE mo_hammoz_timer, ONLY: timer_start, timer_stop, timer_ham_m7_main +#endif +#ifdef SALSA + USE mo_ham_salsa, ONLY: salsa +#endif + USE mo_ham_m7, ONLY: m7 + USE mo_ham_m7ctl, ONLY: iaits,iaccs + + !<>dod changed index to naerospec + REAL(dp):: zmass_pre(subm_naerospec), & ! mass of aerosol compounds before and + zmass_post(subm_naerospec) ! after microphysics call, for mass conservation check + !<>dod soa + REAL(dp) :: zgas(kbdim,klev,subm_ngasspec) + REAL(dp) :: zunitfac, zqunitfac, zfac1 + !<>dod from array + LOGICAL :: labort + !<>dod + labort = .FALSE. + !< physc) + zrhoa(jl,jk) = pap(jl,jk)/(pt(jl,jk)*rd*(1._dp+vtmpc1*pq(jl,jk))) + !--- 2.2) New calculation of the relative humidity (over water): + + !-->eehol: these are not needed as saturation spec. hum. comes as an input + !it = NINT(pt(jl,jk)*1000._dp) + !it = MAX(MIN(it,jptlucu2),jptlucu1) + + !zqs = tlucuaw(it)/pap(jl,jk) + !zqs = MIN(zqs,0.5_dp) + !zqs = zqs/(1._dp-vtmpc1*zqs) + !<--eehol + zqs = pqs(jl,jk) !eehol: read zqs from input sat. spec. hum + +!NOT-USED-AND-BROKEN-IN-SP-[PLS] zaclc = MIN(paclc(jl,jk),1.0_dp-zeps) +!NOT-USED-AND-BROKEN-IN-SP-[PLS] +!NOT-USED-AND-BROKEN-IN-SP-[PLS] zq_amb = MAX( 0.0_dp , (pq(jl,jk)-zqs*zaclc)/(1._dp-zaclc) ) + + !zrh(jl,jk) = zq_amb/zqs + zrh(jl,jk) = pq(jl,jk)/zqs !changed to same as OIFS + + zrh(jl,jk) = MAX(0.0_dp,MIN(zrh(jl,jk),1.0_dp)) + + !--- Air mass auxiliary variable: + + zdpg(jl,jk) = (paph(jl,jk+1)-paph(jl,jk))/grav + + !--- Layer thickness zdz = dp/(rho*grav) [m]: + + zdz(jl,jk) = zdpg(jl,jk)/zrhoa(jl,jk) + + END DO + + !ham_ps:changed position to suppress loop-fusion on NEC-SX6 +#ifdef HAMMOZ + relhum(1:kproma,jk,krow) = zrh(1:kproma,jk) +#endif + END DO + +#ifdef HAMMOZ + !--- 2.3) Ionization rate + ! + + IF (lgcr) then + + !--- Solar activity: + + IF (abs(nsolact) > 1.0_dp) then + ! Parameterize solar activity as function of the current date: + zsolact = solar_activity() + ELSE + ! Use solar activity parameter set by user: + zsolact = nsolact + ENDIF + + !--- Galactic cosmic ray ionization rate: + + CALL gcr_ionization(krow,kproma,kbdim,klev,zsolact,pt,pap,zipr) + + !--- Save the ionization rate: + + ipr(1:kproma,1:klev,krow) = 1.0e6_dp*zipr(1:kproma,1:klev) + + ENDIF +#endif + !--- 3) Convert units and add the tendencies of preceeding proceses: --------- + ! Convert: +!!mgs(S)!! ! - mass of sulfur species from [mass(S)/mass(air)] +!!mgs(S)!! ! to [molecules/cm+3] + ! - mass of sulfur species from [mass(SO4)/mass(air)] + ! - mass of all other species to micro-gram/cubic-meter + ! - particle numbers are converted from [N/kg(air)] to [N/cm+3] + ! + !--- 3.1) Gases: + +!++mgs: Note that logic changed here - looping only over subm_gasspec !! +!! this is equivalent to the former "IF (gasspec(jn)%lm7gas) THEN" +!! the former "gasspec(jn)%m7unitconv" is now replaced with subm_gasunitconv(jn) +!--mgs +!++mgs: initialize zgso4p1 + zgso4p1(:,:) = 0._dp + + DO jn=1,subm_ngasspec + jt = speclist(subm_gasspec(jn))%idt + + SELECT CASE(subm_gasunitconv(jn)) + CASE(immr2ug) + DO jk=1,klev + DO jl=1,kproma + zunitfac = zfac*zrhoa(jl,jk) + zgas(jl,jk,jn) = zunitfac*(pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst) + END DO + END DO + + CASE(immr2molec) + DO jk=1,klev + DO jl=1,kproma + ! >> thk #513 + zunitfac = 1e-3*zrhoa(jl,jk)*avo/speclist(subm_gasspec(jn))%moleweight + ! << thk + zgas(jl,jk,jn) = zunitfac*(pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst) + END DO + END DO + + !---need gas phase SO4 tendency for Jan Kazil's SO4 condensation scheme + IF (jn == isubm_so4g) THEN + DO jk=1,klev + DO jl=1,kproma + zunitfac = zfacm*zrhoa(jl,jk) + zgso4m1(jl,jk) = zunitfac*pxtm1(jl,jk,jt) + zdgso4(jl,jk) = zunitfac*pxtte(jl,jk,jt) + zgso4p1(jl,jk) = zgso4m1(jl,jk)+zdgso4(jl,jk)*time_step_len + END DO + END DO + END IF + + CASE(ivmr2molec) + DO jk=1,klev + DO jl=1,kproma + zunitfac = zfac_vmr*pap(jl,jk)/pt(jl,jk) + zgas(jl,jk,jn) = zunitfac*(pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst) + END DO + END DO + END SELECT + + END DO + + !--- 3.2 Particle mass: + + DO jn=1, naerocomp + jt = aerocomp(jn)%idt ! get tracer id + jspec = aerocomp(jn)%spid ! get species id + jl = subm_aero_idx(jspec) ! get index to subm_aerospec list + !!mgs=old code!! IF (aerocomp(jn)%species%m7unitconv == immr2molec) THEN + IF (jl <= 0) THEN +#ifdef HAMMOZ + WRITE(message_text,*) 'SUBM_AERO_IDX Mapping error !! No index for jspec=',jspec +#endif + CALL finish('ham_subm_interface', message_text) + END IF + IF (subm_aerounitconv(jl) == immr2molec) THEN + zfac1 = zfacm + ELSE + zfac1 = zfac + END IF + zaerml(1:kproma,:,jn) = zfac1*zrhoa(1:kproma,:)*(pxtm1(1:kproma,:,jt) + pxtte(1:kproma,:,jt)*ztmst) + + END DO + + !--- 3.3) Particle numbers: + + DO jn=1, nclass + jt = sizeclass(jn)%idt_no + zaernl(1:kproma,:,jn) = zfacn*zrhoa(1:kproma,:)*(pxtm1(1:kproma,:,jt)+pxtte(1:kproma,:,jt)*ztmst) + !zout3(kidia:kproma,1:klev,jn) = zaernl(1:kproma,1:klev,jn) +! write(3334,*)jt,'NUM',sizeclass(jn)%shortname,jn + + END DO + !<>dod moved to separate subroutine + + IF (lmass_diag) CALL subm_mass_sum(kbdim, kproma, klev, krow, zgas, zaerml, zdpg, zmass_pre) + !<>dod timers + IF (ltimer) CALL timer_start(timer_ham_m7_main) + !<>dod timers + IF (ltimer) CALL timer_stop(timer_ham_m7_main) + !<>dod again special handling for so4 gas for Jan Kazil's SO4 condensation scheme + + zgas(1:kproma,:, isubm_so4g) = zgso4(1:kproma,:) +#ifdef SALSA + CASE(HAM_SALSA) + + ! Number concentration converted from cm-3 to m-3 for SALSA + zaernl(1:kproma,:,:) = zaernl(1:kproma,:,:) * 1.e6_dp + + ! >> thk: adapting for VBS + ! Gas phase concentrations converted from cm-3 to m-3 for SALSA + zgas(1:kproma,:,:) = zgas(1:kproma,:,:) * 1.e6_dp + + CALL salsa(kproma, kbdim, klev, krow, & ! ECHAM indices + pap, zrh, pt, ztmst,& ! Pressure, RH, temperature, time step length + !zgso4, zgocnv, zgocsv, & ! [H2SO4(g)], [OCNV(g)], [OCSV(g)] + zgas, & ! gas phase concentrations + zaerml, zaernl, & ! Aerosol volume and number + zm6rp, zm6dry, zrhop, zww, & ! Aerosol properties + ppbl & + ) ! Planetary boundary layer top level + + ! Number concentration converted from m-3 to cm-3 for compatibility with M7 + zaernl(1:kproma,:,:) = zaernl(1:kproma,:,:) * 1.e-6_dp + + ! Gas phase concentrations converted from m-3 to cm-3 for compatibility with M7 + zgas(1:kproma,:,:) = zgas(1:kproma,:,:) * 1.e-6_dp + ! << thk +#endif + END SELECT + + !--- 5) Reconvert masses and numbers into mixing ratios, other --------------- + ! quantities to SI units and calculate the tendencies (xtte): + ! + !>>dod soa + !---5.1) Gases +!++mgs: changes to replace gasspec and m7unitconv (see above) + DO jn = 1,subm_ngasspec + jt=speclist(subm_gasspec(jn))%idt + + SELECT CASE(subm_gasunitconv(jn)) + CASE(immr2ug) + DO jk=1,klev + DO jl=1,kproma + zqunitfac = zqfac/zrhoa(jl,jk) + pxtte(jl,jk,jt) = (zgas(jl,jk,jn)*zqunitfac-pxtm1(jl,jk,jt))*zqtmst + END DO + END DO + + CASE(immr2molec) + DO jk=1,klev + DO jl=1,kproma + ! >> thk #513 + zqunitfac = 1e3*speclist(subm_gasspec(jn))%moleweight/(avo*zrhoa(jl,jk)) + ! << thk + pxtte(jl,jk,jt) = (zgas(jl,jk,jn)*zqunitfac-pxtm1(jl,jk,jt))*zqtmst + END DO + END DO + END SELECT + +!>>csld #538 +! csld : A more elegant way to resolve this bug could be to define an extra case +! for h2so4 (subm_gasunitconv(jn)). Another alternative would be to do the back unit conversion +! inside the HAM_M7 case. +! I let this cosmetic issue for the moment. + IF ((nham_subm == HAM_M7) .AND. (jn == isubm_so4g)) THEN + DO jk=1,klev + DO jl=1,kproma + zqunitfac = zqfacm/zrhoa(jl,jk) + pxtte(jl,jk,jt) = (zgas(jl,jk,jn)*zqunitfac-pxtm1(jl,jk,jt))*zqtmst + END DO + END DO + END IF +!< rdry(jclass)%ptr + rwet_p => rwet(jclass)%ptr + densaer_p => densaer(jclass)%ptr + + !--- Mean mode density from [g/cm3] to [kg/m3]: + densaer_p(1:kproma,:,krow) = zrhop(1:kproma,:,jclass)*1.E3_dp + + !--- Ambient Count Median Radius from [cm] to [m]: + + rwet_p(1:kproma,:,krow) = zm6rp(1:kproma,:,jclass)/100._dp + + !--- Dry Count Median Radius from [cm] to [m]: + + IF (jclass <= nsol .AND. nham_subm == HAM_M7) THEN + rdry_p(1:kproma,:,krow) = zm6dry(1:kproma,:,jclass)/100._dp + ELSE IF (nham_subm == HAM_SALSA) THEN + !--> thk: addition to bugfix #756 + !rdry_p(1:kproma,:,krow) = zm6rp(1:kproma,:,jclass)/100._dp + rdry_p(1:kproma,:,krow) = zm6dry(1:kproma,:,jclass)/100._dp + !<--thk + END IF + + END DO +#endif + !--- Store diagnostic aerosol properties in pseudo-tracers: + !>>dod soa + DO jn=1,nsol + pxtm1(1:kproma,:,aerowater(jn)%idt)=zww(1:kproma,:,jn)/zrhoa(1:kproma,:) + END DO + !<>dod soa rewritten to avoid hardcoding of individual species + DO jc=1,subm_naerospec + + IF( ABS(zmass_pre(jc)-zmass_post(jc)) > 0.100_dp*ABS(MAX(zmass_pre(jc),zmass_post(jc)))) THEN + + CALL message('ham_subm_interface', 'microphysics module violates mass conservation by >10% for '// & + speclist(subm_aerospec(jc))%longname, level=em_warn) + + labort=.TRUE. + + ELSE IF( ABS(zmass_pre(jc)-zmass_post(jc)) > 0.010_dp*ABS(MAX(zmass_pre(jc),zmass_post(jc)))) THEN + + CALL message('ham_subm_interface', 'microphysics module violates mass conservation by >1% for '// & + speclist(subm_aerospec(jc))%longname) + + ELSE IF( ABS(zmass_pre(jc)-zmass_post(jc)) > 0.001_dp*ABS(MAX(zmass_pre(jc),zmass_post(jc)))) THEN + + CALL message('ham_subm_interface', 'microphysics module violates mass conservation by >0.1% for '// & + speclist(subm_aerospec(jc))%longname) + END IF + + END DO + + END IF +#endif + +END SUBROUTINE ham_subm_interface + +#ifdef HAMMOZ +! --------------------------------------------------------------------------- + +SUBROUTINE subm_mass_sum(kbdim, kproma, klev, krow, pgas, paerml, pdpg, pmasssum) + + ! Purpose: sum the total mass per species over the gridpoints on one processor + ! This subroutine is called if the namelist variables nsoa == 1 and lomassdiag == .TRUE. + ! It is called twice, from ham_subm_interface, once before and once after the + ! microphysical processes have been calculated. + ! It tests the total mass and throws an exception if mass conservation is violated + + !---inherited functions, types and data + USE mo_kind, ONLY: dp + USE mo_ham, ONLY: naerocomp, aerocomp, nsoa, nsoaspec, nham_subm, HAM_SALSA + USE mo_ham, ONLY: subm_ngasspec, subm_naerospec + USE mo_ham_subm_species, ONLY: isubm_so2, isubm_so4, isubm_so4g, isubm_oc, isubm_ocnv + USE mo_geoloc, ONLY: gboxarea_2d + USE mo_ham_soa, ONLY: soaprop + + IMPLICIT NONE + + !---subroutine interface + INTEGER, INTENT(IN) :: kbdim, kproma, klev, krow ! grid parameters + REAL(dp), INTENT(IN) :: pgas(kbdim,klev,subm_ngasspec) ! gas concentrations + REAL(dp), INTENT(IN) :: paerml(kbdim,klev,naerocomp) ! aerosol concentrations + REAL(dp), INTENT(IN) :: pdpg(kbdim,klev) ! air mass auxiliary variable + REAL(dp), INTENT(OUT) :: pmasssum(subm_naerospec) ! total mass + + !---Local data + ! Parameters: + ! - + ! Local variables + REAL(dp) :: zarea(kbdim) ! gridbox area + INTEGER :: jspec ! species index + INTEGER :: jl, jk, jn, jm ! loop counter + + + !---executable procedure + pmasssum(:) = 0._dp + zarea(1:kproma) = gboxarea_2d(1:kproma,krow) + +!!mgs(S)!!: ### update needed to obtain correct mass?? + + !---sum aerosol masses per species + DO jn=1,naerocomp + !---get species index + jspec = aerocomp(jn)%spid + + DO jk=1,klev + DO jl=1,kproma + pmasssum(jspec) = pmasssum(jspec) + paerml(jl,jk,jn)*pdpg(jl,jk)*zarea(jl) + END DO + END DO + + END DO + + !---sulphate: add SO2 and gas phase SO4 + DO jk=1,klev + DO jl=1,kproma + pmasssum(isubm_so4) = pmasssum(isubm_so4) + (pgas(jl,jk,isubm_so2)+pgas(jl,jk,isubm_so4g)) * & + pdpg(jl,jk)*zarea(jl) + END DO + END DO + + !---SOA.... + IF (nsoa == 1) THEN + DO jm=1,nsoaspec + IF (soaprop(jm)%lvolatile) THEN + !---gas species index + jspec = soaprop(jm)%spid_soa + + DO jk=1,klev + DO jl=1,kproma + pmasssum(jspec) = pmasssum(jspec)+pgas(jl,jk,jspec)*pdpg(jl,jk)*zarea(jl) + END DO + END DO + + END IF + END DO + + END IF + + END SUBROUTINE subm_mass_sum + ! + !******************************************************************************* + ! +#endif + +END MODULE mo_ham_subm diff --git a/ifs-source/arpifs/m7/module/mo_ham_subm_species.F90 b/ifs-source/arpifs/m7/module/mo_ham_subm_species.F90 new file mode 100644 index 00000000..53dfcd42 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_subm_species.F90 @@ -0,0 +1,241 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_subm_species.f90 +!! +!! \brief +!! Species mapping from ECHAM species list to condensed gas-phase and aerosol lists in M7 +!! +!! \author Martin G. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! Martin G. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# Martin G. Schultz (FZ Juelich) - original code (2009-10) +!! -# Harri Kokkola (FMI) - Implementation of SALSA aerosol microphysics model (2014) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_subm_species + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: map_ham_subm_species + + PUBLIC :: isubm_so2, isubm_so4g, isubm_oc, isubm_ocnv, isubm_so4, isubm_wat + + + !-- species indices for microphysics routines + INTEGER :: isubm_so2, isubm_so4g, isubm_oc, isubm_ocnv, isubm_so4, isubm_wat + + ! >> thk: volatility basis set (VBS) + INTEGER :: isubm_bc, isubm_ss, isubm_du + ! << thk + + CONTAINS + +! --------------------------------------------------------------------------- +! map_ham_subm_species: construct condensed species lists for M7 gas phase and +! aerosol species from the general speclist +! --------------------------------------------------------------------------- + +SUBROUTINE map_ham_subm_species + + USE mo_species, ONLY: nspec, speclist + USE mo_ham, ONLY: nsoa, nsoaspec, nham_subm, HAM_SALSA + USE mo_ham_species, ONLY: id_so2, id_so4g, &!, id_ocnv, &!eehol: deleted id_ocnv + id_so4, id_bc, id_oc, id_ss, id_du, id_wat + USE mo_ham_soa, ONLY: soaprop + USE mo_ham, ONLY: immr2molec, ivmr2molec, immr2ug, & + subm_ngasspec, subm_gasspec, subm_naerospec, subm_aerospec, & + subm_naerospec_nowat, subm_aerospec_nowat + USE mo_exception, ONLY: message, message_text, em_info, em_param + USE mo_util_string, ONLY: separator +#ifdef HAMMOZ + USE mo_ham_vbsctl, ONLY: vbs_nvocs, vbs_voc_prec, vbs_ngroup, & + vbs_set, laqsoa,aqsoa_ngroup, aqsoa_set +#endif + INTEGER :: jt, jm, jb, jv + + + DO jt = 1, nspec + IF (jt == id_so2) CALL new_subm_gasspec(id_so2, immr2molec, isubm_so2) + IF (jt == id_so4g) CALL new_subm_gasspec(id_so4g, immr2molec, isubm_so4g) + !eehol: id_ocnv not used anymore + !IF(nham_subm == HAM_SALSA) THEN + ! IF (jt == id_ocnv) CALL new_subm_gasspec(id_ocnv, immr2molec, isubm_ocnv) + !END IF + + IF (jt == id_so4) CALL new_subm_aerospec(id_so4, immr2molec, isubm_so4) + IF (jt == id_bc) CALL new_subm_aerospec(id_bc, immr2ug, isubm_bc) + IF (jt == id_oc) CALL new_subm_aerospec(id_oc, immr2ug, isubm_oc) + IF (jt == id_ss) CALL new_subm_aerospec(id_ss, immr2ug, isubm_ss) + IF (jt == id_du) CALL new_subm_aerospec(id_du, immr2ug, isubm_du) + IF (jt == id_wat) CALL new_subm_aerospec(id_wat, immr2ug, isubm_wat) + + SELECT CASE (nsoa) + CASE(1) + + DO jm = 1,nsoaspec + IF (jt == soaprop(jm)%spid_soa) CALL new_subm_aerospec(soaprop(jm)%spid_soa, immr2ug) + END DO +#ifdef HAMMOZ + CASE(2) !thk: VBS + + DO jb = 1, vbs_ngroup + IF (jt == vbs_set(jb)%spid) THEN + IF (vbs_set(jb)%lcreateaero) THEN + CALL new_subm_gasspec(jt, immr2molec, vbs_set(jb)%id_gasspec) + CALL new_subm_aerospec(jt, immr2ug, vbs_set(jb)%id_aerospec) + vbs_set(jb)%id_vols = subm_naerospec_nowat + ELSE + DO jm = 1,subm_ngasspec + IF (subm_gasspec(jm) == jt) vbs_set(jb)%id_gasspec = jm + END DO + +!>>SF special case + IF (vbs_set(jb)%spid_aero /= 0) THEN + vbs_set(jb)%id_vols = subm_naerospec_nowat + ENDIF +!< nmaxspec) CALL finish('new_subm_gasspec', & + 'Number of gas species for HAM (subm_ngasspec) exceeds nmaxspec!') + + subm_gasspec(subm_ngasspec) = nspid + subm_gasunitconv(subm_ngasspec) = nunitconv + + IF (PRESENT(idlocal)) idlocal = subm_ngasspec + +END SUBROUTINE new_subm_gasspec + + +! --------------------------------------------------------------------------- +! new_subm_aerospec: add a species id of a aero species to the list of species to +! be considered in aerosol processes. +! --------------------------------------------------------------------------- + + SUBROUTINE new_subm_aerospec(nspid, nunitconv, idlocal) + + USE mo_exception, ONLY: finish + USE mo_species, ONLY: nmaxspec + USE mo_ham, ONLY: subm_naerospec, subm_aerospec, subm_aerounitconv, subm_aero_idx, & + subm_naerospec_nowat, subm_aerospec_nowat !SF for convenience + USE mo_ham_species, ONLY: id_wat + + INTEGER, INTENT(in) :: nspid, nunitconv + INTEGER, INTENT(out), OPTIONAL :: idlocal ! local species id for M7 routines + !### note: minimial error checking, because use of this routine is practically hardwired in HAM + + subm_naerospec = subm_naerospec + 1 + IF (subm_naerospec > nmaxspec) CALL finish('new_subm_aerospec', & + 'Number of aerosol species exceeds nmaxspec!') + + subm_aerospec(subm_naerospec) = nspid + subm_aerounitconv(subm_naerospec) = nunitconv + ! reverse mapping + subm_aero_idx(nspid) = subm_naerospec + + IF (PRESENT(idlocal)) idlocal = subm_naerospec + + !>>SF for convenience only: introduce a special mapping for all but water aero species + ! (mostly used in SALSA for now, but could be more widely used in future) + IF (nspid /= id_wat) THEN + subm_naerospec_nowat = subm_naerospec_nowat + 1 + subm_aerospec_nowat(subm_naerospec_nowat) = nspid + ENDIF + !< +!! \filename +!! mo_ham_tools.f90 +!! +!! \brief +!! mo_ham_tools hold auxiliary routines for the +!! HAM aerosol model +!! +!! \author Philip Stier (MPI-Met) +!! +!! \responsible_coder +!! Philip Stier, philip.stier@physics.ox.ac.uk +!! +!! \revision_history +!! -# Philip Stier (MPI-Met) - original code (2002) +!! -# Philip Stier (MPI-Met) - added ham_logtail (2004) +!! -# Betty Croft (Dalhousie University) - added scavenging coefficient bilinear interpolation (2008) +!! -# Sylvaine Ferrachat (ETH Zurich) - cleanup and security (2011) +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_tools + + ! *mo_ham_tools* hold auxiliary routines for the + ! HAM aerosol model + + USE mo_kind, ONLY: dp, THRESHOLD + USE mo_exception, ONLY: finish + + IMPLICIT NONE + +CONTAINS + +#ifdef HAMMOZ + SUBROUTINE geoindex (plon, plat, klon, klat) + + ! *geoindex* calculates the corresponding lat-lon (klon,klat) index + ! for given lat-lon [-90,90][0,360] coordinates (plon, plat) + ! + ! Authors: + ! --------- + ! Philip Stier, MPI-MET 2002 + ! + ! Externals + ! ----------- + ! none + + + USE mo_exception, ONLY: finish + USE mo_control, ONLY: ngl, nlon + USE mo_gaussgrid, ONLY: philat, philon + IMPLICIT NONE + + REAL(dp),INTENT(IN) :: plon, plat ! Coordinates in degrees + INTEGER, INTENT(OUT) :: klon, klat ! Corresponding indices + + REAL(dp) :: zxdif, zydif + INTEGER :: jlon, jlat + + + IF((NINT(plon)<0).OR.(NINT(plon)>360).OR.(NINT(plat)<-90).OR.(NINT(plat)>90)) THEN + CALL finish('geoindex:', 'Coordinates out of range') + END IF + + klon=-999 + klat=-999 + + zxdif=360._dp + zydif=180._dp + + !--- 1) Search for closest longitude in [0,360}: + + DO jlon = 1, nlon + IF(ABS(plon-philon(jlon)) < zxdif) THEN + klon=jlon + zxdif=ABS(plon-philon(jlon)) + END IF + END DO + + !--- 2) Search for closest latitude [90,-90]: + + DO jlat = 1, ngl + IF( ABS(plat-philat(jlat)) < zydif ) THEN + klat=jlat + zydif=ABS(plat-philat(jlat)) + END IF + END DO + + + IF(klon==-999 .OR. klat==-999) CALL finish('geoindex:', 'No index found') + + END SUBROUTINE geoindex +#endif +!--------------------------------------------------------------------------------------------- +#ifdef HAMMOZ + SUBROUTINE calc_daylength + + ! *dayfac* calculates relative daylength + ! + ! Author: + ! ------- + ! Philip Stier, MPI-Met 14/11/2002 + ! + ! Method: + ! ------- + ! Adapted from the routines "solang" and "prerad" + + USE mo_kind, ONLY: dp + USE mo_control, ONLY: nlon, ngl + USE mo_gaussgrid, ONLY: coslon, sinlon, gl_twomu, gl_sqcst + USE mo_time_control, ONLY: get_clock, current_date + USE mo_radiation_parameters, ONLY: decl_sun_cur + USE mo_decomposition, ONLY: gdc => global_decomposition + USE mo_transpose, ONLY: scatter_gp + USE mo_test_trans, ONLY: test_gridpoint + USE mo_ham_streams, ONLY: daylength + + IMPLICIT NONE + + INTEGER :: jl, jlat + + LOGICAL :: lo + + REAL(dp):: zclock + REAL(dp):: czen1, czen2, czen3, ztim1, ztim2, ztim3, zsum + + REAL(dp):: zmu0(nlon), zrdayl(nlon) + + REAL(dp), POINTER :: zdaylength(:,:) + + + !--- 0) Initialization: + + ALLOCATE (zdaylength(nlon,ngl)) + + + !--- 1) Compute orbital parameters for present time step: + + zclock = get_clock(current_date) + +!!mgs: removed orbital calculation - can now make use of variables from mo_radiation_parameters + + czen1 = SIN(decl_sun_cur) + czen2 = COS(decl_sun_cur)*COS(zclock) + czen3 = COS(decl_sun_cur)*SIN(zclock) + + !--- 2) Calculate relative daylength (from routine solang): + + DO jlat = 1, ngl + + ztim1 = czen1*0.5_dp*gl_twomu(jlat) + ztim2 = -czen2*gl_sqcst(jlat) + ztim3 = czen3*gl_sqcst(jlat) + + DO jl = 1, nlon + zmu0(jl) = ztim1 + ztim2*coslon(jl) + ztim3*sinlon(jl) + lo = zmu0(jl) >= 0._dp + zrdayl(jl) = MERGE(1._dp,0._dp,lo) + END DO + + zsum = SUM(zrdayl(1:nlon)) + + IF (ABS(zsum) > 0._dp) THEN + zdaylength(:,jlat) = zsum/REAL(nlon,dp) + ELSE + zdaylength(:,jlat) = 0._dp + END IF + + END DO + + + !--- 3) Scatter in stream element: + + CALL scatter_gp(zdaylength, daylength, gdc) + + CALL test_gridpoint(daylength, 'daylength') + + DEALLOCATE (zdaylength) + + END SUBROUTINE calc_daylength +#endif +!--------------------------------------------------------------------------------------------- + + SUBROUTINE ham_m7_logtail(kproma, kbdim, klev, krow, kmod, & + ld_numb, pcmr, pr, pfrac) + + ! *ham_m7_logtail* calculates mass- or number-fraction larger than + ! the radius pr for one given mode of a superposition + ! of nclass log-normal aerosol distributions + ! + ! Author: + ! ------- + ! Philip Stier, MPI-MET 2004 + ! + ! Revision: + ! --------- + ! Sylvaine Ferrachat, ETH Zurich, 2013 + ! --> this routine computes now one mode at a time, which allows to reduce the computational load + ! for all irrelevant modes + ! + ! Method: + ! ------- + + ! + ! The calculation of the activated number fraction and mass fraction + ! from the radius of activation is done by a transformation of the + ! log-normal distribution to the error function which is then computed + ! using the routine m7_cumulative_normal: + ! + ! / x _ + ! N | 1 1 ln(R)-ln(R) 2 + ! N(0,x) = --------- | -------- exp(- - ( ----------- ) ) d ln(R) + ! ln(sigma) | sqrt(2PI) 2 ln(sigma) + ! / 0 + ! + ! /tx 2 + ! | 1 t + ! = N | -------- exp(- - ) d t + ! | sqrt(2PI) 2 + ! /-inf + ! + ! where: + ! + ! _ + ! ln(R)-ln(R) + ! t = ----------- + ! ln(sigma) + ! + ! and: + ! _ + ! ln(x)-ln(R) + ! tx = ----------- + ! ln(sigma) + + + USE mo_ham_m7ctl, ONLY: sigmaln, cmedr2mmedr + USE mo_ham_m7, ONLY: m7_cumulative_normal + + IMPLICIT NONE + + !--- Subroutine parameters: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, kmod + + LOGICAL, INTENT(in) :: ld_numb !number vs mass switch + + REAL(dp), INTENT(in) :: pcmr(kbdim,klev) !count mean radius + REAL(dp), INTENT(in) :: pr(kbdim,klev) !lower bound radius + + REAL(dp), INTENT(out) :: pfrac(kbdim,klev) + + !--- Local variables: + + INTEGER :: jl, jk + + REAL(dp) :: zt, zdummy, zeps, zfact + + + !--- 0) + + zeps= THRESHOLD + + !--- 1) + + !>>SF + IF (ld_numb) THEN !number calculation + zfact = 1._dp + ELSE !mass calculation + zfact = cmedr2mmedr(kmod) + ENDIF + !<zeps .AND. pcmr(jl,jk)>zeps) THEN + + !--- Transform number distribution to error function: + + zt=(LOG(pr(jl,jk))-LOG(pcmr(jl,jk)*zfact))/sigmaln(kmod) + + !--- Calculate the cumulative of the log-normal number distribution: + + CALL m7_cumulative_normal(zt,zdummy,pfrac(jl,jk)) + + !--- Calculate the cumulative of the log-normal mass distribution: + + ELSE IF (pr(jl,jk)zeps) THEN + + pfrac(jl,jk)=1.0_dp + + ELSE + + pfrac(jl,jk)=0.0_dp + + END IF + + END DO !kproma + END DO !klev + + END SUBROUTINE ham_m7_logtail + +!>>gf +! ------------------------------------------------------------------------------------------------------ + + SUBROUTINE ham_m7_invertlogtail(kproma, kbdim, klev, krow, kmod, & + pcmr, pxie, pcritrad ) + + ! *ham_m7_invertlogtail* calculates the critical + + ! radius for one mode with a log-normal aerosol distribution + + ! that contains a given number in the logtail + + ! The input to the subroutine is pxie, the x for erf^-1(x) + + ! Author: + + ! ------- + + ! Betty Croft, Dalhousie University 2007 + + ! Updates: + ! Grazia Frontoso, C2SM-ETHZ, adjusted for e6-h2 2013 + ! Sylvaine Ferrachat, ETHZ 2013 + ! ---> cleanup, optimization, and change so that it computes one mode only (allows to reduce the + ! computational load for all irrelevant modes) + ! + ! Method: + + ! The cumulative number in a logtail is: + ! + ! ln (R/Rg) + ! Tail = N - Fn(r) = N/2 - N/2 * erf [ --------------------] + ! sqrt (2) * ln (sigma) + ! + ! This can be solved for R by inverting the error function (inverf) + ! + ! R = Rg *exp( sqrt (2) * ln (sigma) * inverf(1 - (Tail*2/N))) + ! + ! The approximation for the inverse error function used is (valid for x in (0,1)): + ! + ! -2 ln(1-x^2) 2 ln(1-x^2) ln(1-x^2) + ! erf^-1 (x) = sqrt( --- - -------- + sqrt((( --- + ------- ))^2 - --------- )) + ! pi*a 2 pi*a 2 a + ! + ! + ! where a = 8(pi-3)/(3*pi*(4-pi)) + + USE mo_ham_m7ctl, ONLY: sigmaln + !USE mo_ham_streams, ONLY: rwet, rdry + !USE mo_ham_m7, ONLY: rwet_m7, rdry_m7 + USE mo_math_constants, ONLY: pi + + IMPLICIT NONE + + !--- Subroutine parameters: + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, kmod + + REAL(dp), INTENT(in) :: pcmr(kbdim,klev) + REAL(dp), INTENT(in) :: pxie(kbdim,klev) + + REAL(dp), INTENT(out) :: pcritrad(kbdim,klev) + + !--- Local variables: + + INTEGER :: jl, jk + + LOGICAL :: ll1(kbdim, klev), ll2(kbdim,klev), ll3(kbdim,klev) + + REAL(dp) :: za_rcp, zb(kbdim, klev), zc(kbdim, klev), & + zx2(kbdim, klev), zy(kbdim, klev), zcritrad(1:kbdim, klev), & + zpre_fact, zfact(kbdim, klev) + + za_rcp = (3._dp * pi * (4._dp-pi)) / (8._dp * (pi-3._dp)) + + zpre_fact = SQRT(2._dp)*sigmaln(kmod) + + pcritrad(1:kproma,:) = 0._dp !initialization + + ll1(1:kproma,:) = (ABS(pxie(1:kproma,:)) < 1._dp) + ll2(1:kproma,:) = (pxie(1:kproma,:) >= 1._dp) + ll3(1:kproma,:) = ll1(1:kproma,:) .AND. (pxie(1:kproma,:) < 0._dp) + + zx2(1:kproma,:) = pxie(1:kproma,:)**2 + zx2(1:kproma,:) = MERGE(zx2(1:kproma,:), 0._dp, ll1(1:kproma,:)) !to avoid illegal operations + zb(1:kproma,:) = 2.0_dp/pi*za_rcp + (0.5_dp * LOG(1.0_dp-zx2(1:kproma,:))) + zc(1:kproma,:) = LOG(1.0_dp-zx2(1:kproma,:))*za_rcp + zy(1:kproma,:) = SQRT(-zb(1:kproma,:) + SQRT(zb(1:kproma,:)**2-zc(1:kproma,:))) + zy(1:kproma,:) = MERGE(-zy(1:kproma,:), zy(1:kproma,:), ll3(1:kproma,:)) + + zfact(1:kproma,:) = zpre_fact * zy(1:kproma,:) + zcritrad(1:kproma,:) = EXP(zfact(1:kproma,:)) * pcmr(1:kproma,:) + + pcritrad(1:kproma,:) = MERGE(zcritrad(1:kproma,:), pcritrad(1:kproma,:), ll1(1:kproma,:)) + + ! Minimal scavenging of the mode by using an artificial large critical radius: + pcritrad(1:kproma,:) = MERGE(500.e-6_dp, pcritrad(1:kproma,:), ll2(1:kproma,:)) + + END SUBROUTINE ham_m7_invertlogtail +!< +!! \filename +!! mo_ham_wetdep.f90 +!! +!! \brief +!! Module to compute HAM-specific aerosol wet deposition. +!! Originally contained in xt_wetdep.f90 and reorganized here by processes: +!! in-cloud (liq/ice phase), below-cloud (liq/ice phase) +!! +!! \author Philip Stier (MPI-Met) +!! \author Betty Croft (Dalhousie University) +!! \author Sylvaine Ferrachat (ETH Zurich) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# Johann Feicher (MPI-MET) - original code (xt_wetdep) (2001) +!! -# Claudia Timmreck (MPI-MET) (2001) +!! -# Philip Stier (MPI-Met) (2001-2004) +!! -# Johann Sebastian Rast (MPI-Met) - introduction of nwetdep (2004) +!! -# Betty Croft (Dalhousie Uni.) - size-dependent below-cloud scavenging (2005-2008) +!! -# Sylvaine Ferrachat (ETH Zurich) - complete code cleanup and reorganisation (2009-11-04) +!! -# Grazia Frontoso (C2SM) - porting of the in-cloud size-dep scavenging from Betty Croft (2013-06) +!! -# Sylvaine Ferrachat (ETH Zurich) - code refactoring to optimize for mode-wise only calculations (2013-08) +!! +!! \limitations +!! None +!! +!! \details +!! Stratiform and convective cases are handled transparently (former code duplication in +!! xt_wetdep was removed). +!! +!! \bibliographic_references +!! -# Croft et al, 2009, Aerosol size-dependent below-cloud scavenging by rain and snow in the ECHAM5-HAM, +!! Atmos. Chem. Phys. ; 9 ; 4653-4675 +!! -# Croft et all, 2010, Influences of in-cloud aerosol scavenging parameterizations on aerosol concentrations +!! and wet deposition in ECHAM5-HAM, Atmos. Chem. Phys. ; 10 ; 1511-1543 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_wetdep + + USE mo_kind, ONLY: dp, THRESHOLD + USE mo_physical_constants, ONLY: tmelt + USE mo_exception, ONLY: finish + USE mo_tracdef, ONLY: ntrac, trlist, AEROSOLNUMBER, AEROSOLMASS + !USE mo_echam_cloud_params, ONLY: cthomi !eehol: this does not need to be from echam + USE mo_time_control, ONLY: time_step_len + USE mo_ham, ONLY: nclass + + +!#ifdef _OPENMP +! use omp_lib +!#endif + + IMPLICIT none + + PRIVATE + + PUBLIC :: ham_wetdep + PUBLIC :: ham_setscav ! to set the scavenging flags + PUBLIC :: ham_conv_lfraq_so2 ! ++mgs: calculate liquid fraction of SO2 for conv cases + ! ++mgs: former code from cuflx.f90 + PUBLIC :: prep_ham_mode_init + + !--- Constants: + REAL(dp), PARAMETER :: zmin = 1.e-10_dp + REAL(dp), PARAMETER :: UNDEF = -999._dp + INTEGER, PARAMETER :: NUNDEF = -999 + REAL(dp), PARAMETER :: zeps = THRESHOLD + REAL(dp), PARAMETER :: zeps_mass = 1.e-30_dp + + !--- Mode-wise scavenging coefficients and related + INTEGER, POINTER :: indexy1(:,:,:,:) => NULL() + INTEGER, POINTER :: indexy2(:,:,:,:) => NULL() ! indices necessary for lookup table searches + ! shape: (kbdim,klev,numb/mass,mode) + + REAL(dp), POINTER :: mr(:,:,:,:) => NULL() ! median radius (wet) + ! shape: (kbdim,klev, numb/mass, mode) + REAL(dp), POINTER :: rcritrad(:,:,:,:) => NULL() ! critical radius [m] (ie min bound) for scav of mode + ! shape: (kbdim,klev, liq/ice, mode) + REAL(dp), POINTER :: sfnuc(:,:,:,:,:) => NULL() ! in-cloud, nucleation scavenging fraction + ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + REAL(dp), POINTER :: sfimp(:,:,:,:,:) => NULL() ! in-cloud, impaction scavenging fraction + ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + REAL(dp), POINTER :: sfrain(:,:,:,:) => NULL() ! below-cloud, scavenging fraction by rain + ! shape: (kbdim,klev,numb/mass, mode) + REAL(dp), POINTER :: sfsnow(:,:,:,:) => NULL() ! below-cloud, scavenging fraction by snow + ! (kbdim,klev,numb/mass, mode) + !INTEGER, allocatable :: indexy1(:,:,:,:) + !INTEGER, allocatable :: indexy2(:,:,:,:) ! indices necessary for lookup table searches + ! ! shape: (kbdim,klev,numb/mass,mode) + + !REAL(dp), allocatable :: mr(:,:,:,:) ! median radius (wet) + ! ! shape: (kbdim,klev, numb/mass, mode) + !REAL(dp), allocatable :: rcritrad(:,:,:,:) ! critical radius [m] (ie min bound) for scav of mode + ! ! shape: (kbdim,klev, liq/ice, mode) + !REAL(dp), allocatable :: sfnuc(:,:,:,:,:) ! in-cloud, nucleation scavenging fraction + ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + !REAL(dp), allocatable :: sfimp(:,:,:,:,:) ! in-cloud, impaction scavenging fraction + ! ! shape: (kbdim,klev, liq/ice, numb/mass, mode) + !REAL(dp), allocatable :: sfrain(:,:,:,:) ! below-cloud, scavenging fraction by rain + ! ! shape: (kbdim,klev,numb/mass, mode) + !REAL(dp), allocatable :: sfsnow(:,:,:,:) ! below-cloud, scavenging fraction by snow + ! (kbdim,klev,numb/mass, mode) + + + INTERFACE init_var + MODULE PROCEDURE init_var_i_4d + MODULE PROCEDURE init_var_r_4d + MODULE PROCEDURE init_var_r_5d + END INTERFACE init_var + + !$OMP THREADPRIVATE(indexy1,indexy2,mr,rcritrad, sfnuc, sfimp, sfrain, sfsnow) + + CONTAINS + + !!---------------------------------------------------------------------------- + SUBROUTINE ham_wetdep(kproma, kbdim, klev, krow, ktop, kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase, & + lstrat, ptm1, pxtm1, pxtte, & + pxtp10, pxtp1c, pxtp1c_sav, & + pfrain, pfsnow, paclc, pmfu, & + pmfuxt, prhop1, pdpg, & + pm6rp, pm6dry, & + reffi, reffl, & + pnact, pfracn, & + pice, & + peffice, peffwat, pclc, prevap, & + pdepint, pdepintbc, pdepintbcr, pdepintbcs, & + pdepintic, pdepintic_nucw, pdepintic_nucm, & + pdepintic_nucc, pdepintic_impw, pdepintic_impm, pdepintic_impc) + + ! master routine for ham scavenging calculations + + ! HK --> USE mo_ham_streams, ONLY: rwet +#ifdef SALSA + USE mo_ham_salsa, ONLY: rwet_salsa +#endif + USE mo_ham_m7ctl, ONLY: cmedr2mmedr + USE mo_ham, ONLY: nham_subm, HAM_M7 + + !--- arguments + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: klev ! numer of levels + INTEGER, INTENT(in) :: krow ! geographic block number + INTEGER, INTENT(in) :: ktop ! top layer index + INTEGER, INTENT(in) :: kt ! tracer index + INTEGER, INTENT(in) :: kscavICtype ! indicates in-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavBCtype ! indicates below-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavICphase ! indicates in-cloud scavenging by water and/or ice + INTEGER, INTENT(in) :: kscavBCphase ! indicates below-cloud scavenging by water and/or ice + + LOGICAL, INTENT(in) :: lstrat ! stratiform or convective clouds case + + REAL(dp), INTENT(in) :: ptm1(kbdim,klev), & ! temperature + pxtm1(kbdim,klev,ntrac), & ! tracer mixing ratio + pfrain(kbdim,klev), & ! rain rate + pfsnow(kbdim,klev), & ! snow rate + paclc(kbdim,klev), & ! cloud cover + pmfu(kbdim,klev), & ! convective flux + pdpg(kbdim,klev), & ! grid box thickness + pice(kbdim,klev), & ! ice fraction + peffice(kbdim,klev), & ! autoconversion rate (ice) + peffwat(kbdim,klev), & ! autoconversion rate (liq water) + pclc(kbdim,klev), & ! fraction of grid covered by precip + prevap(kbdim,klev), & + pxtp1c_sav(kbdim,klev,ntrac), & ! cloudy mixing ratio, untouched by wetdep + prhop1(kbdim,klev) ! air density (t-dt) + + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: rwet_m7 + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + pxtp10(kbdim,klev,ntrac), & ! cloud-free mixing ratio + pxtp1c(kbdim,klev,ntrac), & ! cloudy mixing ratio + pmfuxt(kbdim,klev,ntrac), & ! updraft mmr + pdepint(kbdim), & ! global scavenged mr + pdepintbc(kbdim), & ! below-cloud scavenged mr + pdepintbcr(kbdim), & ! below-cloud scavenged by rain mr + pdepintbcs(kbdim), & ! below-cloud scavenged by snow mr + pdepintic(kbdim), & ! in-cloud scavenged mr + pdepintic_nucw(kbdim), & ! in-cloud by nucleation (warm cl) scav. mr + pdepintic_nucm(kbdim), & ! in-cloud by nucleation (mixed-phase cl) scav. mr + pdepintic_nucc(kbdim), & ! in-cloud by nucleation (cold cl) scav. mr + pdepintic_impw(kbdim), & ! in-cloud by impaction (warm cl) scav. mr + pdepintic_impm(kbdim), & ! in-cloud by impaction (mixed-phase cl) scav. mr + pdepintic_impc(kbdim) ! in-cloud by impaction (cold cl) scav. mr + + !--- local variables + + INTEGER :: jk, imod, itrac_phase, itmp1(kbdim,klev), itmp2(kbdim,klev) + + LOGICAL :: ll1(kbdim,klev) + LOGICAL :: ll_wat(kbdim,klev), ll_mxp(kbdim,klev), ll_ice(kbdim,klev) + + REAL(dp) :: ztmst, zrad_fac ! conversion factor for median radius (mass vs number) + + REAL(dp):: zxtice(kbdim,klev), zxtwat(kbdim,klev), & + zxtp1(kbdim,klev), zdxtwat(kbdim,klev), & + zdxtice(kbdim,klev), zdxtcol(kbdim,klev), & + zdep(kbdim,klev), & + zdxtwat_nuc(kbdim,klev), zdxtice_nuc(kbdim,klev), & + zdxtwat_imp(kbdim,klev), zdxtice_imp(kbdim,klev), & + zdxtcolr(kbdim,klev), zdxtcols(kbdim,klev), & + zdxtevapic(kbdim,klev), zdxtevapbc(kbdim,klev), & + zdxtevapic_nucw(kbdim,klev), zdxtevapic_nucm(kbdim,klev), & + zdxtevapic_nucc(kbdim,klev), & + zdxtevapic_impw(kbdim,klev), zdxtevapic_impm(kbdim,klev), & + zdxtevapic_impc(kbdim,klev), & + zdxtevapbcr(kbdim,klev), & + zdxtevapbcs(kbdim,klev), zdep_nuc(kbdim,klev), & + zdep_imp(kbdim,klev), & + zxtte(kbdim,klev), zxtp10(kbdim,klev), & + zmf(kbdim,klev), & + zxtfrac_col(kbdim,klev), zxtfrac_colr(kbdim,klev), & + zxtfrac_cols(kbdim,klev), & + zcoeffr(kbdim,klev), zcoeffs(kbdim,klev), & + ztmp1(kbdim,klev), ztmp2(kbdim,klev) + + !--- 0/ Initializations: + + ztmst = time_step_len + + imod = trlist%ti(kt)%mode + + zrad_fac = 1._dp !SF #380: proper initialization + + IF (trlist%ti(kt)%nphase == AEROSOLNUMBER) THEN + itrac_phase = 1 + ELSE IF (trlist%ti(kt)%nphase == AEROSOLMASS) THEN + itrac_phase = 2 + !TB: count to mode median calculatin needed only for M7 (see #380) + ! + IF (nham_subm == HAM_M7) THEN + zrad_fac = cmedr2mmedr(imod) + ENDIF + ENDIF + + zdxtevapic(1:kproma,:) = 0._dp + zdxtevapbc(1:kproma,:) = 0._dp + + zxtfrac_col(1:kproma,:) = 0._dp + zxtfrac_colr(1:kproma,:) = 0._dp + zxtfrac_cols(1:kproma,:) = 0._dp + + zdxtwat(1:kproma,:) = 0._dp + zdxtice(1:kproma,:) = 0._dp + + zdxtwat_nuc(1:kproma,:) = 0._dp + zdxtice_nuc(1:kproma,:) = 0._dp + zdxtwat_imp(1:kproma,:) = 0._dp + zdxtice_imp(1:kproma,:) = 0._dp + + IF (lstrat) THEN !stratiform case + + !--- Weight mixing ratios with cloud fraction: + + pxtp1c(1:kproma,:,kt) = pxtp1c(1:kproma,:,kt)*paclc(1:kproma,:) + pxtp10(1:kproma,:,kt) = pxtp10(1:kproma,:,kt)*(1._dp-paclc(1:kproma,:)) + zxtp10(1:kproma,:) = pxtp10(1:kproma,:,kt) + zmf(1:kproma,:) = pdpg(1:kproma,:) / ztmst + !SF note: zxtp10 is needed in order to transparently + ! handle the strat and the conv cases without writing too many separate, + ! but very similar, equations + ELSE + zxtp10(1:kproma,:) = 0._dp + zmf(1:kproma,:) = pmfu(1:kproma,:) + ENDIF + + !--- Associate tracer masses in the cloud fraction to water/ice phase + ! to the respective mass fractions: + zxtwat(1:kproma,:) = pxtp1c(1:kproma,:,kt)*(1._dp-pice(1:kproma,:)) + zxtice(1:kproma,:) = pxtp1c(1:kproma,:,kt)*pice(1:kproma,:) + + !--- 1/ Process: + + IF (kscavBCtype == 3 .OR. kscavICtype == 3 ) THEN !only necessary for size-dep scavenging: + + IF (indexy1(1,1,itrac_phase,imod) == NUNDEF) THEN ! mode-phase calculation required! + + !--- Select aerosol wet radius and limit it to maximal 50 um: + ! + ! If tracer is: + ! + ! aerosol number mixing ratio: use number median radius + ! aerosol mass mixing ratio: use mass median radius + !--- Convert radius from metres to micrometres + IF ( nham_subm == HAM_M7 ) THEN + + !mr(1:kproma,:,itrac_phase,imod) = MIN(rwet_m7(1:kproma,:,imod)*zrad_fac, 50.E-6_dp) + mr(1:kproma,:,itrac_phase,imod) = MIN(pm6rp(1:kproma,:,imod)*zrad_fac, 50.E-6_dp) +#ifdef SALSA + ELSE + mr(1:kproma,:,itrac_phase,imod) = MIN(rwet_salsa(1:kproma,:,imod)*zrad_fac, 50.E-6_dp) +#endif + END IF + mr(1:kproma,:,itrac_phase,imod) = mr(1:kproma,:,itrac_phase,imod)*1.E+6_dp + + ll1(1:kproma,:) = (mr(1:kproma,:,itrac_phase,imod) > zeps) !SF#294 replaced 0. by zeps + + ztmp1(1:kproma,:) = MERGE(mr(1:kproma,:,itrac_phase,imod), 1._dp, ll1(1:kproma,:)) !1. is just dummy + ztmp2(1:kproma,:) = FLOOR((3._dp*(log(1.e4_dp*ztmp1(1:kproma,:))/log(2._dp)))+1._dp) + + itmp1(1:kproma,:) = MAX(0, MIN(60, INT(ztmp2(1:kproma,:)))) + itmp2(1:kproma,:) = MAX(0, MIN(60, INT(1._dp+ztmp2(1:kproma,:)))) + + indexy1(1:kproma,:,itrac_phase,imod) = MERGE(itmp1(1:kproma,:), 0, ll1(1:kproma,:)) + indexy2(1:kproma,:,itrac_phase,imod) = MERGE(itmp2(1:kproma,:), 0, ll1(1:kproma,:)) + + ENDIF !indexy1(itrac_phase,imod) == UNDEF + + ENDIF !kscavBCtype == 3 .OR. kscavICtype == 3 + + !--- 1.1/ In-cloud scavenging + IF(kscavICtype > 0) THEN + + !--- Set logical for temperature ranges (needed several times below) + ll_wat(1:kproma,:) = (ptm1(1:kproma,:) > tmelt) + ll_mxp(1:kproma,:) = .NOT. ll_wat(1:kproma,:) .AND. (ptm1(1:kproma,:) > (tmelt-35.0_dp)) !eehol: temp greater than homogenic ice nucleation temperature + ll_ice(1:kproma,:) = (ptm1(1:kproma,:) <= (tmelt-35.0_dp)) !eehol: temp lesser or equal than homogenic ice nucleation temperature + + !--- 1.1.1/ Phase-specific calculations: + + IF (IAND(kscavICphase,1) /= 0) THEN !water scavenging on (kscavICphase==1 .or. 3) + + CALL ic_scav(kproma, kbdim, klev, krow, ktop, kt, & + imod, 1, itrac_phase, kscavICtype, & + lstrat, ll_wat, ll_mxp, ll_ice, & + prhop1, pxtp1c, pxtp1c_sav, paclc, peffwat, & + pm6rp, pm6dry, & + reffi, reffl, & + pnact, pfracn, & + zdxtwat_nuc, zdxtwat_imp, zdxtwat, zxtwat) + + ENDIF !water scavenging on + + IF (IAND(kscavICphase,2) /= 0) THEN !ice scavenging on (kscavICphase==2 .or. 3) + + CALL ic_scav(kproma, kbdim, klev, krow, ktop, kt, & + imod, 2, itrac_phase, kscavICtype, & + lstrat, ll_wat, ll_mxp, ll_ice, & + prhop1, pxtp1c, pxtp1c_sav, paclc, peffice, & + pm6rp, pm6dry, & + reffi, reffl, & + pnact, pfracn, & + zdxtice_nuc, zdxtice_imp, zdxtice, zxtice) + + ENDIF !ice scavenging on + + !--- 1.1.2/ Put everything together: + + pxtp1c(1:kproma,:,kt) = zxtwat(1:kproma,:) + zxtice(1:kproma,:) + + !--- Local deposition mass-flux [grid-box mean kg m-2 s-1]: + zdep(1:kproma,:) = (zdxtwat(1:kproma,:) + zdxtice(1:kproma,:) )*zmf(1:kproma,:) + zdep_nuc(1:kproma,:) = (zdxtwat_nuc(1:kproma,:) + zdxtice_nuc(1:kproma,:))*zmf(1:kproma,:) + zdep_imp(1:kproma,:) = (zdxtwat_imp(1:kproma,:) + zdxtice_imp(1:kproma,:))*zmf(1:kproma,:) + + DO jk=ktop,klev + + !--- Integrated deposition mass flux: + pdepintic(1:kproma) = pdepintic(1:kproma) + zdep(1:kproma,jk) + + !>>SF #458 (replacing where statements) + pdepintic_nucw(1:kproma) = pdepintic_nucw(1:kproma) & + + MERGE(zdep_nuc(1:kproma,jk), 0._dp, ll_wat(1:kproma,jk)) + pdepintic_impw(1:kproma) = pdepintic_impw(1:kproma) & + + MERGE(zdep_imp(1:kproma,jk), 0._dp, ll_wat(1:kproma,jk)) + + pdepintic_nucm(1:kproma) = pdepintic_nucm(1:kproma) & + + MERGE(zdep_nuc(1:kproma,jk), 0._dp, ll_mxp(1:kproma,jk)) + pdepintic_impm(1:kproma) = pdepintic_impm(1:kproma) & + + MERGE(zdep_imp(1:kproma,jk), 0._dp, ll_mxp(1:kproma,jk)) + + pdepintic_nucc(1:kproma) = pdepintic_nucc(1:kproma) & + + MERGE(zdep_nuc(1:kproma,jk), 0._dp, ll_ice(1:kproma,jk)) + pdepintic_impc(1:kproma) = pdepintic_impc(1:kproma) & + + MERGE(zdep_imp(1:kproma,jk), 0._dp, ll_ice(1:kproma,jk)) + !< 0) THEN + + !--- 1.2.1/ Phase-specific calculations: + + IF (IAND(kscavBCphase,1) /= 0) THEN !rain scavenging on (kscavBCphase==1 .or. 3) + + CALL bc_rain(kproma, kbdim, klev, krow, ktop, imod, itrac_phase, kscavBCtype, pfrain) + + ENDIF !rain scavenging on + + IF (IAND(kscavBCphase,2) /= 0) THEN !snow scavenging on (kscavBCphase==2 .or. 3) + + CALL bc_snow(kproma, kbdim, klev, krow, ktop, imod, itrac_phase, kscavBCtype, pfsnow) + + ENDIF !snow scavenging on + + !--- 1.2.2/ Put everything together: + + !--- Calculate fraction of below cloud scavenged tracer: + ll1(1:kproma,:) = (paclc(1:kproma,:) < zmin) + + ztmp1(1:kproma,:) = -ztmst*MAX(sfrain(1:kproma,:,itrac_phase,imod),0._dp) + ztmp2(1:kproma,:) = -ztmst*MAX(sfsnow(1:kproma,:,itrac_phase,imod),0._dp) + +!SFnote: in the above two expressions, the MAX function is here only to rule out the cases where sfrain and/or +! sfsnow is/are equal to UNDEF, ie in cases where scavenging by rain and/or snow is not relevant. +! Initializing sfrain and sfsnow to 0 at the beginning would defeat the concept of having an UNDEF value, +! which is necessary to flag cases where mode-wise (and trace phase-wise) calculations are necessary. +! This concept allows to perform these potentially expensive calculations only once per mode +! and tracer phase. + + !>>SF #458 (replacing where statements) + zcoeffr(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + zcoeffs(1:kproma,:) = MERGE(ztmp2(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + zxtfrac_colr(1:kproma,:) = 1._dp - EXP(zcoeffr(1:kproma,:) ) + zxtfrac_cols(1:kproma,:) = 1._dp - EXP( zcoeffs(1:kproma,:)) + zxtfrac_col(1:kproma,:) = 1._dp - EXP(zcoeffr(1:kproma,:)+zcoeffs(1:kproma,:)) + + zxtfrac_colr(1:kproma,:) = MAX(0._dp, MIN(1._dp, zxtfrac_colr(1:kproma,:) ) ) + zxtfrac_cols(1:kproma,:) = MAX(0._dp, MIN(1._dp, zxtfrac_cols(1:kproma,:) ) ) + zxtfrac_col(1:kproma,:) = MAX(0._dp, MIN(1._dp, zxtfrac_col(1:kproma,:) ) ) + + ll1(1:kproma,:) = (pclc(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = pxtp10(1:kproma,:,kt)*pclc(1:kproma,:)*zxtfrac_col(1:kproma,:) + zdxtcol(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + zxtp10(1:kproma,:) = zxtp10(1:kproma,:) - zdxtcol(1:kproma,:) + + zdxtcol(1:kproma,:) = zdxtcol(1:kproma,:)*pdpg(1:kproma,:)/ztmst + + ztmp1(1:kproma,:) = pxtp10(1:kproma,:,kt)*pclc(1:kproma,:)*zxtfrac_colr(1:kproma,:)*pdpg(1:kproma,:)/ztmst + zdxtcolr(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = pxtp10(1:kproma,:,kt)*pclc(1:kproma,:)*zxtfrac_cols(1:kproma,:)*pdpg(1:kproma,:)/ztmst + zdxtcols(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + !< water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; kwat_phase=2 --> mass + INTEGER, INTENT(in) :: kscavICtype ! in-cloud scavenging scheme + + LOGICAL, INTENT(in) :: lstrat ! flag to stratiform or convective clouds + LOGICAL, INTENT(in) :: ld_wat(kbdim,klev) ! liq water: ptm1 > tmelt + LOGICAL, INTENT(in) :: ld_mxp(kbdim,klev) ! mixed-phase clouds: cthomi < ptm1 <= tmelt + LOGICAL, INTENT(in) :: ld_ice(kbdim,klev) ! ice: ptm1 <= cthomi + + REAL(dp), INTENT(in) :: pxtp1c(kbdim,klev,ntrac) ! in-cloud tracer concentration + REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration, untouched by wetdep + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + REAL(dp), INTENT(in) :: paclc(kbdim,klev) ! cloud cover + REAL(dp), INTENT(in) :: peff(kbdim,klev) ! autoconversion rate (liq or ice) + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + REAL(dp), INTENT(out) :: pdxt_nuc(kbdim,klev) ! change in tracer mass assoc. with nucleation scav + ! (for relevant phase) + REAL(dp), INTENT(out) :: pdxt_imp(kbdim,klev) ! change in tracer mass assoc. with impaction scav + ! (for relevant phase) + REAL(dp), INTENT(out) :: pdxt(kbdim,klev) ! change in tracer mass (total) + ! (for relevant phase) + REAL(dp), INTENT(inout) :: pxt(kbdim,klev) ! tracer mass (total) + ! (for relevant phase) + + !local vars: + LOGICAL :: ll1(1:kproma,klev) + + REAL(dp) :: zxtfrac(kbdim,klev), zxtfrac_nuc(kbdim,klev), zxtfrac_imp(kbdim,klev) + REAL(dp) :: ztmp1(1:kbdim,klev) + + !--- Get the proper scavenging fractions + CALL get_icscavfrac(kproma, kbdim, klev, krow, ktop, kt, & + kmod, kwat_phase, ktrac_phase, kscavICtype, lstrat, & + ld_wat, ld_mxp, ld_ice, & + prhop1, pxtp1c, pxtp1c_sav, & + pm6rp, pm6dry, & !in + reffi, reffl, & !in + pnact, pfracn, & + zxtfrac, zxtfrac_nuc, zxtfrac_imp) + + !--- Change in in-cloud (strat) or updraft (conv) tracer concentration: + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (paclc(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = pxt(1:kproma,:)*zxtfrac_nuc(1:kproma,:)*peff(1:kproma,:) + pdxt_nuc(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = pxt(1:kproma,:)*zxtfrac_imp(1:kproma,:)*peff(1:kproma,:) + pdxt_imp(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + + ztmp1(1:kproma,:) = pxt(1:kproma,:)*zxtfrac(1:kproma,:)*peff(1:kproma,:) + pdxt(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + !< USE mo_ham_streams, ONLY: frac, rwet + USE mo_math_constants, ONLY: pi + !--> HK +#ifdef SALSA + USE mo_ham_salsa_cloud, ONLY: pfrac_salsa + USE mo_ham_salsa, ONLY: rwet_salsa +#endif + !<-- HK + IMPLICIT NONE + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, ktop, kt, kmod + INTEGER, INTENT(in) :: kwat_phase ! kwat_phase=1 --> water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; kwat_phase=2 --> mass + INTEGER, INTENT(in) :: kscavICtype + + LOGICAL, INTENT(in) :: lstrat ! flag to stratiform or convective clouds + LOGICAL, INTENT(in) :: ld_wat(kbdim,klev) ! liq water: ptm1 > tmelt + LOGICAL, INTENT(in) :: ld_mxp(kbdim,klev) ! mixed-phase clouds: cthomi < ptm1 <= tmelt + LOGICAL, INTENT(in) :: ld_ice(kbdim,klev) ! ice: ptm1 <= cthomi + + REAL(dp), INTENT(in) :: pxtp1c(kbdim,klev,ntrac) ! in-cloud tracer concentration multiplied by cloud fraction + REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration multiplied by cloud fraction + !SFnote: same as pxtp1c, but untouched by wetdep. + ! this is necessary for nucleation scavenging + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + REAL(dp), INTENT(in) :: pnact(kbdim,klev) !number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) !fraction of activated particles per mode + + REAL(dp), INTENT(out) :: pfrac(kbdim,klev), & ! total scavenging fraction + pfrac_nuc(kbdim,klev), & ! nucleation scavenging fraction + pfrac_imp(kbdim,klev) ! impaction scavenging fraction + + REAL(dp) :: zcoeff_warm, zcoeff_mix, zcoeff_cold + + !--> eehol: local variables for SALSA wet deposition + REAL(dp) :: area_tot(kbdim,klev) !total area of particles (ice cloud scavenging fractions) + INTEGER :: jj !for loop indices + !<-- eehol + + LOGICAL :: ll1(kbdim,klev) + + pfrac_imp(1:kproma,:) = 0._dp + + SELECT CASE(kscavICtype) + + !CASE(1) ! prescribed fractions !not implemented here + + CASE(2) ! mode-wise fractions + + !--- Nucleation scavenging params: + + IF (lstrat) THEN !SF stratiform case + + IF (kwat_phase == 1) THEN + !water + zcoeff_warm = csr_strat_wat(kmod) + zcoeff_mix = csr_strat_mix(kmod) + zcoeff_cold = csr_strat_wat(kmod) + ELSE + !ice + zcoeff_warm = csr_strat_wat(kmod) + zcoeff_mix = csr_strat_mix(kmod) + zcoeff_cold = csr_strat_ice(kmod) + ENDIF + + !>>SF #458 (replacing where statements) + pfrac_nuc(1:kproma,:) = MERGE(zcoeff_warm, 0._dp , ld_wat(1:kproma,:)) + pfrac_nuc(1:kproma,:) = MERGE(zcoeff_mix, pfrac_nuc(1:kproma,:), ld_mxp(1:kproma,:)) + pfrac_nuc(1:kproma,:) = MERGE(zcoeff_cold, pfrac_nuc(1:kproma,:), ld_ice(1:kproma,:)) + !< zeps) !SF#294 replaced 0. by zeps + pfrac_imp(1:kproma,:) = MERGE(sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod), 0._dp, ll1(1:kproma,:)) + + ELSE !GF convective case + + pfrac_nuc(1:kproma,:) = csr_conv(kmod) !no size-dep nuc scavenging for convective clouds! + + ENDIF +#ifdef SALSA + CASE(HAM_SALSA) + !! --> eehol: IMPLEMENTING SALSA SCAVENGING FRACTIONS + !This calculation is only needed once for every bin so it doesnt need to be calculated for each tracer! + + IF (lstrat) THEN !stratiform case SALSA + + SELECT CASE(kwat_phase) + CASE(1) !liq water + + !Nucleation scavenging SALSA for liq water: + !Liq water case the nucleation scavenging fraction from Abdul-Razzak&Ghan + !HK: changed for pfrac_wetdep to pfrac_salsa + pfrac_nuc(1:kproma,:) = pfrac_salsa(1:kproma,:,kmod) !pfrac_salsa comes from mo_ham_salsa_cloud.f90 (pfracn) + + CASE(2) !ice + !Nucleation scavenging SALSA for ice: + + area_tot(1:kproma,:) = 0._dp !make area_tot = 0 before the summation + + DO jj=1,nclass !calculate the total area of aerosols (this could be done outside of module) + + area_tot(1:kproma,:) = area_tot(1:kproma,:) + (4._dp*pi*(rwet_salsa(1:kproma,:,jj))**(2._dp)) & + *pxtp1c_sav(1:kproma,:,jj) + END DO + + !calculate the nucleation scavenging fractions for ice case as: area of particles in bin i divided by total area of particles in all bins (A_i/A_tot) + pfrac_nuc(1:kproma,:) = ((4._dp*pi*(rwet_salsa(1:kproma,:,jj))**(2._dp)) & + *pxtp1c_sav(1:kproma,:,kmod)) / (area_tot(1:kproma,:)+zeps) + + END SELECT + !Impaction scavenging SALSA (same as M7 but for bins): + IF (sfimp(1,1,kwat_phase,ktrac_phase,kmod) == UNDEF) THEN + + CALL ic_scav_imp(kproma, kbdim, klev, krow, ktop, kwat_phase, & + ktrac_phase, kmod, prhop1, pxtp1c, reffi, reffl) + + END IF + + ll1(1:kproma,:) = (pxtp1c(1:kproma,:,kt) > zeps) !SF#294 replaced 0. by zeps + pfrac_imp(1:kproma,:) = MERGE(sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod), 0._dp, ll1(1:kproma,:)) + + ELSE !convective case + + pfrac_nuc(1:kproma,:) = csr_conv(kmod) !no size-dep nuc scavenging for convective clouds! + + END IF + !! <-- eehol +#endif + END SELECT + + CASE default + + CALL finish('get_icscavfrac','wrong kscavICtype value') + + END SELECT !kscavICtype + + !--- Calculate the scavenging parameter as sum over the processes: + pfrac(1:kproma,:) = pfrac_nuc(1:kproma,:) + pfrac_imp(1:kproma,:) + + !--- Confine the fraction between 0% and 100% : + !pfrac(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac(1:kproma,:))) + !pfrac_nuc(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_nuc(1:kproma,:))) + !pfrac_imp(1:kproma,:) = MAX(0._dp, MIN(1._dp, pfrac_imp(1:kproma,:))) + pfrac(1:kproma,:) = MAX(0._dp, MIN(1._dp, (1._dp)*pfrac(1:kproma,:))) !eehol: test + pfrac_nuc(1:kproma,:) = MAX(0._dp, MIN(1._dp, (1._dp)*pfrac_nuc(1:kproma,:))) !eehol: test + pfrac_imp(1:kproma,:) = MAX(0._dp, MIN(1._dp, (1._dp)*pfrac_imp(1:kproma,:))) !eehol: test + + END SUBROUTINE get_icscavfrac + + !! --------------------------------------------------------------------------------------- + SUBROUTINE ic_scav_nuc(kproma, kbdim, klev, krow, kwat_phase, & + ktrac_phase, kmod, pm6rp, pm6dry, pnact, pfracn,prhop1, pxtp1c_sav) + +! Grazia Frontoso, C2SM-ETHZ, 2013 - compute in-cloud size dependent +! nucleation scavenging coefficients +! from Croft et al. 2010 +! +!SF: output of this subroutine: sfnuc +! sfnuc is defined in the whole module instead of being passed as an intent(out) because +! it needs to be kept from one instance to the next + + USE mo_ham_m7_trac, ONLY: idt_nks, idt_nas, idt_ncs + !HK --> USE mo_activ, ONLY: na, idt_cdnc, idt_icnc + !--> HK + USE mo_activ, ONLY: idt_cdnc, idt_icnc + !HK --> USE mo_ham_streams, ONLY: frac, rdry, rwet + USE mo_ham_tools, ONLY: ham_m7_logtail, ham_m7_invertlogtail + USE mo_param_switches, ONLY: ncd_activ + USE mo_tracdef, ONLY: ntrac + !-->HK + !USE mo_ham_m7, ONLY: rwet_m7, rdry_m7 + !USE mo_ham_activ, ONLY: pfrac_m7, pna_m7 + !<--HK + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow + INTEGER, INTENT(in) :: kwat_phase ! kwat_phase=1 --> water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; ktrac_phase=2 --> mass + INTEGER, INTENT(in) :: kmod ! mode index + + REAL(dp), INTENT(in) :: pxtp1c_sav(kbdim,klev,ntrac) ! in-cloud tracer concentration as untouched by wetdep + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + REAL(dp), INTENT(in) :: pm6rp(kbdim,klev,nclass), pm6dry(kbdim,klev,nclass) ! m7: + REAL(dp), INTENT(in) :: pnact(kbdim,klev) ! number of activated particles [m-3] + REAL(dp), INTENT(in) :: pfracn(kbdim,klev,nclass) ! fraction of activated particles per mode + + ! Local variables + REAL(dp) :: zxie(kbdim,klev), & ! factor for inverse error function calculation + zxtp1c(kbdim,klev,ntrac), & ! in-cloud tracer concentration + ztmp1(kbdim,klev) + + !--> HK + !REAL(dp), POINTER :: zrad_p(:,:) ! Pointer to dry or wet radius field, + ! ! as appropriate to activation scheme + REAL(dp) :: zrad_p(kbdim,klev) + + LOGICAL :: ll_trac_phase, ll1(kbdim,klev) + + ! Initialization + + !SF note: the following is M7-dependent! It could be potentially generalized + ! by replacing this condition by a true size condition + some generalized way + ! of distinguishing mixed modes from insoluble ones + ! For now, this is kept so, and size-dep nucleation scavenging is made unuseable + ! if an alternate aerosol microphysics scheme is used (e.g. SALSA) + IF (kmod < 2 .OR. kmod > 4) THEN !do nothing for non-relevant modes + sfnuc(1:kproma,:,kwat_phase,ktrac_phase,kmod) = 0._dp + RETURN + ENDIF + + IF (ncd_activ == 2) THEN + zrad_p(:,:) = pm6dry(:,:,kmod) ! ARG activation is based on dry radius + ELSE + zrad_p(:,:) = pm6rp(:,:,kmod) ! Lin & Leaitch activation is based on wet radius + END IF + + ! Critical radius for scavenged mode. + ! This calculation is only needed *once per mode* because it is not + ! dependent of whether this is a mass or number calculation + ! (ie not dependent on ktrac_phase) + + IF (rcritrad(1,1,kwat_phase,kmod) == UNDEF) THEN ! rcritrad calculation required + zxtp1c(1:kproma,:,:) = pxtp1c_sav(1:kproma,:,:) + zxtp1c(1:kproma,:,:) = MAX(0._dp,zxtp1c(1:kproma,:,:)) !SFnote: this should be already ensured elsewhere!! + !SF--> to cleanup + SELECT CASE(kwat_phase) + CASE(1) !liq water + + ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_cdnc) > zeps_mass) .AND. & + (pnact(1:kproma,:) > zeps) + + !--> HK: modified to use variables instead of streams + ztmp1(1:kproma,:) = zxtp1c(1:kproma,:,idt_cdnc) * prhop1(1:kproma,:) & + * pfracn(1:kproma,:,kmod) / MAX(pnact(1:kproma,:),zeps) + !<-- HK + + CASE(2) !ice + + ll1(1:kproma,:) = (zxtp1c(1:kproma,:,idt_icnc) > zeps_mass) + +!>>SF to refactor! (M7-dependency) + ! PLS: Replaced X+zpes with MAX(x,zeps) for correctness when x~O(zeps). + ! Could replace zeps with TINY, but current ZEPS value is alright (ie << epsilon(1) in single precision) + IF (kmod == 4) ztmp1(1:kproma,:) = MIN(1._dp, & + zxtp1c(1:kproma,:,idt_icnc) / MAX(zxtp1c(1:kproma,:,idt_ncs),zeps)) + IF (kmod == 3) ztmp1(1:kproma,:) = MIN(1._dp, & + MAX(0._dp, & + zxtp1c(1:kproma,:,idt_icnc)-zxtp1c(1:kproma,:,idt_ncs)) & + /MAX(zxtp1c(1:kproma,:,idt_nas),zeps)) + IF (kmod == 2) ztmp1(1:kproma,:) = MIN(1._dp, & + MAX(0._dp, & + zxtp1c(1:kproma,:,idt_icnc)-zxtp1c(1:kproma,:,idt_ncs) & + -zxtp1c(1:kproma,:,idt_nas)) & + /MAX(zxtp1c(1:kproma,:,idt_nks),zeps)) +!< water; kwat_phase=2 --> ice + INTEGER, INTENT(in) :: ktrac_phase ! ktrac_phase=1 --> number; ktrac_phase=2 --> mass + INTEGER, INTENT(in) :: kmod + REAL(dp), INTENT(in) :: reffi(kbdim,klev,1), reffl(kbdim,klev,1) + REAL(dp), INTENT(in) :: pxtp1c(kbdim,klev,ntrac) ! in-cloud tracer mass + REAL(dp), INTENT(in) :: prhop1(kbdim,klev) ! air density (t-dt) + + ! Local variables + + INTEGER :: jk, jl + INTEGER :: indexdropx1(kbdim,klev), indexdropx2(kbdim,klev), & + indexplatex1(kbdim,klev), indexplatex2(kbdim,klev), & + itmp1(kbdim,klev), itmp2(kbdim,klev) + + REAL(dp) :: X1(kbdim,klev), X2(kbdim,klev), & + Y1(kbdim,klev), Y2(kbdim,klev) , & + Q11(kbdim,klev), Q12(kbdim,klev) , & + Q21(kbdim,klev), Q22(kbdim,klev) + + REAL(dp) :: zscavcoefplate(kbdim,klev), & ! scavenging coefficient for plate (ice) + zscavcoefdrop(kbdim,klev), & ! scavenging coefficient for cloud droplets + zicnc(kbdim,klev) ! ice crystal number concentration [# m-3] + + LOGICAL :: ll1(kbdim,klev), ll2(kbdim,klev) + + ! Initialization + Q11(1:kproma,:) = 0._dp + Q12(1:kproma,:) = 0._dp + Q21(1:kproma,:) = 0._dp + Q22(1:kproma,:) = 0._dp + X1(1:kproma,:) = 0._dp + X2(1:kproma,:) = 0._dp + Y1(1:kproma,:) = 0._dp + Y2(1:kproma,:) = 0._dp + + zicnc(1:kproma,:) = pxtp1c(1:kproma,:,idt_icnc)*prhop1(1:kproma,:) + + ! Calculate collision rates + SELECT CASE(kwat_phase) + + CASE(1) !liq + + ll1(1:kproma,:) = (reffl(1:kproma,:,krow) > zeps) !SF#294 replaced 0. by zeps + + itmp1(1:kproma,:) = MAX(0, MIN(9,INT(FLOOR(reffl(1:kproma,:,krow)/5._dp)))) + itmp2(1:kproma,:) = MAX(0, MIN(9,INT(1._dp + FLOOR(reffl(1:kproma,:,krow)/5._dp)))) + + indexdropx1(1:kproma,:) = MERGE(itmp1(1:kproma,:), 0, ll1(1:kproma,:)) + indexdropx2(1:kproma,:) = MERGE(itmp2(1:kproma,:), 0, ll1(1:kproma,:)) + + ! Assign in-cloud impaction scavenging coefficients (droplets) + SELECT CASE(ktrac_phase) + CASE(1) ! number + DO jk=ktop,klev + DO jl=1,kproma + Q11(jl,jk) = scavdropn(indexdropx1(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q12(jl,jk) = scavdropn(indexdropx2(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q21(jl,jk) = scavdropn(indexdropx1(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + Q22(jl,jk) = scavdropn(indexdropx2(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + CASE(2) ! mass + DO jk=ktop,klev + DO jl=1,kproma + Q11(jl,jk) = scavdropm(indexdropx1(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q12(jl,jk) = scavdropm(indexdropx2(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q21(jl,jk) = scavdropm(indexdropx1(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + Q22(jl,jk) = scavdropm(indexdropx2(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + END SELECT + + DO jk=ktop,klev + DO jl=1,kproma + X1(jl,jk) = cdroprad(indexdropx1(jl,jk)) + X2(jl,jk) = cdroprad(indexdropx2(jl,jk)) + Y1(jl,jk) = caerorad(indexy1(jl,jk,ktrac_phase,kmod)) + Y2(jl,jk) = caerorad(indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + + CALL scavcoef_bilinterp (kproma, kbdim, klev, krow, ktop, & + reffl(:,:,krow), mr(:,:,ktrac_phase,kmod), & + X1, X2, Y1, Y2, & + Q11, Q12, Q21, Q22, & + zscavcoefdrop) + + sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod) = zscavcoefdrop(1:kproma,:) + + CASE(2) !ice + + ll1(1:kproma,:) = (zicnc(1:kproma,:) >= zeps) + + ll2(1:kproma,:) = ll1(1:kproma,:) .AND. & + (reffi(1:kproma,:,krow) < 50._dp) .AND. & + (reffi(1:kproma,:,krow) >= 1._dp) + + itmp1(1:kproma,:) = MAX(0, MIN(10,INT(FLOOR(reffi(1:kproma,:,krow)/5._dp)))) + itmp2(1:kproma,:) = MAX(0, MIN(10,INT(1._dp + FLOOR(reffi(1:kproma,:,krow)/5._dp)))) + + indexplatex1(1:kproma,:) = MERGE(itmp1(1:kproma,:), 0, ll2(1:kproma,:)) + indexplatex2(1:kproma,:) = MERGE(itmp2(1:kproma,:), 0, ll2(1:kproma,:)) + + ll2(1:kproma,:) = ll1(1:kproma,:) .AND. & + (reffi(1:kproma,:,krow) >= 50._dp) + + itmp1(1:kproma,:) = MAX(0, MIN(34,INT(8._dp+FLOOR(reffi(1:kproma,:,krow)/50._dp)))) + itmp2(1:kproma,:) = MAX(0, MIN(34,INT(9._dp + FLOOR(reffi(1:kproma,:,krow)/50._dp)))) + + indexplatex1(1:kproma,:) = MERGE(itmp1(1:kproma,:), indexplatex1(1:kproma,:), ll2(1:kproma,:)) + indexplatex2(1:kproma,:) = MERGE(itmp2(1:kproma,:), indexplatex2(1:kproma,:), ll2(1:kproma,:)) + + ! Assign in-cloud impaction scavenging coefficients (ice plates) + DO jk=ktop,klev + DO jl=1,kproma + Q11(jl,jk) = scaviceplate(indexplatex1(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q12(jl,jk) = scaviceplate(indexplatex2(jl,jk),indexy1(jl,jk,ktrac_phase,kmod)) + Q21(jl,jk) = scaviceplate(indexplatex1(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + Q22(jl,jk) = scaviceplate(indexplatex2(jl,jk),indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + + DO jk=ktop,klev + DO jl=1,kproma + X1(jl,jk) = cplaterad(indexplatex1(jl,jk)) + X2(jl,jk) = cplaterad(indexplatex2(jl,jk)) + Y1(jl,jk) = caerorad(indexy1(jl,jk,ktrac_phase,kmod)) + Y2(jl,jk) = caerorad(indexy2(jl,jk,ktrac_phase,kmod)) + ENDDO + ENDDO + + CALL scavcoef_bilinterp (kproma, kbdim, klev, & + krow, ktop, & + reffi(:,:,krow), mr(:,:,ktrac_phase,kmod), & + X1, X2, Y1, Y2, & + Q11, Q12, Q21, Q22, & + zscavcoefplate) + + sfimp(1:kproma,:,kwat_phase,ktrac_phase,kmod) = 1._dp - EXP(-zscavcoefplate(1:kproma,:)*1.e-6_dp & + *zicnc(1:kproma,:)*time_step_len) + + END SELECT !kwat_phase + + END SUBROUTINE ic_scav_imp + + !!---------------------------------------------------------------------------- + SUBROUTINE bc_rain(kproma, kbdim, klev, krow, ktop, kmod, & !in + ktrac_phase, kscavBCtype, & !in + pfrain) !in + + ! Below-cloud rain scavenging routine + + +!SF: output of this subroutine: sfrain +! sfrain is defined in the whole module instead of being passed as an intent(out) because +! it needs to be kept from one instance to the next + + USE mo_ham_tools, ONLY: scavcoef_bilinterp + USE mo_ham_wetdep_data, ONLY: cbcr, cscavbcrn, cscavbcrm, crainrate, caerorad + + INTEGER, INTENT(in) :: kproma, kbdim, klev, krow, ktop, kmod, kscavBCtype, ktrac_phase + REAL(dp), INTENT(in) :: pfrain(kbdim,klev) + + !local vars: + INTEGER :: jk, jl, indexbcrx1(kbdim,klev), indexbcrx2(kbdim,klev) + + LOGICAL :: ll1(1:kproma, klev) + + REAL(dp) :: ztmp1(kbdim,klev), & + X1(kbdim,klev), X2(kbdim,klev), & + Y1(kbdim,klev), Y2(kbdim,klev) , & + Q11(kbdim,klev), Q12(kbdim,klev) , & + Q21(kbdim,klev), Q22(kbdim,klev) + + SELECT CASE (kscavBCtype) + !CASE (1) ! prescribed scavenging ratio !!not implemented yet!! + !sfrain(1:kproma,:,ktrac_phase,kmod) = + + CASE (2) ! standard mode-wise scavenging ratio + + sfrain(1:kproma,:,ktrac_phase,kmod) = cbcr(kmod)*pfrain(1:kproma,:) + + CASE (3) ! aerosol size-dep scavenging coeff + + IF (sfrain(1,1,ktrac_phase,kmod) == UNDEF) THEN !calculation required! + + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (pfrain(1:kproma,:) > 0._dp) + + ztmp1(1:kproma,:) = MERGE(pfrain(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy value + ztmp1(1:kproma,:) = FLOOR( 2._dp*log10( 3600._dp*ztmp1(1:kproma,:) ) + 5._dp ) + + indexbcrx1(1:kproma,:) = MERGE( & + MAX( 0, MIN( 9, INT( ztmp1(1:kproma,:) ))), & + 0, & + ll1(1:kproma,:) ) + + indexbcrx2(1:kproma,:) = MERGE( & + MAX( 0, MIN( 9, INT( 1_dp + ztmp1(1:kproma,:) ))), & + 0, & + ll1(1:kproma,:) ) + !<>SF #458 (replacing where statements) + ll1(1:kproma,:) = (pfsnow(1:kproma,:) > zeps) !SF#294 replaced 0. by zeps + + ztmp1(1:kproma,:) = (0.6_dp/0.027_dp)*pfsnow(1:kproma,:)*sfsnow(1:kproma,:,ktrac_phase,kmod) + + sfsnow(1:kproma,:,ktrac_phase,kmod) = MERGE(ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:)) + !<idt_so2, idt_so4s=>idt_so4, idt_ms4 !TB (!SF #397) + USE mo_ham_salsactl, ONLY: fn2b, in1a +#endif + USE mo_species, ONLY: speclist + USE mo_ham_species, ONLY: id_so2 + + INTEGER, INTENT(in) :: kproma, kbdim, klev + REAL(dp), INTENT(in) :: ptu(kbdim,klev) + REAL(dp), INTENT(in) :: pxtu(kbdim,klev,ntrac) + REAL(dp), INTENT(in) :: prhou(kbdim,klev) + REAL(dp), INTENT(in) :: pmlwc(kbdim,klev) + + REAL(dp), INTENT(out) :: plfrac_so2(kbdim,klev) !liquid fraction of SO2 + + !--- local variables: + LOGICAL :: ll1(kbdim, klev) + + REAL(dp) :: zqtp1(kbdim,klev), ze2(kbdim,klev), & + ze3(kbdim,klev), zfac(kbdim,klev), & + zfac4(kbdim,klev), & !!mgs(S)!! + zso4l(kbdim,klev), zso2l(kbdim,klev), & + zza(kbdim,klev), zzb(kbdim,klev), & + zzp(kbdim,klev), zzq(kbdim,klev), & + zqhp(kbdim,klev), & + zheneff(kbdim,klev), zhp(kbdim,klev), & + zhenry_so2(2) + + REAL(dp) :: tmp1(kbdim,klev) + INTEGER :: jt, jn_idt_so4, jdx, idt_so2_loc + INTEGER, ALLOCATABLE :: idt_so4_array(:) + + !--- Calculate the solubility of SO2. Total sulfate + ! is only used to calculate the ph of cloud water: + + zhenry_so2(:) = speclist(id_so2)%henry(:) ! Henry's law constant and activation energy + + zqtp1(1:kproma,:) = 1._dp/ptu(1:kproma,:) - 1._dp/298._dp + ze2(1:kproma,:) = zhenry_so2(1)*EXP(zhenry_so2(2)*zqtp1(1:kproma,:)) + ze3(1:kproma,:) = 1.2e-02_dp*EXP(2010._dp*zqtp1(1:kproma,:)) + + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = (pmlwc(1:kproma,:) > 1.E-15_dp) + !tmp1 = 1000._dp/(pmlwc(1:kproma,:)*mw_so2) + + where (pmlwc(1:kproma,:) > 1.E-15_dp) tmp1 = 1000._dp/(pmlwc(1:kproma,:)*mw_so2) + !zfac(1:kproma,:) = MERGE( 1000._dp/(pmlwc(1:kproma,:)*mw_so2), 0._dp, ll1(1:kproma,:) ) + zfac(1:kproma,:) = MERGE( tmp1, 0._dp, ll1(1:kproma,:)) + + where (pmlwc(1:kproma,:) > 1.E-15_dp) tmp1 = 1000._dp/(pmlwc(1:kproma,:)*mw_so4) + !zfac4(1:kproma,:) = MERGE( 1000._dp/(pmlwc(1:kproma,:)*mw_so4), 0._dp, ll1(1:kproma,:) ) + zfac4(1:kproma,:) = MERGE( tmp1, 0._dp, ll1(1:kproma,:)) + !< 0) .AND. (.NOT. ANY( (idt_so4_array(:) <= 0) ))) .AND. & + ((nham_subm == HAM_M7) .OR. (nham_subm == HAM_SALSA)) ) THEN + + zso4l(1:kproma,:) = 0._dp + + DO jt=1,jn_idt_so4 + jdx = idt_so4_array(jt) + zso4l(1:kproma,:) = zso4l(1:kproma,:) + pxtu(1:kproma,:,jdx) + ENDDO + + zso4l(1:kproma,:) = zso4l(1:kproma,:) * zfac4(1:kproma,:) !!mgs(S)!! + + zso4l(1:kproma,:) = MAX(zso4l(1:kproma,:),0._dp) + + zso2l(1:kproma,:) = pxtu(1:kproma,:,idt_so2_loc)*zfac(1:kproma,:) + zso2l(1:kproma,:) = MAX(zso2l(1:kproma,:),0._dp) + + zza(1:kproma,:) = ze2(1:kproma,:)*8.2e-02_dp*ptu(1:kproma,:) & + * pmlwc(1:kproma,:)*prhou(1:kproma,:)*1.e-03_dp + + zzb(1:kproma,:) = 2.5e-06_dp + zso4l(1:kproma,:) + zzp(1:kproma,:) = ( zza(1:kproma,:)*ze3(1:kproma,:) - zzb(1:kproma,:) & + - zza(1:kproma,:)*zzb(1:kproma,:) & + ) / (1._dp+zza(1:kproma,:)) * 0.5_dp + + zzq(1:kproma,:) = - zza(1:kproma,:)*ze3(1:kproma,:) & + * (zzb(1:kproma,:)+zso2l(1:kproma,:)) / (1._dp+zza(1:kproma,:)) + + zhp(1:kproma,:) = -zzp(1:kproma,:) + SQRT(zzp(1:kproma,:)**2 - zzq(1:kproma,:)) + + zqhp(1:kproma,:) = 1._dp / zhp(1:kproma,:) + + zheneff(1:kproma,:) = 1._dp + ze3(1:kproma,:)*zqhp(1:kproma,:) + + plfrac_so2(1:kproma,:) = zza(1:kproma,:)*zheneff(1:kproma,:) + + ELSE + + plfrac_so2(1:kproma,:) = 0._dp + + END IF + + END SUBROUTINE ham_conv_lfraq_so2 + + !----------------------------------------------------------------------- + + SUBROUTINE prep_ham_mode_init(kproma, kbdim, klev) + + ! Sylvaine Ferrachat Sept. 2013: + ! + ! This routine initializes all the necessary variables that are mode-dependent + ! and not tracer-dependent. + ! This allows to reduce significantly the computing load by computing these variables + ! only once per mode and phase (number or mass), when relevant. + ! + ! 'Mode' is meant to be general here (not M7-dependent) + + INTEGER, INTENT(in) :: kproma, kbdim, klev + + CALL init_var(kproma, kbdim, klev, indexy1) + CALL init_var(kproma, kbdim, klev, indexy2) + CALL init_var(kproma, kbdim, klev, mr) + CALL init_var(kproma, kbdim, klev, rcritrad) + CALL init_var(kproma, kbdim, klev, sfnuc) + CALL init_var(kproma, kbdim, klev, sfimp) + CALL init_var(kproma, kbdim, klev, sfrain) + CALL init_var(kproma, kbdim, klev, sfsnow) + + END SUBROUTINE prep_ham_mode_init + + !----------------------------------------------------------------------- + + SUBROUTINE init_var_r_4d(kproma, kbdim, klev, pvar) + + ! small utility to allocate, if relevant, and initialize + + INTEGER, INTENT(in) :: kproma, kbdim, klev + REAL(dp), POINTER :: pvar(:,:,:,:) + + IF (.NOT. ASSOCIATED(pvar)) ALLOCATE(pvar(kbdim,klev,2,nclass)) + pvar(1:kproma,:,:,:) = UNDEF + + END SUBROUTINE init_var_r_4d + + !----------------------------------------------------------------------- + + SUBROUTINE init_var_r_5d(kproma, kbdim, klev, pvar) + + ! small utility to allocate, if relevant, and initialize + + INTEGER, INTENT(in) :: kproma, kbdim, klev + REAL(dp), POINTER :: pvar(:,:,:,:,:) + + IF (.NOT. ASSOCIATED(pvar)) ALLOCATE(pvar(kbdim,klev,2,2,nclass)) + pvar(1:kproma,:,:,:,:) = UNDEF + + END SUBROUTINE init_var_r_5d + + !----------------------------------------------------------------------- + + SUBROUTINE init_var_i_4d(kproma, kbdim, klev, kvar) + + ! small utility to allocate, if relevant, and initialize + + INTEGER, INTENT(in) :: kproma, kbdim, klev + INTEGER, POINTER:: kvar(:,:,:,:) + + IF (.NOT. ASSOCIATED(kvar)) ALLOCATE(kvar(kbdim,klev,2,nclass)) + kvar(1:kproma,:,:,:) = NUNDEF + + END SUBROUTINE init_var_i_4d + + !----------------------------------------------------------------------- + SUBROUTINE ham_setscav(kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase) + + ! this routine sets the wetdep flags to handle: + ! - in-cloud and/or below-cloud scav + ! - water and/or ice scav (resp. rain and/or snow) + + ! kscavICtype = 0 no in-cloud scavenging + ! 1 prescribed in-cloud scavenging params + ! 2 standard in-cloud scav params (mode-wise step function) + ! 3 aerosol-size dependent in-cloud params + ! + ! kscavBCtype = 0 no below-cloud scavenging + ! 1 prescribed below-cloud scavenging params + ! 2 standard below-cloud scav params (mode-wise step function) + ! 3 aerosol-size dependent in-cloud params + ! + ! kscavICphase = 0 no in-cloud scavenging + ! 1 in-cloud water-only scavenging + ! 2 in-cloud ice-only scavenging + ! 3 in-cloud water+ice scavenging + ! + ! kscavBCphase = 0 no below-cloud scavenging + ! 1 below-cloud rain-only scavenging + ! 2 below-cloud snow-only scavenging + ! 3 below-cloud rain+snow scavenging + + USE mo_tracdef, ONLY: trlist + !SF demo - deactivated USE mo_species, ONLY: speclist + + INTEGER, INTENT(in) :: kt + INTEGER, INTENT(out) :: kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase + + ! local variables + !SF demo - deactivated INTEGER :: ispec + + !--- Normal setting: + + SELECT CASE (trlist%ti(kt)%nwetdep) + CASE(0) !wet dep off + kscavICtype = 0 + kscavBCtype = 0 + kscavICphase = 0 + kscavBCphase = 0 + CASE(1) !standard scavenging (mode-wise step function params) + kscavICtype = 2 + kscavBCtype = 2 + kscavICphase = 3 + kscavBCphase = 3 + CASE(2) !standard in-cloud scavenging + aerosol size-dependent below-cloud scavenging + kscavICtype = 2 + kscavBCtype = 3 + kscavICphase = 3 + kscavBCphase = 3 + CASE(3) !aerosol size-dependent in-cloud + below-cloud scavenging + kscavICtype = 3 + kscavBCtype = 3 + kscavICphase = 3 + kscavBCphase = 3 +! CASE(4) !Define here your own additional setup +! kscavICtype = +! kscavBCtype = +! kscavICphase = +! kscavBCphase = + CASE default + CALL finish('ham_setscav','wrong nwetdep setting') + END SELECT + + !--- Tracer- or species-specific setting (demo -activate it if necessary-) + +! ispec = trlist%ti(kt)%spid +! IF (speclist(ispec)%shortname == 'BC') THEN +! kscavICtype = +! kscavBCtype = +! kscavICphase = +! kscavBCphase = +! ENDIF + + END SUBROUTINE ham_setscav + +END MODULE mo_ham_wetdep diff --git a/ifs-source/arpifs/m7/module/mo_ham_wetdep_data.F90 b/ifs-source/arpifs/m7/module/mo_ham_wetdep_data.F90 new file mode 100644 index 00000000..2d688eb6 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_ham_wetdep_data.F90 @@ -0,0 +1,1098 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_ham_wetdep_data.f90 +!! +!! \brief +!! mo_ham_wetdep_data contains variables and switches for the HAM aerosol wet-deposition +!! +!! \author Philip Stier (Caltech) +!! +!! \responsible_coder +!! Sylvaine Ferrachat, sylvaine.ferrachat@env.ethz.ch +!! +!! \revision_history +!! -# Philip Stier (Caltech) - original code (2006-07) +!! -# Grazia Frontoso, C2SM-ETHZ (2013) +!! new lookup table for plate +!! (in-cloud size dependent wetscavenging) +!! provided by Betty Croft +!! -# Sylvaine Ferrachat (ETH Zurich) (2015-02) +!! Generalization to handle both M7 and SALSA +!! +!! \limitations +!! None +!! +!! \details +!! None +!! +!! \bibliographic_references +!! - Stier P. et al, The aerosol-climate model ECHAM5-HAM, ACP, 5, 1125–1156, 2005 +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_ham_wetdep_data + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + INTEGER, PARAMETER :: izrain = 9 + INTEGER, PARAMETER :: izsnow = 1 + INTEGER, PARAMETER :: izrad = 60 + INTEGER, PARAMETER :: izcloud = 10 + INTEGER, PARAMETER :: iziceplate = 34 + + !--- 1) Prescribed in-cloud scaventing ratios: + + !--- 1.1) Stratiform: + + !--- Liquid water clouds: + REAL(dp), ALLOCATABLE :: csr_strat_wat(:) + + !--- Mixed phase clouds: + REAL(dp), ALLOCATABLE :: csr_strat_mix(:) + + !--- Ice Clouds: + REAL(dp), ALLOCATABLE :: csr_strat_ice(:) + + !--- 1.2) Convective Clouds: + REAL(dp), ALLOCATABLE :: csr_conv(:) + + !--- 2) Prescribed below-cloud scavenging ratios: + + !--- Mean mass scavenging coefficients normalized by rain-rate [kg m-2]: + + ! Rain: + REAL(dp), ALLOCATABLE :: cbcr(:) + + ! Snow: + REAL(dp), ALLOCATABLE :: cbcs(:) + + !--- + + INTEGER :: ja + REAL(dp) :: scaviceplate(0:iziceplate,0:izrad) + + !--- Below-cloud scavenging look-up tables ----------------------------- + + REAL(dp), PARAMETER :: crainrate(0:izrain) = (/ & + 0.0000E+00_dp, 0.2778E-05_dp, 0.8784E-05_dp, 0.2778E-04_dp, & + 0.8784E-04_dp, 0.2778E-03_dp, 0.8784E-03_dp, 0.2778E-02_dp, & + 0.8784E-02_dp, 0.2778E-01_dp /) + + REAL(dp), PARAMETER :: caerorad(0:izrad) = (/ & + 0.0000E+00_dp, 0.1000E-03_dp, 0.1260E-03_dp, 0.1587E-03_dp, & + 0.2000E-03_dp, 0.2520E-03_dp, 0.3175E-03_dp, 0.4000E-03_dp, & + 0.5040E-03_dp, 0.6350E-03_dp, 0.8000E-03_dp, 0.1008E-02_dp, & + 0.1270E-02_dp, 0.1600E-02_dp, 0.2016E-02_dp, 0.2540E-02_dp, & + 0.3200E-02_dp, 0.4032E-02_dp, 0.5080E-02_dp, 0.6400E-02_dp, & + 0.8063E-02_dp, 0.1016E-01_dp, 0.1280E-01_dp, 0.1613E-01_dp, & + 0.2032E-01_dp, 0.2560E-01_dp, 0.3225E-01_dp, 0.4064E-01_dp, & + 0.5120E-01_dp, 0.6451E-01_dp, 0.8127E-01_dp, 0.1024E+00_dp, & + 0.1290E+00_dp, 0.1625E+00_dp, 0.2048E+00_dp, 0.2580E+00_dp, & + 0.3251E+00_dp, 0.4096E+00_dp, 0.5161E+00_dp, 0.6502E+00_dp, & + 0.8192E+00_dp, 0.1032E+01_dp, 0.1300E+01_dp, 0.1638E+01_dp, & + 0.2064E+01_dp, 0.2601E+01_dp, 0.3277E+01_dp, 0.4129E+01_dp, & + 0.5202E+01_dp, 0.6554E+01_dp, 0.8257E+01_dp, 0.1040E+02_dp, & + 0.1311E+02_dp, 0.1651E+02_dp, 0.2081E+02_dp, 0.2621E+02_dp, & + 0.3303E+02_dp, 0.4161E+02_dp, 0.5243E+02_dp, 0.6606E+02_dp, & + 0.8323E+02_dp /) + + REAL(DP) :: csnowcolleff(0:1,0:60) = RESHAPE ( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.1624E+00_dp, 0.1196E+00_dp, 0.8811E-01_dp, 0.6496E-01_dp, 0.4792E-01_dp, 0.3540E-01_dp, 0.2617E-01_dp, & + 0.1938E-01_dp, 0.1438E-01_dp, 0.1070E-01_dp, 0.7978E-02_dp, 0.5973E-02_dp, 0.4493E-02_dp, 0.3401E-02_dp, 0.2593E-02_dp, & + 0.1993E-02_dp, 0.1545E-02_dp, 0.1207E-02_dp, 0.9507E-03_dp, 0.7539E-03_dp, 0.6022E-03_dp, 0.4846E-03_dp, 0.3931E-03_dp, & + 0.3947E-03_dp, 0.3970E-03_dp, 0.4009E-03_dp, 0.4069E-03_dp, 0.4165E-03_dp, 0.4317E-03_dp, 0.4559E-03_dp, 0.4942E-03_dp, & + 0.5551E-03_dp, 0.6518E-03_dp, 0.8053E-03_dp, 0.9211E-01_dp, 0.4867E+00_dp, 0.7042E+00_dp, 0.8248E+00_dp, 0.8955E+00_dp, & + 0.9393E+00_dp, 0.9684E+00_dp, 0.9902E+00_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, & + 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, & + 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp, 0.1000E+01_dp /), (/2, 61/), order = (/2, 1/) ) + + REAL(DP) :: cscavbcrn(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.7446E-18_dp, 0.6828E-17_dp, 0.5371E-16_dp, 0.3786E-15_dp, 0.2391E-14_dp, 0.1354E-13_dp, 0.6875E-13_dp, & + 0.3131E-12_dp, 0.1279E-11_dp, 0.4693E-11_dp, 0.1546E-10_dp, 0.4575E-10_dp, 0.1218E-09_dp, 0.2917E-09_dp, 0.6296E-09_dp, & + 0.1226E-08_dp, 0.2156E-08_dp, 0.3433E-08_dp, 0.4963E-08_dp, 0.6531E-08_dp, 0.7856E-08_dp, 0.8684E-08_dp, 0.8875E-08_dp, & + 0.8455E-08_dp, 0.7580E-08_dp, 0.6467E-08_dp, 0.5316E-08_dp, 0.4262E-08_dp, 0.3377E-08_dp, 0.2681E-08_dp, 0.2190E-08_dp, & + 0.1971E-08_dp, 0.2267E-08_dp, 0.3747E-08_dp, 0.7981E-08_dp, 0.1822E-07_dp, 0.4038E-07_dp, 0.8402E-07_dp, 0.1625E-06_dp, & + 0.2921E-06_dp, 0.4886E-06_dp, 0.7640E-06_dp, 0.1121E-05_dp, 0.1553E-05_dp, 0.2041E-05_dp, 0.2560E-05_dp, 0.3083E-05_dp, & + 0.3588E-05_dp, 0.4060E-05_dp, 0.4490E-05_dp, 0.4879E-05_dp, 0.5236E-05_dp, 0.5580E-05_dp, 0.5957E-05_dp, 0.6476E-05_dp, & + 0.7375E-05_dp, 0.9155E-05_dp, 0.1280E-04_dp, 0.2020E-04_dp, 0.3479E-04_dp, & + 0.0000E+00_dp, 0.1568E-17_dp, 0.1389E-16_dp, 0.1093E-15_dp, 0.7702E-15_dp, 0.4865E-14_dp, 0.2755E-13_dp, 0.1399E-12_dp, & + 0.6372E-12_dp, 0.2604E-11_dp, 0.9551E-11_dp, 0.3146E-10_dp, 0.9313E-10_dp, 0.2479E-09_dp, 0.5939E-09_dp, 0.1282E-08_dp, & + 0.2496E-08_dp, 0.4392E-08_dp, 0.6995E-08_dp, 0.1011E-07_dp, 0.1331E-07_dp, 0.1602E-07_dp, 0.1772E-07_dp, 0.1812E-07_dp, & + 0.1727E-07_dp, 0.1550E-07_dp, 0.1324E-07_dp, 0.1089E-07_dp, 0.8744E-08_dp, 0.6943E-08_dp, 0.5545E-08_dp, 0.4617E-08_dp, & + 0.4412E-08_dp, 0.5727E-08_dp, 0.1066E-07_dp, 0.2402E-07_dp, 0.5545E-07_dp, 0.1221E-06_dp, 0.2510E-06_dp, 0.4787E-06_dp, & + 0.8478E-06_dp, 0.1399E-05_dp, 0.2158E-05_dp, 0.3129E-05_dp, 0.4286E-05_dp, 0.5578E-05_dp, 0.6937E-05_dp, 0.8293E-05_dp, & + 0.9586E-05_dp, 0.1077E-04_dp, 0.1184E-04_dp, 0.1278E-04_dp, 0.1361E-04_dp, 0.1436E-04_dp, 0.1508E-04_dp, 0.1588E-04_dp, & + 0.1703E-04_dp, 0.1913E-04_dp, 0.2338E-04_dp, 0.3218E-04_dp, 0.4992E-04_dp, & + 0.0000E+00_dp, 0.3177E-17_dp, 0.2816E-16_dp, 0.2215E-15_dp, 0.1561E-14_dp, 0.9864E-14_dp, 0.5586E-13_dp, 0.2837E-12_dp, & + 0.1292E-11_dp, 0.5280E-11_dp, 0.1937E-10_dp, 0.6380E-10_dp, 0.1889E-09_dp, 0.5028E-09_dp, 0.1205E-08_dp, 0.2601E-08_dp, & + 0.5065E-08_dp, 0.8912E-08_dp, 0.1420E-07_dp, 0.2053E-07_dp, 0.2703E-07_dp, 0.3255E-07_dp, 0.3600E-07_dp, 0.3684E-07_dp, & + 0.3513E-07_dp, 0.3154E-07_dp, 0.2696E-07_dp, 0.2220E-07_dp, 0.1785E-07_dp, 0.1420E-07_dp, 0.1142E-07_dp, 0.9752E-08_dp, & + 0.1001E-07_dp, 0.1466E-07_dp, 0.3000E-07_dp, 0.7005E-07_dp, 0.1626E-06_dp, 0.3558E-06_dp, 0.7235E-06_dp, 0.1363E-05_dp, & + 0.2384E-05_dp, 0.3885E-05_dp, 0.5923E-05_dp, 0.8495E-05_dp, 0.1152E-04_dp, 0.1487E-04_dp, 0.1837E-04_dp, 0.2182E-04_dp, & + 0.2510E-04_dp, 0.2807E-04_dp, 0.3071E-04_dp, 0.3299E-04_dp, 0.3496E-04_dp, 0.3666E-04_dp, 0.3816E-04_dp, 0.3960E-04_dp, & + 0.4124E-04_dp, 0.4376E-04_dp, 0.4859E-04_dp, 0.5863E-04_dp, 0.7945E-04_dp, & + 0.0000E+00_dp, 0.6413E-17_dp, 0.5685E-16_dp, 0.4472E-15_dp, 0.3152E-14_dp, 0.1991E-13_dp, 0.1128E-12_dp, 0.5726E-12_dp, & + 0.2608E-11_dp, 0.1066E-10_dp, 0.3910E-10_dp, 0.1288E-09_dp, 0.3814E-09_dp, 0.1015E-08_dp, 0.2433E-08_dp, 0.5252E-08_dp, & + 0.1023E-07_dp, 0.1800E-07_dp, 0.2869E-07_dp, 0.4149E-07_dp, 0.5464E-07_dp, 0.6579E-07_dp, 0.7281E-07_dp, 0.7452E-07_dp, & + 0.7110E-07_dp, 0.6387E-07_dp, 0.5461E-07_dp, 0.4500E-07_dp, 0.3622E-07_dp, 0.2890E-07_dp, 0.2344E-07_dp, 0.2061E-07_dp, & + 0.2288E-07_dp, 0.3739E-07_dp, 0.8200E-07_dp, 0.1961E-06_dp, 0.4561E-06_dp, 0.9932E-06_dp, 0.2003E-05_dp, 0.3740E-05_dp, & + 0.6479E-05_dp, 0.1045E-04_dp, 0.1579E-04_dp, 0.2245E-04_dp, 0.3022E-04_dp, 0.3873E-04_dp, 0.4756E-04_dp, 0.5626E-04_dp, & + 0.6445E-04_dp, 0.7186E-04_dp, 0.7834E-04_dp, 0.8387E-04_dp, 0.8853E-04_dp, 0.9243E-04_dp, 0.9573E-04_dp, 0.9861E-04_dp, & + 0.1013E-03_dp, 0.1047E-03_dp, 0.1101E-03_dp, 0.1211E-03_dp, 0.1443E-03_dp, & + 0.0000E+00_dp, 0.1288E-16_dp, 0.1142E-15_dp, 0.8980E-15_dp, 0.6330E-14_dp, 0.3999E-13_dp, 0.2265E-12_dp, 0.1150E-11_dp, & + 0.5238E-11_dp, 0.2141E-10_dp, 0.7853E-10_dp, 0.2587E-09_dp, 0.7661E-09_dp, 0.2040E-08_dp, 0.4887E-08_dp, 0.1055E-07_dp, & + 0.2055E-07_dp, 0.3617E-07_dp, 0.5764E-07_dp, 0.8338E-07_dp, 0.1098E-06_dp, 0.1323E-06_dp, 0.1464E-06_dp, 0.1499E-06_dp, & + 0.1431E-06_dp, 0.1286E-06_dp, 0.1100E-06_dp, 0.9067E-07_dp, 0.7304E-07_dp, 0.5844E-07_dp, 0.4786E-07_dp, 0.4349E-07_dp, & + 0.5227E-07_dp, 0.9372E-07_dp, 0.2162E-06_dp, 0.5251E-06_dp, 0.1223E-05_dp, 0.2654E-05_dp, 0.5325E-05_dp, 0.9880E-05_dp, & + 0.1700E-04_dp, 0.2724E-04_dp, 0.4086E-04_dp, 0.5772E-04_dp, 0.7724E-04_dp, 0.9851E-04_dp, 0.1205E-03_dp, 0.1420E-03_dp, & + 0.1623E-03_dp, 0.1805E-03_dp, 0.1963E-03_dp, 0.2096E-03_dp, 0.2205E-03_dp, 0.2295E-03_dp, 0.2368E-03_dp, 0.2429E-03_dp, & + 0.2481E-03_dp, 0.2531E-03_dp, 0.2596E-03_dp, 0.2712E-03_dp, 0.2956E-03_dp, & + 0.0000E+00_dp, 0.2569E-16_dp, 0.2278E-15_dp, 0.1792E-14_dp, 0.1263E-13_dp, 0.7980E-13_dp, 0.4519E-12_dp, 0.2295E-11_dp, & + 0.1045E-10_dp, 0.4272E-10_dp, 0.1567E-09_dp, 0.5164E-09_dp, 0.1529E-08_dp, 0.4071E-08_dp, 0.9755E-08_dp, 0.2106E-07_dp, & + 0.4103E-07_dp, 0.7222E-07_dp, 0.1151E-06_dp, 0.1665E-06_dp, 0.2193E-06_dp, 0.2642E-06_dp, 0.2925E-06_dp, 0.2995E-06_dp, & + 0.2859E-06_dp, 0.2570E-06_dp, 0.2199E-06_dp, 0.1814E-06_dp, 0.1463E-06_dp, 0.1174E-06_dp, 0.9713E-07_dp, 0.9147E-07_dp, & + 0.1187E-06_dp, 0.2297E-06_dp, 0.5496E-06_dp, 0.1349E-05_dp, 0.3148E-05_dp, 0.6815E-05_dp, 0.1363E-04_dp, 0.2517E-04_dp, & + 0.4312E-04_dp, 0.6879E-04_dp, 0.1027E-03_dp, 0.1445E-03_dp, 0.1926E-03_dp, 0.2448E-03_dp, 0.2985E-03_dp, 0.3511E-03_dp, & + 0.4003E-03_dp, 0.4445E-03_dp, 0.4826E-03_dp, 0.5142E-03_dp, 0.5397E-03_dp, 0.5600E-03_dp, 0.5762E-03_dp, 0.5892E-03_dp, & + 0.5998E-03_dp, 0.6088E-03_dp, 0.6177E-03_dp, 0.6298E-03_dp, 0.6534E-03_dp, & + 0.0000E+00_dp, 0.5088E-16_dp, 0.4513E-15_dp, 0.3550E-14_dp, 0.2503E-13_dp, 0.1581E-12_dp, 0.8954E-12_dp, 0.4547E-11_dp, & + 0.2071E-10_dp, 0.8465E-10_dp, 0.3106E-09_dp, 0.1023E-08_dp, 0.3030E-08_dp, 0.8067E-08_dp, 0.1933E-07_dp, 0.4174E-07_dp, & + 0.8131E-07_dp, 0.1431E-06_dp, 0.2281E-06_dp, 0.3300E-06_dp, 0.4348E-06_dp, 0.5238E-06_dp, 0.5799E-06_dp, 0.5939E-06_dp, & + 0.5672E-06_dp, 0.5099E-06_dp, 0.4365E-06_dp, 0.3602E-06_dp, 0.2907E-06_dp, 0.2339E-06_dp, 0.1958E-06_dp, 0.1914E-06_dp, & + 0.2669E-06_dp, 0.5501E-06_dp, 0.1353E-05_dp, 0.3349E-05_dp, 0.7822E-05_dp, 0.1692E-04_dp, 0.3375E-04_dp, 0.6221E-04_dp, & + 0.1063E-03_dp, 0.1691E-03_dp, 0.2518E-03_dp, 0.3531E-03_dp, 0.4694E-03_dp, 0.5953E-03_dp, 0.7244E-03_dp, 0.8506E-03_dp, & + 0.9686E-03_dp, 0.1074E-02_dp, 0.1164E-02_dp, 0.1239E-02_dp, 0.1298E-02_dp, 0.1343E-02_dp, 0.1379E-02_dp, 0.1406E-02_dp, & + 0.1428E-02_dp, 0.1445E-02_dp, 0.1460E-02_dp, 0.1473E-02_dp, 0.1493E-02_dp, & + 0.0000E+00_dp, 0.9998E-16_dp, 0.8871E-15_dp, 0.6979E-14_dp, 0.4919E-13_dp, 0.3108E-12_dp, 0.1760E-11_dp, 0.8938E-11_dp, & + 0.4071E-10_dp, 0.1664E-09_dp, 0.6105E-09_dp, 0.2012E-08_dp, 0.5956E-08_dp, 0.1586E-07_dp, 0.3800E-07_dp, 0.8206E-07_dp, & + 0.1599E-06_dp, 0.2814E-06_dp, 0.4485E-06_dp, 0.6490E-06_dp, 0.8551E-06_dp, 0.1030E-05_dp, 0.1141E-05_dp, 0.1168E-05_dp, & + 0.1116E-05_dp, 0.1003E-05_dp, 0.8591E-06_dp, 0.7092E-06_dp, 0.5729E-06_dp, 0.4625E-06_dp, 0.3920E-06_dp, 0.3983E-06_dp, & + 0.5941E-06_dp, 0.1290E-05_dp, 0.3240E-05_dp, 0.8071E-05_dp, 0.1887E-04_dp, 0.4080E-04_dp, 0.8132E-04_dp, 0.1497E-03_dp, & + 0.2553E-03_dp, 0.4054E-03_dp, 0.6027E-03_dp, 0.8438E-03_dp, 0.1120E-02_dp, 0.1418E-02_dp, 0.1723E-02_dp, 0.2021E-02_dp, & + 0.2299E-02_dp, 0.2547E-02_dp, 0.2758E-02_dp, 0.2930E-02_dp, 0.3064E-02_dp, 0.3165E-02_dp, 0.3242E-02_dp, 0.3299E-02_dp, & + 0.3343E-02_dp, 0.3377E-02_dp, 0.3402E-02_dp, 0.3420E-02_dp, 0.3434E-02_dp, & + 0.0000E+00_dp, 0.1947E-15_dp, 0.1729E-14_dp, 0.1360E-13_dp, 0.9585E-13_dp, 0.6055E-12_dp, 0.3429E-11_dp, 0.1742E-10_dp, & + 0.7933E-10_dp, 0.3242E-09_dp, 0.1190E-08_dp, 0.3920E-08_dp, 0.1161E-07_dp, 0.3090E-07_dp, 0.7406E-07_dp, 0.1599E-06_dp, & + 0.3115E-06_dp, 0.5484E-06_dp, 0.8742E-06_dp, 0.1265E-05_dp, 0.1667E-05_dp, 0.2008E-05_dp, 0.2224E-05_dp, 0.2278E-05_dp, & + 0.2176E-05_dp, 0.1957E-05_dp, 0.1676E-05_dp, 0.1384E-05_dp, 0.1119E-05_dp, 0.9063E-06_dp, 0.7783E-06_dp, 0.8226E-06_dp, & + 0.1306E-05_dp, 0.2961E-05_dp, 0.7564E-05_dp, 0.1894E-04_dp, 0.4434E-04_dp, 0.9585E-04_dp, 0.1909E-03_dp, 0.3512E-03_dp, & + 0.5985E-03_dp, 0.9495E-03_dp, 0.1410E-02_dp, 0.1972E-02_dp, 0.2615E-02_dp, 0.3308E-02_dp, 0.4017E-02_dp, 0.4707E-02_dp, & + 0.5350E-02_dp, 0.5922E-02_dp, 0.6406E-02_dp, 0.6798E-02_dp, 0.7100E-02_dp, 0.7323E-02_dp, 0.7485E-02_dp, 0.7603E-02_dp, & + 0.7689E-02_dp, 0.7753E-02_dp, 0.7798E-02_dp, 0.7822E-02_dp, 0.7822E-02_dp /), & + (/10, 61/), ORDER = (/2, 1/) ) + + REAL(DP) :: cscavbcrm(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.6821E-12_dp, 0.1941E-11_dp, 0.5172E-11_dp, 0.1341E-10_dp, 0.3358E-10_dp, 0.8062E-10_dp, 0.1839E-09_dp, & + 0.3945E-09_dp, 0.7881E-09_dp, 0.1454E-08_dp, 0.2459E-08_dp, 0.3799E-08_dp, 0.5352E-08_dp, 0.6883E-08_dp, 0.8108E-08_dp, & + 0.8789E-08_dp, 0.8827E-08_dp, 0.8280E-08_dp, 0.7329E-08_dp, 0.6190E-08_dp, 0.5052E-08_dp, 0.4035E-08_dp, 0.3194E-08_dp, & + 0.2545E-08_dp, 0.2108E-08_dp, 0.1979E-08_dp, 0.2473E-08_dp, 0.4419E-08_dp, 0.9706E-08_dp, 0.2212E-07_dp, 0.4839E-07_dp, & + 0.9899E-07_dp, 0.1881E-06_dp, 0.3323E-06_dp, 0.5468E-06_dp, 0.8418E-06_dp, 0.1218E-05_dp, 0.1665E-05_dp, 0.2162E-05_dp, & + 0.2685E-05_dp, 0.3206E-05_dp, 0.3704E-05_dp, 0.4166E-05_dp, 0.4586E-05_dp, 0.4967E-05_dp, 0.5318E-05_dp, 0.5664E-05_dp, & + 0.6062E-05_dp, 0.6643E-05_dp, 0.7693E-05_dp, 0.9803E-05_dp, 0.1413E-04_dp, 0.2285E-04_dp, 0.3993E-04_dp, 0.7236E-04_dp, & + 0.1321E-03_dp, 0.2387E-03_dp, 0.4225E-03_dp, 0.7260E-03_dp, 0.1202E-02_dp, & + 0.0000E+00_dp, 0.1436E-11_dp, 0.3950E-11_dp, 0.1053E-10_dp, 0.2728E-10_dp, 0.6834E-10_dp, 0.1641E-09_dp, 0.3743E-09_dp, & + 0.8031E-09_dp, 0.1605E-08_dp, 0.2961E-08_dp, 0.5010E-08_dp, 0.7740E-08_dp, 0.1091E-07_dp, 0.1403E-07_dp, 0.1654E-07_dp, & + 0.1794E-07_dp, 0.1802E-07_dp, 0.1692E-07_dp, 0.1499E-07_dp, 0.1267E-07_dp, 0.1035E-07_dp, 0.8281E-08_dp, 0.6572E-08_dp, & + 0.5277E-08_dp, 0.4486E-08_dp, 0.4538E-08_dp, 0.6453E-08_dp, 0.1282E-07_dp, 0.2937E-07_dp, 0.6731E-07_dp, 0.1460E-06_dp, & + 0.2948E-06_dp, 0.5522E-06_dp, 0.9613E-06_dp, 0.1560E-05_dp, 0.2370E-05_dp, 0.3389E-05_dp, 0.4584E-05_dp, 0.5898E-05_dp, & + 0.7263E-05_dp, 0.8609E-05_dp, 0.9880E-05_dp, 0.1104E-04_dp, 0.1208E-04_dp, 0.1299E-04_dp, 0.1380E-04_dp, 0.1453E-04_dp, & + 0.1525E-04_dp, 0.1611E-04_dp, 0.1741E-04_dp, 0.1988E-04_dp, 0.2494E-04_dp, 0.3537E-04_dp, 0.5624E-04_dp, 0.9656E-04_dp, & + 0.1717E-03_dp, 0.3068E-03_dp, 0.5403E-03_dp, 0.9265E-03_dp, 0.1533E-02_dp, & + 0.0000E+00_dp, 0.2912E-11_dp, 0.8009E-11_dp, 0.2134E-10_dp, 0.5533E-10_dp, 0.1386E-09_dp, 0.3328E-09_dp, 0.7592E-09_dp, & + 0.1629E-08_dp, 0.3256E-08_dp, 0.6008E-08_dp, 0.1017E-07_dp, 0.1571E-07_dp, 0.2214E-07_dp, 0.2850E-07_dp, 0.3359E-07_dp, & + 0.3645E-07_dp, 0.3664E-07_dp, 0.3442E-07_dp, 0.3051E-07_dp, 0.2581E-07_dp, 0.2111E-07_dp, 0.1691E-07_dp, 0.1346E-07_dp, & + 0.1091E-07_dp, 0.9584E-08_dp, 0.1057E-07_dp, 0.1699E-07_dp, 0.3654E-07_dp, 0.8592E-07_dp, 0.1971E-06_dp, 0.4243E-06_dp, & + 0.8472E-06_dp, 0.1568E-05_dp, 0.2695E-05_dp, 0.4321E-05_dp, 0.6489E-05_dp, 0.9180E-05_dp, 0.1230E-04_dp, 0.1570E-04_dp, & + 0.1920E-04_dp, 0.2263E-04_dp, 0.2584E-04_dp, 0.2873E-04_dp, 0.3128E-04_dp, 0.3349E-04_dp, 0.3539E-04_dp, 0.3703E-04_dp, & + 0.3850E-04_dp, 0.3995E-04_dp, 0.4173E-04_dp, 0.4462E-04_dp, 0.5036E-04_dp, 0.6233E-04_dp, 0.8698E-04_dp, 0.1358E-03_dp, & + 0.2285E-03_dp, 0.3973E-03_dp, 0.6914E-03_dp, 0.1180E-02_dp, 0.1947E-02_dp, & + 0.0000E+00_dp, 0.5877E-11_dp, 0.1617E-10_dp, 0.4309E-10_dp, 0.1117E-09_dp, 0.2798E-09_dp, 0.6720E-09_dp, 0.1533E-08_dp, & + 0.3290E-08_dp, 0.6576E-08_dp, 0.1214E-07_dp, 0.2054E-07_dp, 0.3174E-07_dp, 0.4475E-07_dp, 0.5760E-07_dp, 0.6792E-07_dp, & + 0.7371E-07_dp, 0.7413E-07_dp, 0.6966E-07_dp, 0.6178E-07_dp, 0.5230E-07_dp, 0.4280E-07_dp, 0.3432E-07_dp, 0.2741E-07_dp, & + 0.2248E-07_dp, 0.2053E-07_dp, 0.2479E-07_dp, 0.4427E-07_dp, 0.1008E-06_dp, 0.2409E-06_dp, 0.5527E-06_dp, 0.1182E-05_dp, & + 0.2341E-05_dp, 0.4292E-05_dp, 0.7308E-05_dp, 0.1160E-04_dp, 0.1726E-04_dp, 0.2421E-04_dp, 0.3220E-04_dp, 0.4083E-04_dp, & + 0.4966E-04_dp, 0.5827E-04_dp, 0.6630E-04_dp, 0.7349E-04_dp, 0.7975E-04_dp, 0.8506E-04_dp, 0.8952E-04_dp, 0.9327E-04_dp, & + 0.9645E-04_dp, 0.9925E-04_dp, 0.1020E-03_dp, 0.1057E-03_dp, 0.1120E-03_dp, 0.1252E-03_dp, 0.1529E-03_dp, 0.2098E-03_dp, & + 0.3208E-03_dp, 0.5270E-03_dp, 0.8913E-03_dp, 0.1501E-02_dp, 0.2465E-02_dp, & + 0.0000E+00_dp, 0.1180E-10_dp, 0.3247E-10_dp, 0.8654E-10_dp, 0.2244E-09_dp, 0.5620E-09_dp, 0.1350E-08_dp, 0.3080E-08_dp, & + 0.6609E-08_dp, 0.1321E-07_dp, 0.2438E-07_dp, 0.4126E-07_dp, 0.6379E-07_dp, 0.8994E-07_dp, 0.1158E-06_dp, 0.1365E-06_dp, & + 0.1482E-06_dp, 0.1491E-06_dp, 0.1402E-06_dp, 0.1244E-06_dp, 0.1053E-06_dp, 0.8626E-07_dp, 0.6925E-07_dp, 0.5551E-07_dp, & + 0.4611E-07_dp, 0.4395E-07_dp, 0.5801E-07_dp, 0.1128E-06_dp, 0.2672E-06_dp, 0.6459E-06_dp, 0.1482E-05_dp, 0.3156E-05_dp, & + 0.6214E-05_dp, 0.1132E-04_dp, 0.1914E-04_dp, 0.3018E-04_dp, 0.4460E-04_dp, 0.6216E-04_dp, 0.8219E-04_dp, 0.1037E-03_dp, & + 0.1257E-03_dp, 0.1470E-03_dp, 0.1668E-03_dp, 0.1845E-03_dp, 0.1997E-03_dp, 0.2124E-03_dp, 0.2228E-03_dp, 0.2313E-03_dp, & + 0.2383E-03_dp, 0.2442E-03_dp, 0.2493E-03_dp, 0.2545E-03_dp, 0.2617E-03_dp, 0.2754E-03_dp, 0.3048E-03_dp, 0.3673E-03_dp, & + 0.4942E-03_dp, 0.7375E-03_dp, 0.1177E-02_dp, 0.1924E-02_dp, 0.3116E-02_dp, & + 0.0000E+00_dp, 0.2354E-10_dp, 0.6480E-10_dp, 0.1727E-09_dp, 0.4478E-09_dp, 0.1122E-08_dp, 0.2694E-08_dp, 0.6147E-08_dp, & + 0.1319E-07_dp, 0.2637E-07_dp, 0.4867E-07_dp, 0.8238E-07_dp, 0.1274E-06_dp, 0.1796E-06_dp, 0.2312E-06_dp, 0.2727E-06_dp, & + 0.2961E-06_dp, 0.2980E-06_dp, 0.2802E-06_dp, 0.2486E-06_dp, 0.2107E-06_dp, 0.1726E-06_dp, 0.1388E-06_dp, 0.1116E-06_dp, & + 0.9408E-07_dp, 0.9382E-07_dp, 0.1345E-06_dp, 0.2799E-06_dp, 0.6821E-06_dp, 0.1661E-05_dp, 0.3811E-05_dp, 0.8097E-05_dp, & + 0.1588E-04_dp, 0.2881E-04_dp, 0.4850E-04_dp, 0.7613E-04_dp, 0.1120E-03_dp, 0.1555E-03_dp, 0.2048E-03_dp, 0.2575E-03_dp, & + 0.3112E-03_dp, 0.3632E-03_dp, 0.4114E-03_dp, 0.4542E-03_dp, 0.4907E-03_dp, 0.5208E-03_dp, 0.5450E-03_dp, 0.5642E-03_dp, & + 0.5795E-03_dp, 0.5919E-03_dp, 0.6020E-03_dp, 0.6108E-03_dp, 0.6200E-03_dp, 0.6339E-03_dp, 0.6623E-03_dp, 0.7253E-03_dp, & + 0.8604E-03_dp, 0.1132E-02_dp, 0.1640E-02_dp, 0.2526E-02_dp, 0.3965E-02_dp, & + 0.0000E+00_dp, 0.4664E-10_dp, 0.1284E-09_dp, 0.3422E-09_dp, 0.8872E-09_dp, 0.2223E-08_dp, 0.5339E-08_dp, 0.1218E-07_dp, & + 0.2614E-07_dp, 0.5226E-07_dp, 0.9646E-07_dp, 0.1633E-06_dp, 0.2524E-06_dp, 0.3560E-06_dp, 0.4584E-06_dp, 0.5408E-06_dp, & + 0.5873E-06_dp, 0.5910E-06_dp, 0.5558E-06_dp, 0.4933E-06_dp, 0.4181E-06_dp, 0.3428E-06_dp, 0.2758E-06_dp, 0.2229E-06_dp, & + 0.1907E-06_dp, 0.1993E-06_dp, 0.3079E-06_dp, 0.6766E-06_dp, 0.1684E-05_dp, 0.4126E-05_dp, 0.9469E-05_dp, 0.2009E-04_dp, & + 0.3933E-04_dp, 0.7116E-04_dp, 0.1195E-03_dp, 0.1870E-03_dp, 0.2743E-03_dp, 0.3797E-03_dp, 0.4988E-03_dp, 0.6260E-03_dp, & + 0.7550E-03_dp, 0.8797E-03_dp, 0.9950E-03_dp, 0.1097E-02_dp, 0.1184E-02_dp, 0.1254E-02_dp, 0.1310E-02_dp, 0.1353E-02_dp, & + 0.1386E-02_dp, 0.1412E-02_dp, 0.1432E-02_dp, 0.1449E-02_dp, 0.1463E-02_dp, 0.1477E-02_dp, 0.1501E-02_dp, 0.1555E-02_dp, & + 0.1682E-02_dp, 0.1958E-02_dp, 0.2507E-02_dp, 0.3505E-02_dp, 0.5173E-02_dp, & + 0.0000E+00_dp, 0.9165E-10_dp, 0.2524E-09_dp, 0.6727E-09_dp, 0.1744E-08_dp, 0.4369E-08_dp, 0.1049E-07_dp, 0.2395E-07_dp, & + 0.5139E-07_dp, 0.1027E-06_dp, 0.1896E-06_dp, 0.3210E-06_dp, 0.4964E-06_dp, 0.7000E-06_dp, 0.9015E-06_dp, 0.1064E-05_dp, & + 0.1155E-05_dp, 0.1163E-05_dp, 0.1093E-05_dp, 0.9708E-06_dp, 0.8230E-06_dp, 0.6750E-06_dp, 0.5439E-06_dp, 0.4413E-06_dp, & + 0.3841E-06_dp, 0.4207E-06_dp, 0.6961E-06_dp, 0.1598E-05_dp, 0.4043E-05_dp, 0.9949E-05_dp, 0.2285E-04_dp, 0.4845E-04_dp, & + 0.9472E-04_dp, 0.1711E-03_dp, 0.2868E-03_dp, 0.4481E-03_dp, 0.6564E-03_dp, 0.9069E-03_dp, 0.1189E-02_dp, 0.1491E-02_dp, & + 0.1795E-02_dp, 0.2090E-02_dp, 0.2361E-02_dp, 0.2600E-02_dp, 0.2802E-02_dp, 0.2965E-02_dp, 0.3091E-02_dp, 0.3186E-02_dp, & + 0.3257E-02_dp, 0.3310E-02_dp, 0.3352E-02_dp, 0.3384E-02_dp, 0.3407E-02_dp, 0.3423E-02_dp, 0.3438E-02_dp, 0.3468E-02_dp, & + 0.3559E-02_dp, 0.3793E-02_dp, 0.4316E-02_dp, 0.5344E-02_dp, 0.7155E-02_dp, & + 0.0000E+00_dp, 0.1785E-09_dp, 0.4918E-09_dp, 0.1311E-08_dp, 0.3398E-08_dp, 0.8514E-08_dp, 0.2045E-07_dp, 0.4666E-07_dp, & + 0.1002E-06_dp, 0.2002E-06_dp, 0.3696E-06_dp, 0.6257E-06_dp, 0.9674E-06_dp, 0.1364E-05_dp, 0.1757E-05_dp, 0.2073E-05_dp, & + 0.2252E-05_dp, 0.2267E-05_dp, 0.2132E-05_dp, 0.1893E-05_dp, 0.1605E-05_dp, 0.1317E-05_dp, 0.1063E-05_dp, 0.8663E-06_dp, & + 0.7675E-06_dp, 0.8813E-06_dp, 0.1551E-05_dp, 0.3690E-05_dp, 0.9457E-05_dp, 0.2336E-04_dp, 0.5368E-04_dp, 0.1138E-03_dp, & + 0.2224E-03_dp, 0.4015E-03_dp, 0.6723E-03_dp, 0.1049E-02_dp, 0.1535E-02_dp, 0.2119E-02_dp, 0.2777E-02_dp, 0.3477E-02_dp, & + 0.4184E-02_dp, 0.4866E-02_dp, 0.5493E-02_dp, 0.6045E-02_dp, 0.6508E-02_dp, 0.6878E-02_dp, 0.7160E-02_dp, 0.7367E-02_dp, & + 0.7517E-02_dp, 0.7626E-02_dp, 0.7706E-02_dp, 0.7766E-02_dp, 0.7805E-02_dp, 0.7824E-02_dp, 0.7819E-02_dp, 0.7801E-02_dp, & + 0.7804E-02_dp, 0.7912E-02_dp, 0.8282E-02_dp, 0.9168E-02_dp, 0.1091E-01_dp /), & + (/10, 61/), ORDER = (/2, 1/) ) + + !--- In-cloud impaction scavenging look-up tables ----------------------------- + +! Water + + REAL(dp), PARAMETER :: cdroprad(0:izcloud) = (/ & + 0._dp, 5.0_dp, 10.0_dp, 15.0_dp, 20.0_dp, 25.0_dp, & + 0.0_dp, 35.0_dp, 40.0_dp, 45.0_dp, 50.0_dp /) + + REAL(DP) :: scavdropm(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, & + 0.0000E+00_dp, 0.2877E-10_dp, 0.7852E-10_dp, 0.2096E-09_dp, 0.5446E-09_dp, & + 0.1368E-08_dp, 0.3294E-08_dp, 0.7538E-08_dp, 0.1623E-07_dp, 0.3258E-07_dp, & + 0.6041E-07_dp, 0.1028E-06_dp, 0.1599E-06_dp, 0.2269E-06_dp, 0.2944E-06_dp, & + 0.3502E-06_dp, 0.3837E-06_dp, 0.3897E-06_dp, 0.3697E-06_dp, 0.3308E-06_dp, & + 0.2821E-06_dp, 0.2317E-06_dp, 0.1854E-06_dp, 0.1459E-06_dp, 0.1140E-06_dp, & + 0.8885E-07_dp, 0.6941E-07_dp, 0.5446E-07_dp, 0.4293E-07_dp, 0.3395E-07_dp, & + 0.2687E-07_dp, 0.2118E-07_dp, 0.1658E-07_dp, 0.1294E-07_dp, 0.1035E-07_dp, & + 0.9278E-08_dp, 0.1111E-07_dp, 0.2035E-07_dp, 0.5237E-07_dp, 0.1588E-06_dp, & + 0.5058E-06_dp, 0.1597E-05_dp, 0.4873E-05_dp, 0.1419E-04_dp, 0.3933E-04_dp, & + 0.1037E-03_dp, 0.2606E-03_dp, 0.6271E-03_dp, 0.1450E-02_dp, 0.3241E-02_dp, & + 0.7029E-02_dp, 0.1485E-01_dp, 0.3066E-01_dp, 0.6198E-01_dp, 0.1228E+00_dp, & + 0.2383E+00_dp, 0.4527E+00_dp, 0.8396E+00_dp, 0.1514E+01_dp, 0.2641E+01_dp, & + 0.4429E+01_dp, & + 0.0000E+00_dp, 0.1282E-09_dp, 0.3491E-09_dp, 0.9300E-09_dp, 0.2410E-08_dp, & + 0.6034E-08_dp, 0.1448E-07_dp, 0.3302E-07_dp, 0.7079E-07_dp, 0.1413E-06_dp, & + 0.2605E-06_dp, 0.4402E-06_dp, 0.6791E-06_dp, 0.9551E-06_dp, 0.1226E-05_dp, & + 0.1440E-05_dp, 0.1555E-05_dp, 0.1555E-05_dp, 0.1450E-05_dp, 0.1274E-05_dp, & + 0.1066E-05_dp, 0.8605E-06_dp, 0.6781E-06_dp, 0.5276E-06_dp, 0.4090E-06_dp, & + 0.3177E-06_dp, 0.2481E-06_dp, 0.1952E-06_dp, 0.1545E-06_dp, 0.1230E-06_dp, & + 0.9853E-07_dp, 0.8011E-07_dp, 0.6856E-07_dp, 0.6734E-07_dp, 0.8412E-07_dp, & + 0.1326E-06_dp, 0.2352E-06_dp, 0.4275E-06_dp, 0.7723E-06_dp, 0.1407E-05_dp, & + 0.2688E-05_dp, 0.5594E-05_dp, 0.1274E-04_dp, 0.3078E-04_dp, 0.7565E-04_dp, & + 0.1836E-03_dp, 0.4339E-03_dp, 0.9936E-03_dp, 0.2207E-02_dp, 0.4774E-02_dp, & + 0.1009E-01_dp, 0.2091E-01_dp, 0.4256E-01_dp, 0.8516E-01_dp, 0.1675E+00_dp, & + 0.3235E+00_dp, 0.6122E+00_dp, 0.1132E+01_dp, 0.2037E+01_dp, 0.3548E+01_dp, & + 0.5940E+01_dp, & + 0.0000E+00_dp, 0.2591E-09_dp, 0.7056E-09_dp, 0.1879E-08_dp, 0.4869E-08_dp, & + 0.1219E-07_dp, 0.2924E-07_dp, 0.6664E-07_dp, 0.1428E-06_dp, 0.2851E-06_dp, & + 0.5252E-06_dp, 0.8870E-06_dp, 0.1368E-05_dp, 0.1922E-05_dp, 0.2465E-05_dp, & + 0.2894E-05_dp, 0.3125E-05_dp, 0.3122E-05_dp, 0.2911E-05_dp, 0.2557E-05_dp, & + 0.2141E-05_dp, 0.1730E-05_dp, 0.1366E-05_dp, 0.1065E-05_dp, 0.8282E-06_dp, & + 0.6455E-06_dp, 0.5061E-06_dp, 0.4000E-06_dp, 0.3194E-06_dp, 0.2602E-06_dp, & + 0.2231E-06_dp, 0.2179E-06_dp, 0.2703E-06_dp, 0.4318E-06_dp, 0.7934E-06_dp, & + 0.1497E-05_dp, 0.2744E-05_dp, 0.4791E-05_dp, 0.7944E-05_dp, 0.1257E-04_dp, & + 0.1923E-04_dp, 0.2905E-04_dp, 0.4493E-04_dp, 0.7431E-04_dp, 0.1354E-03_dp, & + 0.2699E-03_dp, 0.5689E-03_dp, 0.1223E-02_dp, 0.2623E-02_dp, 0.5549E-02_dp, & + 0.1155E-01_dp, 0.2364E-01_dp, 0.4766E-01_dp, 0.9462E-01_dp, 0.1849E+00_dp, & + 0.3553E+00_dp, 0.6698E+00_dp, 0.1235E+01_dp, 0.2217E+01_dp, 0.3853E+01_dp, & + 0.6442E+01_dp, & + 0.0000E+00_dp, 0.4068E-09_dp, 0.1108E-08_dp, 0.2951E-08_dp, 0.7646E-08_dp, & + 0.1914E-07_dp, 0.4593E-07_dp, 0.1047E-06_dp, 0.2244E-06_dp, 0.4478E-06_dp, & + 0.8251E-06_dp, 0.1394E-05_dp, 0.2149E-05_dp, 0.3021E-05_dp, 0.3876E-05_dp, & + 0.4551E-05_dp, 0.4916E-05_dp, 0.4915E-05_dp, 0.4586E-05_dp, 0.4033E-05_dp, & + 0.3381E-05_dp, 0.2736E-05_dp, 0.2164E-05_dp, 0.1691E-05_dp, 0.1318E-05_dp, & + 0.1030E-05_dp, 0.8106E-06_dp, 0.6463E-06_dp, 0.5300E-06_dp, 0.4682E-06_dp, & + 0.4935E-06_dp, 0.6874E-06_dp, 0.1215E-05_dp, 0.2370E-05_dp, 0.4613E-05_dp, & + 0.8589E-05_dp, 0.1510E-04_dp, 0.2505E-04_dp, 0.3928E-04_dp, 0.5852E-04_dp, & + 0.8336E-04_dp, 0.1146E-03_dp, 0.1543E-03_dp, 0.2089E-03_dp, 0.2958E-03_dp, & + 0.4577E-03_dp, 0.7904E-03_dp, 0.1498E-02_dp, 0.2996E-02_dp, 0.6117E-02_dp, & + 0.1250E-01_dp, 0.2532E-01_dp, 0.5065E-01_dp, 0.9997E-01_dp, 0.1944E+00_dp, & + 0.3719E+00_dp, 0.6986E+00_dp, 0.1284E+01_dp, 0.2300E+01_dp, 0.3990E+01_dp, & + 0.6662E+01_dp, & + 0.0000E+00_dp, 0.5740E-09_dp, 0.1563E-08_dp, 0.4165E-08_dp, 0.1079E-07_dp, & + 0.2701E-07_dp, 0.6482E-07_dp, 0.1477E-06_dp, 0.3167E-06_dp, 0.6322E-06_dp, & + 0.1165E-05_dp, 0.1968E-05_dp, 0.3036E-05_dp, 0.4269E-05_dp, 0.5478E-05_dp, & + 0.6436E-05_dp, 0.6955E-05_dp, 0.6958E-05_dp, 0.6497E-05_dp, 0.5719E-05_dp, & + 0.4801E-05_dp, 0.3891E-05_dp, 0.3082E-05_dp, 0.2412E-05_dp, 0.1883E-05_dp, & + 0.1476E-05_dp, 0.1169E-05_dp, 0.9491E-06_dp, 0.8236E-06_dp, 0.8448E-06_dp, & + 0.1156E-05_dp, 0.2071E-05_dp, 0.4178E-05_dp, 0.8452E-05_dp, 0.1632E-04_dp, & + 0.2963E-04_dp, 0.5042E-04_dp, 0.8065E-04_dp, 0.1218E-03_dp, 0.1747E-03_dp, & + 0.2391E-03_dp, 0.3145E-03_dp, 0.4010E-03_dp, 0.5026E-03_dp, 0.6339E-03_dp, & + 0.8353E-03_dp, 0.1202E-02_dp, 0.1943E-02_dp, 0.3491E-02_dp, 0.6712E-02_dp, & + 0.1331E-01_dp, 0.2656E-01_dp, 0.5272E-01_dp, 0.1035E+00_dp, 0.2005E+00_dp, & + 0.3824E+00_dp, 0.7163E+00_dp, 0.1314E+01_dp, 0.2348E+01_dp, 0.4067E+01_dp, & + 0.6782E+01_dp, & + 0.0000E+00_dp, 0.7693E-09_dp, 0.2096E-08_dp, 0.5582E-08_dp, 0.1446E-07_dp, & + 0.3621E-07_dp, 0.8690E-07_dp, 0.1981E-06_dp, 0.4247E-06_dp, 0.8479E-06_dp, & + 0.1563E-05_dp, 0.2641E-05_dp, 0.4074E-05_dp, 0.5730E-05_dp, 0.7356E-05_dp, & + 0.8646E-05_dp, 0.9348E-05_dp, 0.9358E-05_dp, 0.8745E-05_dp, 0.7705E-05_dp, & + 0.6475E-05_dp, 0.5253E-05_dp, 0.4167E-05_dp, 0.3267E-05_dp, 0.2555E-05_dp, & + 0.2010E-05_dp, 0.1607E-05_dp, 0.1343E-05_dp, 0.1266E-05_dp, 0.1544E-05_dp, & + 0.2577E-05_dp, 0.5199E-05_dp, 0.1091E-04_dp, 0.2208E-04_dp, 0.4204E-04_dp, & + 0.7475E-04_dp, 0.1243E-03_dp, 0.1939E-03_dp, 0.2854E-03_dp, 0.3985E-03_dp, & + 0.5311E-03_dp, 0.6798E-03_dp, 0.8416E-03_dp, 0.1017E-02_dp, 0.1217E-02_dp, & + 0.1477E-02_dp, 0.1890E-02_dp, 0.2662E-02_dp, 0.4234E-02_dp, 0.7491E-02_dp, & + 0.1418E-01_dp, 0.2767E-01_dp, 0.5434E-01_dp, 0.1061E+00_dp, 0.2049E+00_dp, & + 0.3898E+00_dp, 0.7285E+00_dp, 0.1333E+01_dp, 0.2380E+01_dp, 0.4116E+01_dp, & + 0.6856E+01_dp, & + 0.0000E+00_dp, 0.9995E-09_dp, 0.2722E-08_dp, 0.7252E-08_dp, 0.1879E-07_dp, & + 0.4705E-07_dp, 0.1129E-06_dp, 0.2575E-06_dp, 0.5520E-06_dp, 0.1102E-05_dp, & + 0.2032E-05_dp, 0.3434E-05_dp, 0.5299E-05_dp, 0.7455E-05_dp, 0.9575E-05_dp, & + 0.1126E-04_dp, 0.1218E-04_dp, 0.1220E-04_dp, 0.1141E-04_dp, 0.1006E-04_dp, & + 0.8461E-05_dp, 0.6872E-05_dp, 0.5458E-05_dp, 0.4285E-05_dp, 0.3359E-05_dp, & + 0.2653E-05_dp, 0.2147E-05_dp, 0.1862E-05_dp, 0.1932E-05_dp, 0.2743E-05_dp, & + 0.5180E-05_dp, 0.1101E-04_dp, 0.2334E-04_dp, 0.4694E-04_dp, 0.8818E-04_dp, & + 0.1544E-03_dp, 0.2523E-03_dp, 0.3868E-03_dp, 0.5589E-03_dp, 0.7659E-03_dp, & + 0.1002E-02_dp, 0.1259E-02_dp, 0.1529E-02_dp, 0.1808E-02_dp, 0.2105E-02_dp, & + 0.2448E-02_dp, 0.2926E-02_dp, 0.3739E-02_dp, 0.5326E-02_dp, 0.8581E-02_dp, & + 0.1528E-01_dp, 0.2886E-01_dp, 0.5581E-01_dp, 0.1082E+00_dp, 0.2083E+00_dp, & + 0.3953E+00_dp, 0.7376E+00_dp, 0.1348E+01_dp, 0.2402E+01_dp, 0.4151E+01_dp, & + 0.6908E+01_dp, & + 0.0000E+00_dp, 0.1268E-08_dp, 0.3454E-08_dp, 0.9202E-08_dp, 0.2385E-07_dp, & + 0.5971E-07_dp, 0.1433E-06_dp, 0.3268E-06_dp, 0.7007E-06_dp, 0.1399E-05_dp, & + 0.2580E-05_dp, 0.4361E-05_dp, 0.6731E-05_dp, 0.9472E-05_dp, 0.1217E-04_dp, & + 0.1431E-04_dp, 0.1549E-04_dp, 0.1552E-04_dp, 0.1453E-04_dp, 0.1282E-04_dp, & + 0.1079E-04_dp, 0.8774E-05_dp, 0.6976E-05_dp, 0.5485E-05_dp, 0.4308E-05_dp, & + 0.3419E-05_dp, 0.2806E-05_dp, 0.2538E-05_dp, 0.2895E-05_dp, 0.4624E-05_dp, & + 0.9394E-05_dp, 0.2046E-04_dp, 0.4339E-04_dp, 0.8658E-04_dp, 0.1609E-03_dp, & + 0.2783E-03_dp, 0.4492E-03_dp, 0.6797E-03_dp, 0.9693E-03_dp, 0.1311E-02_dp, & + 0.1691E-02_dp, 0.2096E-02_dp, 0.2512E-02_dp, 0.2931E-02_dp, 0.3355E-02_dp, & + 0.3810E-02_dp, 0.4377E-02_dp, 0.5249E-02_dp, 0.6854E-02_dp, 0.1009E-01_dp, & + 0.1675E-01_dp, 0.3030E-01_dp, 0.5735E-01_dp, 0.1101E+00_dp, 0.2110E+00_dp, & + 0.3996E+00_dp, 0.7446E+00_dp, 0.1359E+01_dp, 0.2420E+01_dp, 0.4178E+01_dp, & + 0.6946E+01_dp, & + 0.0000E+00_dp, 0.1577E-08_dp, 0.4295E-08_dp, 0.1144E-07_dp, 0.2966E-07_dp, & + 0.7426E-07_dp, 0.1783E-06_dp, 0.4065E-06_dp, 0.8717E-06_dp, 0.1741E-05_dp, & + 0.3210E-05_dp, 0.5427E-05_dp, 0.8378E-05_dp, 0.1179E-04_dp, 0.1515E-04_dp, & + 0.1783E-04_dp, 0.1930E-04_dp, 0.1935E-04_dp, 0.1812E-04_dp, 0.1600E-04_dp, & + 0.1348E-04_dp, 0.1097E-04_dp, 0.8730E-05_dp, 0.6873E-05_dp, 0.5410E-05_dp, & + 0.4315E-05_dp, 0.3596E-05_dp, 0.3398E-05_dp, 0.4227E-05_dp, 0.7372E-05_dp, & + 0.1565E-04_dp, 0.3445E-04_dp, 0.7289E-04_dp, 0.1444E-03_dp, 0.2659E-03_dp, & + 0.4557E-03_dp, 0.7285E-03_dp, 0.1092E-02_dp, 0.1541E-02_dp, 0.2064E-02_dp, & + 0.2636E-02_dp, 0.3236E-02_dp, 0.3841E-02_dp, 0.4437E-02_dp, 0.5023E-02_dp, & + 0.5622E-02_dp, 0.6306E-02_dp, 0.7258E-02_dp, 0.8895E-02_dp, 0.1210E-01_dp, & + 0.1868E-01_dp, 0.3213E-01_dp, 0.5911E-01_dp, 0.1120E+00_dp, 0.2133E+00_dp, & + 0.4031E+00_dp, 0.7501E+00_dp, 0.1368E+01_dp, 0.2434E+01_dp, 0.4198E+01_dp, & + 0.6976E+01_dp, & + 0.0000E+00_dp, 0.1926E-08_dp, 0.5247E-08_dp, 0.1398E-07_dp, 0.3623E-07_dp, & + 0.9073E-07_dp, 0.2178E-06_dp, 0.4966E-06_dp, 0.1065E-05_dp, 0.2128E-05_dp, & + 0.3923E-05_dp, 0.6634E-05_dp, 0.1024E-04_dp, 0.1442E-04_dp, 0.1853E-04_dp, & + 0.2181E-04_dp, 0.2362E-04_dp, 0.2370E-04_dp, 0.2220E-04_dp, 0.1961E-04_dp, & + 0.1653E-04_dp, 0.1346E-04_dp, 0.1072E-04_dp, 0.8451E-05_dp, 0.6666E-05_dp, & + 0.5344E-05_dp, 0.4525E-05_dp, 0.4470E-05_dp, 0.6002E-05_dp, 0.1117E-04_dp, & + 0.2436E-04_dp, 0.5390E-04_dp, 0.1136E-03_dp, 0.2235E-03_dp, 0.4086E-03_dp, & + 0.6948E-03_dp, 0.1102E-02_dp, 0.1639E-02_dp, 0.2298E-02_dp, 0.3053E-02_dp, & + 0.3872E-02_dp, 0.4718E-02_dp, 0.5558E-02_dp, 0.6374E-02_dp, 0.7161E-02_dp, & + 0.7936E-02_dp, 0.8768E-02_dp, 0.9829E-02_dp, 0.1152E-01_dp, 0.1470E-01_dp, & + 0.2117E-01_dp, 0.3445E-01_dp, 0.6126E-01_dp, 0.1141E+00_dp, 0.2156E+00_dp, & + 0.4061E+00_dp, 0.7546E+00_dp, 0.1375E+01_dp, 0.2445E+01_dp, 0.4215E+01_dp, & + 0.6999E+01_dp/), & + (/10, 61/), ORDER = (/2, 1/) ) + + REAL(DP) :: scavdropn(0:9,0:60) = RESHAPE( (/ & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, 0.0000E+00_dp, & + 0.0000E+00_dp, & + 0.0000E+00_dp, 0.3119E-16_dp, 0.2740E-15_dp, 0.2157E-14_dp, 0.1522E-13_dp, & + 0.9626E-13_dp, 0.5458E-12_dp, 0.2775E-11_dp, 0.1266E-10_dp, 0.5184E-10_dp, & + 0.1905E-09_dp, 0.6292E-09_dp, 0.1868E-08_dp, 0.4988E-08_dp, 0.1199E-07_dp, & + 0.2600E-07_dp, 0.5087E-07_dp, 0.8999E-07_dp, 0.1442E-06_dp, 0.2100E-06_dp, & + 0.2788E-06_dp, 0.3385E-06_dp, 0.3781E-06_dp, 0.3907E-06_dp, 0.3765E-06_dp, & + 0.3413E-06_dp, 0.2941E-06_dp, 0.2435E-06_dp, 0.1958E-06_dp, 0.1546E-06_dp, & + 0.1209E-06_dp, 0.9427E-07_dp, 0.7359E-07_dp, 0.5767E-07_dp, 0.4541E-07_dp, & + 0.3590E-07_dp, 0.2841E-07_dp, 0.2243E-07_dp, 0.1759E-07_dp, 0.1372E-07_dp, & + 0.1086E-07_dp, 0.9349E-08_dp, 0.1026E-07_dp, 0.1697E-07_dp, 0.4095E-07_dp, & + 0.1210E-06_dp, 0.3835E-06_dp, 0.1218E-05_dp, 0.3750E-05_dp, 0.1105E-04_dp, & + 0.3099E-04_dp, 0.8266E-04_dp, 0.2101E-03_dp, 0.5106E-03_dp, 0.1192E-02_dp, & + 0.2684E-02_dp, 0.5859E-02_dp, 0.1245E-01_dp, 0.2585E-01_dp, 0.5251E-01_dp, & + 0.1045E+00_dp, & + 0.0000E+00_dp, 0.1400E-15_dp, 0.1229E-14_dp, 0.9668E-14_dp, 0.6813E-13_dp, & + 0.4303E-12_dp, 0.2436E-11_dp, 0.1237E-10_dp, 0.5632E-10_dp, 0.2301E-09_dp, & + 0.8437E-09_dp, 0.2778E-08_dp, 0.8220E-08_dp, 0.2187E-07_dp, 0.5236E-07_dp, & + 0.1129E-06_dp, 0.2197E-06_dp, 0.3860E-06_dp, 0.6140E-06_dp, 0.8861E-06_dp, & + 0.1164E-05_dp, 0.1396E-05_dp, 0.1538E-05_dp, 0.1565E-05_dp, 0.1483E-05_dp, & + 0.1320E-05_dp, 0.1116E-05_dp, 0.9080E-06_dp, 0.7189E-06_dp, 0.5605E-06_dp, & + 0.4346E-06_dp, 0.3372E-06_dp, 0.2630E-06_dp, 0.2065E-06_dp, 0.1633E-06_dp, & + 0.1298E-06_dp, 0.1038E-06_dp, 0.8394E-07_dp, 0.7056E-07_dp, 0.6637E-07_dp, & + 0.7787E-07_dp, 0.1172E-06_dp, 0.2043E-06_dp, 0.3709E-06_dp, 0.6710E-06_dp, & + 0.1216E-05_dp, 0.2289E-05_dp, 0.4656E-05_dp, 0.1040E-04_dp, 0.2487E-04_dp, & + 0.6108E-04_dp, 0.1490E-03_dp, 0.3545E-03_dp, 0.8179E-03_dp, 0.1830E-02_dp, & + 0.3981E-02_dp, 0.8459E-02_dp, 0.1761E-01_dp, 0.3598E-01_dp, 0.7229E-01_dp, & + 0.1428E+00_dp, & + 0.0000E+00_dp, 0.2832E-15_dp, 0.2486E-14_dp, 0.1955E-13_dp, 0.1378E-12_dp, & + 0.8702E-12_dp, 0.4926E-11_dp, 0.2500E-10_dp, 0.1138E-09_dp, 0.4649E-09_dp, & + 0.1705E-08_dp, 0.5612E-08_dp, 0.1660E-07_dp, 0.4415E-07_dp, 0.1057E-06_dp, & + 0.2278E-06_dp, 0.4429E-06_dp, 0.7780E-06_dp, 0.1237E-05_dp, 0.1784E-05_dp, & + 0.2341E-05_dp, 0.2807E-05_dp, 0.3090E-05_dp, 0.3143E-05_dp, 0.2977E-05_dp, & + 0.2650E-05_dp, 0.2242E-05_dp, 0.1825E-05_dp, 0.1447E-05_dp, 0.1131E-05_dp, & + 0.8794E-06_dp, 0.6847E-06_dp, 0.5360E-06_dp, 0.4227E-06_dp, 0.3366E-06_dp, & + 0.2724E-06_dp, 0.2296E-06_dp, 0.2153E-06_dp, 0.2504E-06_dp, 0.3793E-06_dp, & + 0.6824E-06_dp, 0.1289E-05_dp, 0.2385E-05_dp, 0.4215E-05_dp, 0.7074E-05_dp, & + 0.1131E-04_dp, 0.1742E-04_dp, 0.2632E-04_dp, 0.4032E-04_dp, 0.6538E-04_dp, & + 0.1163E-03_dp, 0.2275E-03_dp, 0.4749E-03_dp, 0.1019E-02_dp, 0.2189E-02_dp, & + 0.4648E-02_dp, 0.9712E-02_dp, 0.1996E-01_dp, 0.4038E-01_dp, 0.8046E-01_dp, & + 0.1579E+00_dp, & + 0.0000E+00_dp, 0.4448E-15_dp, 0.3905E-14_dp, 0.3071E-13_dp, 0.2164E-12_dp, & + 0.1367E-11_dp, 0.7736E-11_dp, 0.3927E-10_dp, 0.1788E-09_dp, 0.7302E-09_dp, & + 0.2677E-08_dp, 0.8813E-08_dp, 0.2607E-07_dp, 0.6934E-07_dp, 0.1660E-06_dp, & + 0.3578E-06_dp, 0.6958E-06_dp, 0.1222E-05_dp, 0.1943E-05_dp, 0.2803E-05_dp, & + 0.3680E-05_dp, 0.4414E-05_dp, 0.4861E-05_dp, 0.4947E-05_dp, 0.4689E-05_dp, & + 0.4178E-05_dp, 0.3539E-05_dp, 0.2885E-05_dp, 0.2292E-05_dp, 0.1795E-05_dp, & + 0.1398E-05_dp, 0.1092E-05_dp, 0.8574E-06_dp, 0.6810E-06_dp, 0.5533E-06_dp, & + 0.4768E-06_dp, 0.4763E-06_dp, 0.6188E-06_dp, 0.1046E-05_dp, 0.2017E-05_dp, & + 0.3949E-05_dp, 0.7443E-05_dp, 0.1327E-04_dp, 0.2232E-04_dp, 0.3545E-04_dp, & + 0.5345E-04_dp, 0.7690E-04_dp, 0.1065E-03_dp, 0.1438E-03_dp, 0.1938E-03_dp, & + 0.2705E-03_dp, 0.4085E-03_dp, 0.6873E-03_dp, 0.1278E-02_dp, 0.2532E-02_dp, & + 0.5157E-02_dp, 0.1055E-01_dp, 0.2142E-01_dp, 0.4299E-01_dp, 0.8513E-01_dp, & + 0.1661E+00_dp, & + 0.0000E+00_dp, 0.6275E-15_dp, 0.5508E-14_dp, 0.4332E-13_dp, 0.3053E-12_dp, & + 0.1928E-11_dp, 0.1091E-10_dp, 0.5540E-10_dp, 0.2522E-09_dp, 0.1030E-08_dp, & + 0.3778E-08_dp, 0.1244E-07_dp, 0.3679E-07_dp, 0.9787E-07_dp, 0.2343E-06_dp, & + 0.5052E-06_dp, 0.9824E-06_dp, 0.1726E-05_dp, 0.2745E-05_dp, 0.3960E-05_dp, & + 0.5201E-05_dp, 0.6241E-05_dp, 0.6877E-05_dp, 0.7003E-05_dp, 0.6642E-05_dp, & + 0.5924E-05_dp, 0.5024E-05_dp, 0.4101E-05_dp, 0.3262E-05_dp, 0.2559E-05_dp, & + 0.1997E-05_dp, 0.1563E-05_dp, 0.1234E-05_dp, 0.9937E-06_dp, 0.8433E-06_dp, & + 0.8209E-06_dp, 0.1043E-05_dp, 0.1772E-05_dp, 0.3522E-05_dp, 0.7168E-05_dp, & + 0.1403E-04_dp, 0.2586E-04_dp, 0.4468E-04_dp, 0.7250E-04_dp, 0.1110E-03_dp, & + 0.1610E-03_dp, 0.2227E-03_dp, 0.2955E-03_dp, 0.3792E-03_dp, 0.4765E-03_dp, & + 0.5984E-03_dp, 0.7772E-03_dp, 0.1091E-02_dp, 0.1715E-02_dp, 0.3013E-02_dp, & + 0.5721E-02_dp, 0.1129E-01_dp, 0.2253E-01_dp, 0.4481E-01_dp, 0.8825E-01_dp, & + 0.1715E+00_dp, & + 0.0000E+00_dp, 0.8408E-15_dp, 0.7381E-14_dp, 0.5805E-13_dp, 0.4091E-12_dp, & + 0.2584E-11_dp, 0.1463E-10_dp, 0.7425E-10_dp, 0.3381E-09_dp, 0.1381E-08_dp, & + 0.5064E-08_dp, 0.1667E-07_dp, 0.4933E-07_dp, 0.1312E-06_dp, 0.3141E-06_dp, & + 0.6775E-06_dp, 0.1318E-05_dp, 0.2316E-05_dp, 0.3683E-05_dp, 0.5316E-05_dp, & + 0.6983E-05_dp, 0.8383E-05_dp, 0.9242E-05_dp, 0.9417E-05_dp, 0.8938E-05_dp, & + 0.7979E-05_dp, 0.6774E-05_dp, 0.5536E-05_dp, 0.4410E-05_dp, 0.3464E-05_dp, & + 0.2709E-05_dp, 0.2126E-05_dp, 0.1691E-05_dp, 0.1392E-05_dp, 0.1262E-05_dp, & + 0.1429E-05_dp, 0.2227E-05_dp, 0.4364E-05_dp, 0.9156E-05_dp, 0.1876E-04_dp, & + 0.3628E-04_dp, 0.6557E-04_dp, 0.1107E-03_dp, 0.1753E-03_dp, 0.2616E-03_dp, & + 0.3696E-03_dp, 0.4979E-03_dp, 0.6431E-03_dp, 0.8019E-03_dp, 0.9736E-03_dp, & + 0.1165E-02_dp, 0.1406E-02_dp, 0.1769E-02_dp, 0.2427E-02_dp, 0.3750E-02_dp, & + 0.6488E-02_dp, 0.1213E-01_dp, 0.2356E-01_dp, 0.4628E-01_dp, 0.9057E-01_dp, & + 0.1754E+00_dp, & + 0.0000E+00_dp, 0.1092E-14_dp, 0.9587E-14_dp, 0.7540E-13_dp, 0.5314E-12_dp, & + 0.3356E-11_dp, 0.1900E-10_dp, 0.9646E-10_dp, 0.4392E-09_dp, 0.1794E-08_dp, & + 0.6579E-08_dp, 0.2166E-07_dp, 0.6410E-07_dp, 0.1705E-06_dp, 0.4083E-06_dp, & + 0.8807E-06_dp, 0.1713E-05_dp, 0.3011E-05_dp, 0.4791E-05_dp, 0.6916E-05_dp, & + 0.9088E-05_dp, 0.1091E-04_dp, 0.1204E-04_dp, 0.1227E-04_dp, 0.1166E-04_dp, & + 0.1041E-04_dp, 0.8849E-05_dp, 0.7240E-05_dp, 0.5774E-05_dp, 0.4542E-05_dp, & + 0.3559E-05_dp, 0.2803E-05_dp, 0.2250E-05_dp, 0.1906E-05_dp, 0.1869E-05_dp, & + 0.2446E-05_dp, 0.4375E-05_dp, 0.9175E-05_dp, 0.1959E-04_dp, 0.3997E-04_dp, & + 0.7636E-04_dp, 0.1359E-03_dp, 0.2258E-03_dp, 0.3513E-03_dp, 0.5145E-03_dp, & + 0.7137E-03_dp, 0.9434E-03_dp, 0.1196E-02_dp, 0.1463E-02_dp, 0.1741E-02_dp, & + 0.2031E-02_dp, 0.2359E-02_dp, 0.2792E-02_dp, 0.3497E-02_dp, 0.4840E-02_dp, & + 0.7579E-02_dp, 0.1323E-01_dp, 0.2472E-01_dp, 0.4766E-01_dp, 0.9248E-01_dp, & + 0.1784E+00_dp, & + 0.0000E+00_dp, 0.1385E-14_dp, 0.1216E-13_dp, 0.9565E-13_dp, 0.6741E-12_dp, & + 0.4258E-11_dp, 0.2411E-10_dp, 0.1224E-09_dp, 0.5573E-09_dp, 0.2277E-08_dp, & + 0.8348E-08_dp, 0.2749E-07_dp, 0.8135E-07_dp, 0.2164E-06_dp, 0.5183E-06_dp, & + 0.1118E-05_dp, 0.2175E-05_dp, 0.3824E-05_dp, 0.6085E-05_dp, 0.8786E-05_dp, & + 0.1155E-04_dp, 0.1387E-04_dp, 0.1531E-04_dp, 0.1562E-04_dp, 0.1484E-04_dp, & + 0.1327E-04_dp, 0.1128E-04_dp, 0.9241E-05_dp, 0.7378E-05_dp, 0.5811E-05_dp, & + 0.4561E-05_dp, 0.3607E-05_dp, 0.2926E-05_dp, 0.2561E-05_dp, 0.2724E-05_dp, & + 0.4019E-05_dp, 0.7841E-05_dp, 0.1700E-04_dp, 0.3645E-04_dp, 0.7390E-04_dp, & + 0.1397E-03_dp, 0.2458E-03_dp, 0.4032E-03_dp, 0.6193E-03_dp, 0.8952E-03_dp, & + 0.1225E-02_dp, 0.1598E-02_dp, 0.1998E-02_dp, 0.2413E-02_dp, 0.2831E-02_dp, & + 0.3253E-02_dp, 0.3696E-02_dp, 0.4224E-02_dp, 0.4996E-02_dp, 0.6368E-02_dp, & + 0.9095E-02_dp, 0.1470E-01_dp, 0.2616E-01_dp, 0.4915E-01_dp, 0.9425E-01_dp, & + 0.1808E+00_dp, & + 0.0000E+00_dp, 0.1722E-14_dp, 0.1512E-13_dp, 0.1189E-12_dp, 0.8381E-12_dp, & + 0.5294E-11_dp, 0.2997E-10_dp, 0.1522E-09_dp, 0.6929E-09_dp, 0.2831E-08_dp, & + 0.1038E-07_dp, 0.3419E-07_dp, 0.1012E-06_dp, 0.2692E-06_dp, 0.6447E-06_dp, & + 0.1391E-05_dp, 0.2707E-05_dp, 0.4758E-05_dp, 0.7573E-05_dp, 0.1094E-04_dp, & + 0.1438E-04_dp, 0.1728E-04_dp, 0.1908E-04_dp, 0.1947E-04_dp, 0.1851E-04_dp, & + 0.1656E-04_dp, 0.1409E-04_dp, 0.1155E-04_dp, 0.9231E-05_dp, 0.7279E-05_dp, & + 0.5724E-05_dp, 0.4543E-05_dp, 0.3729E-05_dp, 0.3380E-05_dp, 0.3886E-05_dp, & + 0.6296E-05_dp, 0.1297E-04_dp, 0.2860E-04_dp, 0.6130E-04_dp, 0.1235E-03_dp, & + 0.2314E-03_dp, 0.4034E-03_dp, 0.6554E-03_dp, 0.9968E-03_dp, 0.1427E-02_dp, & + 0.1934E-02_dp, 0.2497E-02_dp, 0.3092E-02_dp, 0.3697E-02_dp, 0.4296E-02_dp, & + 0.4883E-02_dp, 0.5475E-02_dp, 0.6128E-02_dp, 0.6990E-02_dp, 0.8406E-02_dp, & + 0.1112E-01_dp, 0.1666E-01_dp, 0.2801E-01_dp, 0.5092E-01_dp, 0.9608E-01_dp, & + 0.1831E+00_dp, & + 0.0000E+00_dp, 0.2104E-14_dp, 0.1847E-13_dp, 0.1453E-12_dp, 0.1024E-11_dp, & + 0.6466E-11_dp, 0.3661E-10_dp, 0.1859E-09_dp, 0.8465E-09_dp, 0.3458E-08_dp, & + 0.1268E-07_dp, 0.4177E-07_dp, 0.1236E-06_dp, 0.3290E-06_dp, 0.7878E-06_dp, & + 0.1700E-05_dp, 0.3308E-05_dp, 0.5817E-05_dp, 0.9259E-05_dp, 0.1337E-04_dp, & + 0.1759E-04_dp, 0.2114E-04_dp, 0.2335E-04_dp, 0.2383E-04_dp, 0.2267E-04_dp, & + 0.2030E-04_dp, 0.1728E-04_dp, 0.1417E-04_dp, 0.1134E-04_dp, 0.8948E-05_dp, & + 0.7048E-05_dp, 0.5617E-05_dp, 0.4667E-05_dp, 0.4384E-05_dp, 0.5412E-05_dp, & + 0.9423E-05_dp, 0.2012E-04_dp, 0.4474E-04_dp, 0.9566E-04_dp, 0.1915E-03_dp, & + 0.3562E-03_dp, 0.6162E-03_dp, 0.9935E-03_dp, 0.1500E-02_dp, 0.2131E-02_dp, & + 0.2866E-02_dp, 0.3673E-02_dp, 0.4516E-02_dp, 0.5360E-02_dp, 0.6183E-02_dp, & + 0.6975E-02_dp, 0.7750E-02_dp, 0.8558E-02_dp, 0.9539E-02_dp, 0.1102E-01_dp, & + 0.1373E-01_dp, 0.1918E-01_dp, 0.3038E-01_dp, 0.5311E-01_dp, 0.9815E-01_dp, & + 0.1852E+00_dp /), & + (/10, 61/), ORDER = (/2, 1/) ) + +! Ice - plate assumption + + REAL(dp), PARAMETER :: cplaterad(0:iziceplate) = (/0._dp, 5._dp, 10._dp, 15._dp, 20._dp, & + 25._dp, 30._dp, 35._dp, 40._dp, 45._dp, 50._dp, 75._dp, 100._dp, & + 125._dp, 150._dp, 175._dp, 200._dp, 225._dp, 250._dp, 275._dp, & + 300._dp, 325._dp, 350._dp, 375._dp, 400._dp, 425._dp, 450._dp, & + 475._dp, 500._dp, 525._dp, 550._dp, 575._dp, 600._dp, 625._dp, 650._dp /) + +!>>gf + DATA (scaviceplate(0,ja),ja=0,60)/ & + 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp, & + 0._dp, 0._dp, 0._dp, 0._dp, 0._dp/ + DATA (scaviceplate(1,ja),ja=0,60)/ & + 0._dp, & + 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, & + 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, 0.3545E-06_dp, & + 0.3545E-06_dp, 0.3545E-06_dp, 0.3546E-06_dp, 0.3546E-06_dp, 0.3547E-06_dp, & + 0.3548E-06_dp, 0.3549E-06_dp, 0.3551E-06_dp, 0.3552E-06_dp, 0.3555E-06_dp, & + 0.3558E-06_dp, 0.3561E-06_dp, 0.3566E-06_dp, 0.3557E-06_dp, 0.3071E-06_dp, & + 0.2240E-06_dp, 0.1657E-06_dp, 0.1242E-06_dp, 0.9415E-07_dp, 0.7218E-07_dp, & + 0.5591E-07_dp, 0.4373E-07_dp, 0.3453E-07_dp, 0.2752E-07_dp, 0.2212E-07_dp, & + 0.1793E-07_dp, 0.1463E-07_dp, 0.1188E-07_dp, 0.8906E-08_dp, 0.6669E-08_dp, & + 0.3231E-08_dp, 0.3564E-10_dp, 0.5550E-12_dp, 0.2924E-10_dp, 0.9890E-09_dp, & + 0.2592E-08_dp, 0.3126E-08_dp, 0.1653E-08_dp, 0.1807E-07_dp, 0.5574E-07_dp, & + 0.1268E-06_dp, 0.4422E-06_dp, 0.1480E-05_dp, 0.5460E-05_dp, 0.2730E-04_dp, & + 0.8571E-04_dp, 0.3768E-03_dp, 0.1540E-02_dp, 0.4415E-02_dp, 0.1106E-01_dp/ + DATA (scaviceplate(2,ja),ja=0,60)/ & + 0._dp, & + 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, & + 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, 0.5623E-05_dp, & + 0.5623E-05_dp, 0.5624E-05_dp, 0.5624E-05_dp, 0.5625E-05_dp, 0.5625E-05_dp, & + 0.5626E-05_dp, 0.5627E-05_dp, 0.5628E-05_dp, 0.5614E-05_dp, 0.5087E-05_dp, & + 0.3577E-05_dp, 0.2539E-05_dp, 0.1822E-05_dp, 0.1322E-05_dp, 0.9710E-06_dp, & + 0.7224E-06_dp, 0.5441E-06_dp, 0.4145E-06_dp, 0.3191E-06_dp, 0.2481E-06_dp, & + 0.1946E-06_dp, 0.1540E-06_dp, 0.1229E-06_dp, 0.9885E-07_dp, 0.8013E-07_dp, & + 0.6544E-07_dp, 0.5378E-07_dp, 0.4382E-07_dp, 0.3228E-07_dp, 0.2373E-07_dp, & + 0.1207E-07_dp, 0.2567E-09_dp, 0.7402E-11_dp, 0.4077E-09_dp, 0.1381E-07_dp, & + 0.3719E-07_dp, 0.6588E-07_dp, 0.1012E-06_dp, 0.1332E-06_dp, 0.1246E-06_dp, & + 0.6847E-07_dp, 0.1015E-05_dp, 0.4624E-05_dp, 0.1920E-04_dp, 0.1005E-03_dp, & + 0.3161E-03_dp, 0.1400E-02_dp, 0.3800E-02_dp, 0.8500E-02_dp, 0.1800E-01_dp/ + DATA (scaviceplate(3,ja),ja=0,60)/ & + 0._dp, & + 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, & + 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, & + 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, 0.2800E-04_dp, & + 0.2800E-04_dp, 0.2776E-04_dp, 0.1978E-04_dp, 0.1387E-04_dp, 0.9806E-05_dp, & + 0.6989E-05_dp, 0.5024E-05_dp, 0.3647E-05_dp, 0.2675E-05_dp, 0.1984E-05_dp, & + 0.1489E-05_dp, 0.1131E-05_dp, 0.8676E-06_dp, 0.6722E-06_dp, 0.5256E-06_dp, & + 0.4144E-06_dp, 0.3294E-06_dp, 0.2639E-06_dp, 0.2131E-06_dp, 0.1733E-06_dp, & + 0.1419E-06_dp, 0.1169E-06_dp, 0.9540E-07_dp, 0.6977E-07_dp, 0.5090E-07_dp, & + 0.2668E-07_dp, 0.8296E-09_dp, 0.3401E-10_dp, 0.1833E-08_dp, 0.6496E-07_dp, & + 0.2661E-06_dp, 0.5598E-06_dp, 0.9637E-06_dp, 0.1493E-05_dp, 0.2098E-05_dp, & + 0.2386E-05_dp, 0.9829E-06_dp, 0.1270E-05_dp, 0.1793E-04_dp, 0.1537E-03_dp, & + 0.5966E-03_dp, 0.1738E-02_dp, 0.4092E-02_dp, 0.9004E-02_dp, 0.1945E-01_dp/ + DATA (scaviceplate(4,ja),ja=0,60)/ & + 0._dp, & + 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, & + 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, 0.8711E-04_dp, & + 0.8711E-04_dp, 0.8712E-04_dp, 0.8712E-04_dp, 0.8712E-04_dp, 0.8645E-04_dp, & + 0.6434E-04_dp, 0.4492E-04_dp, 0.3158E-04_dp, 0.2236E-04_dp, 0.1595E-04_dp, & + 0.1146E-04_dp, 0.8303E-05_dp, 0.6069E-05_dp, 0.4480E-05_dp, 0.3342E-05_dp, & + 0.2522E-05_dp, 0.1923E-05_dp, 0.1481E-05_dp, 0.1152E-05_dp, 0.9034E-06_dp, & + 0.7142E-06_dp, 0.5692E-06_dp, 0.4570E-06_dp, 0.3697E-06_dp, 0.3012E-06_dp, & + 0.2470E-06_dp, 0.2038E-06_dp, 0.1664E-06_dp, 0.1212E-06_dp, 0.8806E-07_dp, & + 0.4722E-07_dp, 0.1924E-08_dp, 0.1012E-09_dp, 0.5365E-08_dp, 0.1942E-06_dp, & + 0.9191E-06_dp, 0.2000E-05_dp, 0.3497E-05_dp, 0.5548E-05_dp, 0.8243E-05_dp, & + 0.1118E-04_dp, 0.1088E-04_dp, 0.5078E-05_dp, 0.4263E-05_dp, 0.1107E-03_dp, & + 0.5908E-03_dp, 0.1894E-02_dp, 0.4547E-02_dp, 0.9857E-02_dp, 0.2087E-01_dp/ + DATA (scaviceplate(5,ja),ja=0,60)/ & + 0._dp, & + 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, & + 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, 0.2079E-03_dp, & + 0.2079E-03_dp, 0.2079E-03_dp, 0.2074E-03_dp, 0.1899E-03_dp, 0.1317E-03_dp, & + 0.9204E-04_dp, 0.6473E-04_dp, 0.4583E-04_dp, 0.3267E-04_dp, 0.2345E-04_dp, & + 0.1694E-04_dp, 0.1234E-04_dp, 0.9062E-05_dp, 0.6717E-05_dp, 0.5030E-05_dp, & + 0.3807E-05_dp, 0.2911E-05_dp, 0.2248E-05_dp, 0.1752E-05_dp, 0.1377E-05_dp, & + 0.1090E-05_dp, 0.8703E-06_dp, 0.6997E-06_dp, 0.5667E-06_dp, 0.4622E-06_dp, & + 0.3794E-06_dp, 0.3133E-06_dp, 0.2558E-06_dp, 0.1860E-06_dp, 0.1347E-06_dp, & + 0.7358E-07_dp, 0.3688E-08_dp, 0.2349E-09_dp, 0.1230E-07_dp, 0.5363E-06_dp, & + 0.5235E-05_dp, 0.1268E-04_dp, 0.2296E-04_dp, 0.3714E-04_dp, 0.5647E-04_dp, & + 0.8291E-04_dp, 0.1052E-03_dp, 0.9688E-04_dp, 0.5462E-04_dp, 0.3098E-04_dp, & + 0.4472E-03_dp, 0.1762E-02_dp, 0.4712E-02_dp, 0.1051E-01_dp, 0.2239E-01_dp/ + DATA (scaviceplate(6,ja),ja=0,60)/ & + 0._dp, & + 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, & + 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, 0.2501E-03_dp, & + 0.2501E-03_dp, 0.2498E-03_dp, 0.2388E-03_dp, 0.2024E-03_dp, 0.1407E-03_dp, & + 0.9843E-04_dp, 0.6933E-04_dp, 0.4915E-04_dp, 0.3508E-04_dp, 0.2520E-04_dp, & + 0.1823E-04_dp, 0.1329E-04_dp, 0.9768E-05_dp, 0.7246E-05_dp, 0.5430E-05_dp, & + 0.4112E-05_dp, 0.3146E-05_dp, 0.2431E-05_dp, 0.1895E-05_dp, 0.1490E-05_dp, & + 0.1180E-05_dp, 0.9421E-06_dp, 0.7576E-06_dp, 0.6137E-06_dp, 0.5006E-06_dp, & + 0.4110E-06_dp, 0.3395E-06_dp, 0.2772E-06_dp, 0.2014E-06_dp, 0.1459E-06_dp, & + 0.7998E-07_dp, 0.4200E-08_dp, 0.2808E-09_dp, 0.1466E-07_dp, 0.6387E-06_dp, & + 0.6223E-05_dp, 0.1505E-04_dp, 0.2721E-04_dp, 0.4395E-04_dp, 0.6689E-04_dp, & + 0.1009E-03_dp, 0.1517E-03_dp, 0.1510E-03_dp, 0.1068E-03_dp, 0.5517E-04_dp, & + 0.3994E-03_dp, 0.1704E-02_dp, 0.4678E-02_dp, 0.1055E-01_dp, 0.2259E-01_dp/ + DATA (scaviceplate(7,ja),ja=0,60)/ & + 0._dp, & + 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, & + 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, 0.2923E-03_dp, & + 0.2923E-03_dp, 0.2917E-03_dp, 0.2701E-03_dp, 0.2150E-03_dp, 0.1496E-03_dp, & + 0.1048E-03_dp, 0.7392E-04_dp, 0.5246E-04_dp, 0.3748E-04_dp, 0.2696E-04_dp, & + 0.1952E-04_dp, 0.1424E-04_dp, 0.1047E-04_dp, 0.7775E-05_dp, 0.5829E-05_dp, & + 0.4417E-05_dp, 0.3381E-05_dp, 0.2613E-05_dp, 0.2038E-05_dp, 0.1602E-05_dp, & + 0.1270E-05_dp, 0.1014E-05_dp, 0.8156E-06_dp, 0.6608E-06_dp, 0.5391E-06_dp, & + 0.4427E-06_dp, 0.3657E-06_dp, 0.2986E-06_dp, 0.2169E-06_dp, 0.1570E-06_dp, & + 0.8638E-07_dp, 0.4712E-08_dp, 0.3266E-09_dp, 0.1702E-07_dp, 0.7412E-06_dp, & + 0.7212E-05_dp, 0.1742E-04_dp, 0.3145E-04_dp, 0.5076E-04_dp, 0.7731E-04_dp, & + 0.1190E-03_dp, 0.1981E-03_dp, 0.2051E-03_dp, 0.1590E-03_dp, 0.7936E-04_dp, & + 0.3517E-03_dp, 0.1646E-02_dp, 0.4645E-02_dp, 0.1060E-01_dp, 0.2279E-01_dp/ + DATA (scaviceplate(8,ja),ja=0,60)/ & + 0._dp, & + 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, & + 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, 0.3345E-03_dp, & + 0.3345E-03_dp, 0.3335E-03_dp, 0.3015E-03_dp, 0.2275E-03_dp, 0.1586E-03_dp, & + 0.1112E-03_dp, 0.7851E-04_dp, 0.5578E-04_dp, 0.3989E-04_dp, 0.2871E-04_dp, & + 0.2081E-04_dp, 0.1519E-04_dp, 0.1118E-04_dp, 0.8304E-05_dp, 0.6229E-05_dp, & + 0.4722E-05_dp, 0.3616E-05_dp, 0.2796E-05_dp, 0.2181E-05_dp, 0.1715E-05_dp, & + 0.1359E-05_dp, 0.1086E-05_dp, 0.8735E-06_dp, 0.7078E-06_dp, 0.5775E-06_dp, & + 0.4743E-06_dp, 0.3918E-06_dp, 0.3200E-06_dp, 0.2323E-06_dp, 0.1682E-06_dp, & + 0.9278E-07_dp, 0.5224E-08_dp, 0.3725E-09_dp, 0.1938E-07_dp, 0.8436E-06_dp, & + 0.8201E-05_dp, 0.1979E-04_dp, 0.3569E-04_dp, 0.5757E-04_dp, 0.8772E-04_dp, & + 0.1370E-03_dp, 0.2446E-03_dp, 0.2592E-03_dp, 0.2112E-03_dp, 0.1036E-03_dp, & + 0.3039E-03_dp, 0.1588E-02_dp, 0.4612E-02_dp, 0.1064E-01_dp, 0.2299E-01_dp/ + DATA (scaviceplate(9,ja),ja=0,60)/ & + 0._dp, & + 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, & + 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, 0.3766E-03_dp, & + 0.3766E-03_dp, 0.3754E-03_dp, 0.3328E-03_dp, 0.2401E-03_dp, 0.1675E-03_dp, & + 0.1176E-03_dp, 0.8310E-04_dp, 0.5910E-04_dp, 0.4230E-04_dp, 0.3047E-04_dp, & + 0.2210E-04_dp, 0.1614E-04_dp, 0.1189E-04_dp, 0.8833E-05_dp, 0.6629E-05_dp, & + 0.5027E-05_dp, 0.3851E-05_dp, 0.2978E-05_dp, 0.2324E-05_dp, 0.1828E-05_dp, & + 0.1449E-05_dp, 0.1158E-05_dp, 0.9315E-06_dp, 0.7549E-06_dp, 0.6160E-06_dp, & + 0.5060E-06_dp, 0.4180E-06_dp, 0.3414E-06_dp, 0.2478E-06_dp, 0.1793E-06_dp, & + 0.9918E-07_dp, 0.5736E-08_dp, 0.4183E-09_dp, 0.2174E-07_dp, 0.9460E-06_dp, & + 0.9190E-05_dp, 0.2216E-04_dp, 0.3993E-04_dp, 0.6438E-04_dp, 0.9814E-04_dp, & + 0.1550E-03_dp, 0.2911E-03_dp, 0.3132E-03_dp, 0.2634E-03_dp, 0.1277E-03_dp, & + 0.2562E-03_dp, 0.1530E-02_dp, 0.4578E-02_dp, 0.1068E-01_dp, 0.2318E-01_dp/ + DATA (scaviceplate(10,ja),ja=0,60)/ & + 0._dp, & + 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, & + 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, 0.3658E-03_dp, & + 0.3658E-03_dp, 0.2754E-03_dp, 0.1791E-03_dp, 0.1077E-03_dp, 0.6859E-04_dp, & + 0.4468E-04_dp, 0.2915E-04_dp, 0.1943E-04_dp, 0.1331E-04_dp, 0.9352E-05_dp, & + 0.7232E-05_dp, 0.5486E-05_dp, 0.4642E-05_dp, 0.3556E-05_dp, 0.2881E-05_dp, & + 0.2233E-05_dp, 0.1979E-05_dp, 0.1743E-05_dp, 0.1743E-05_dp, 0.1743E-05_dp, & + 0.1775E-05_dp, 0.1411E-05_dp, 0.1082E-05_dp, 0.8761E-06_dp, 0.8309E-06_dp, & + 0.8309E-06_dp, 0.8309E-06_dp, 0.8309E-06_dp, 0.8309E-06_dp, 0.8309E-06_dp, & + 0.8826E-06_dp, 0.1084E-05_dp, 0.1411E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, & + 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, & + 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, & + 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp, 0.1653E-05_dp/ + DATA (scaviceplate(11,ja),ja=0,60)/ & + 0._dp, & + 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, & + 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, 0.1541E-02_dp, & + 0.1541E-02_dp, 0.1059E-02_dp, 0.6070E-03_dp, 0.3505E-03_dp, 0.2166E-03_dp, & + 0.1272E-03_dp, 0.8082E-04_dp, 0.4703E-04_dp, 0.2927E-04_dp, 0.1870E-04_dp, & + 0.1308E-04_dp, 0.1034E-04_dp, 0.8459E-05_dp, 0.7069E-05_dp, 0.6327E-05_dp, & + 0.5536E-05_dp, 0.5131E-05_dp, 0.4551E-05_dp, 0.4183E-05_dp, 0.3830E-05_dp, & + 0.3795E-05_dp, 0.3614E-05_dp, 0.3237E-05_dp, 0.3074E-05_dp, 0.2901E-05_dp, & + 0.2749E-05_dp, 0.2758E-05_dp, 0.3022E-05_dp, 0.3327E-05_dp, 0.4015E-05_dp, & + 0.4951E-05_dp, 0.5886E-05_dp, 0.7069E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, & + 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, & + 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, & + 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp, 0.8036E-05_dp/ + DATA (scaviceplate(12,ja),ja=0,60)/ & + 0._dp, & + 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, & + 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, 0.1807E-02_dp, & + 0.1807E-02_dp, 0.1278E-02_dp, 0.7567E-03_dp, 0.4822E-03_dp, 0.2984E-03_dp, & + 0.1882E-03_dp, 0.1260E-03_dp, 0.8015E-04_dp, 0.5343E-04_dp, 0.3657E-04_dp, & + 0.2738E-04_dp, 0.2135E-04_dp, 0.1792E-04_dp, 0.1444E-04_dp, 0.1195E-04_dp, & + 0.1023E-04_dp, 0.8896E-05_dp, 0.7895E-05_dp, 0.6811E-05_dp, 0.6213E-05_dp, & + 0.5911E-05_dp, 0.5620E-05_dp, 0.5408E-05_dp, 0.5205E-05_dp, 0.5154E-05_dp, & + 0.4964E-05_dp, 0.4849E-05_dp, 0.4923E-05_dp, 0.4920E-05_dp, 0.5920E-05_dp, & + 0.7414E-05_dp, 0.6511E-05_dp, 0.6155E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, & + 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, & + 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, & + 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp, 0.6371E-05_dp/ + DATA (scaviceplate(13,ja),ja=0,60)/ & + 0._dp, & + 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, & + 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, 0.1740E-02_dp, & + 0.1740E-02_dp, 0.1267E-02_dp, 0.8458E-03_dp, 0.5811E-03_dp, 0.3720E-03_dp, & + 0.2461E-03_dp, 0.1736E-03_dp, 0.1233E-03_dp, 0.8764E-04_dp, 0.6523E-04_dp, & + 0.4988E-04_dp, 0.3717E-04_dp, 0.2953E-04_dp, 0.2212E-04_dp, 0.1725E-04_dp, & + 0.1412E-04_dp, 0.1137E-04_dp, 0.9989E-05_dp, 0.8831E-05_dp, 0.8405E-05_dp, & + 0.8056E-05_dp, 0.8607E-05_dp, 0.9877E-05_dp, 0.1151E-04_dp, 0.1453E-04_dp, & + 0.1717E-04_dp, 0.1957E-04_dp, 0.2094E-04_dp, 0.2095E-04_dp, 0.2035E-04_dp, & + 0.1861E-04_dp, 0.8468E-05_dp, 0.2460E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, & + 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, & + 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, & + 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp, 0.1103E-05_dp/ + DATA (scaviceplate(14,ja),ja=0,60)/ & + 0._dp, & + 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, & + 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, 0.2353E-02_dp, & + 0.2353E-02_dp, 0.1669E-02_dp, 0.1182E-02_dp, 0.7722E-03_dp, 0.5121E-03_dp, & + 0.3289E-03_dp, 0.2327E-03_dp, 0.1713E-03_dp, 0.1243E-03_dp, 0.9585E-04_dp, & + 0.7249E-04_dp, 0.5249E-04_dp, 0.3838E-04_dp, 0.2727E-04_dp, 0.2095E-04_dp, & + 0.1661E-04_dp, 0.1271E-04_dp, 0.1102E-04_dp, 0.1082E-04_dp, 0.1098E-04_dp, & + 0.1131E-04_dp, 0.1415E-04_dp, 0.1825E-04_dp, 0.2443E-04_dp, 0.3333E-04_dp, & + 0.4201E-04_dp, 0.4997E-04_dp, 0.5477E-04_dp, 0.5618E-04_dp, 0.5145E-04_dp, & + 0.4223E-04_dp, 0.1690E-04_dp, 0.3497E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, & + 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, & + 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, & + 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp, 0.1208E-05_dp/ + DATA (scaviceplate(15,ja),ja=0,60)/ & + 0._dp, & + 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, & + 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, 0.3047E-02_dp, & + 0.3047E-02_dp, 0.2215E-02_dp, 0.1514E-02_dp, 0.9771E-03_dp, 0.6620E-03_dp, & + 0.4390E-03_dp, 0.3035E-03_dp, 0.2227E-03_dp, 0.1682E-03_dp, 0.1277E-03_dp, & + 0.1017E-03_dp, 0.7686E-04_dp, 0.5615E-04_dp, 0.4240E-04_dp, 0.3245E-04_dp, & + 0.2583E-04_dp, 0.2035E-04_dp, 0.1777E-04_dp, 0.1834E-04_dp, 0.1977E-04_dp, & + 0.2264E-04_dp, 0.2860E-04_dp, 0.3696E-04_dp, 0.5196E-04_dp, 0.6686E-04_dp, & + 0.8369E-04_dp, 0.9816E-04_dp, 0.1069E-03_dp, 0.1121E-03_dp, 0.9689E-04_dp, & + 0.7585E-04_dp, 0.2810E-04_dp, 0.6556E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, & + 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, & + 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, & + 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp, 0.2357E-05_dp/ + DATA (scaviceplate(16,ja),ja=0,60)/ & + 0._dp, & + 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, & + 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, 0.3741E-02_dp, & + 0.3741E-02_dp, 0.2761E-02_dp, 0.1847E-02_dp, 0.1182E-02_dp, 0.8118E-03_dp, & + 0.5491E-03_dp, 0.3743E-03_dp, 0.2741E-03_dp, 0.2122E-03_dp, 0.1595E-03_dp, & + 0.1310E-03_dp, 0.1012E-03_dp, 0.7393E-04_dp, 0.5752E-04_dp, 0.4395E-04_dp, & + 0.3505E-04_dp, 0.2799E-04_dp, 0.2453E-04_dp, 0.2587E-04_dp, 0.2856E-04_dp, & + 0.3398E-04_dp, 0.4304E-04_dp, 0.5566E-04_dp, 0.7949E-04_dp, 0.1004E-03_dp, & + 0.1254E-03_dp, 0.1463E-03_dp, 0.1589E-03_dp, 0.1681E-03_dp, 0.1423E-03_dp, & + 0.1095E-03_dp, 0.3929E-04_dp, 0.9615E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, & + 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, & + 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, & + 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp, 0.3505E-05_dp/ + DATA (scaviceplate(17,ja),ja=0,60)/ & + 0._dp, & + 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, & + 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, 0.4646E-02_dp, & + 0.4646E-02_dp, 0.3529E-02_dp, 0.2310E-02_dp, 0.1493E-02_dp, 0.1033E-02_dp, & + 0.7077E-03_dp, 0.4809E-03_dp, 0.3509E-03_dp, 0.2702E-03_dp, 0.2024E-03_dp, & + 0.1649E-03_dp, 0.1290E-03_dp, 0.9374E-04_dp, 0.7278E-04_dp, 0.5621E-04_dp, & + 0.4550E-04_dp, 0.3871E-04_dp, 0.3659E-04_dp, 0.4115E-04_dp, 0.5098E-04_dp, & + 0.6341E-04_dp, 0.7921E-04_dp, 0.9941E-04_dp, 0.1338E-03_dp, 0.1651E-03_dp, & + 0.1969E-03_dp, 0.2267E-03_dp, 0.2457E-03_dp, 0.2578E-03_dp, 0.2372E-03_dp, & + 0.2278E-03_dp, 0.2691E-03_dp, 0.6426E-03_dp, 0.1614E-02_dp, 0.1614E-02_dp, & + 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, & + 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, & + 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp, 0.1614E-02_dp/ + DATA (scaviceplate(18,ja),ja=0,60)/ & + 0._dp, & + 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, & + 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, 0.5779E-02_dp, & + 0.5779E-02_dp, 0.4537E-02_dp, 0.2914E-02_dp, 0.1920E-02_dp, 0.1333E-02_dp, & + 0.9189E-03_dp, 0.6260E-03_dp, 0.4553E-03_dp, 0.3435E-03_dp, 0.2572E-03_dp, & + 0.2038E-03_dp, 0.1606E-03_dp, 0.1158E-03_dp, 0.8816E-04_dp, 0.6930E-04_dp, & + 0.5729E-04_dp, 0.5277E-04_dp, 0.5440E-04_dp, 0.6484E-04_dp, 0.8817E-04_dp, & + 0.1125E-03_dp, 0.1389E-03_dp, 0.1703E-03_dp, 0.2171E-03_dp, 0.2636E-03_dp, & + 0.3009E-03_dp, 0.3419E-03_dp, 0.3699E-03_dp, 0.3840E-03_dp, 0.3856E-03_dp, & + 0.4378E-03_dp, 0.7357E-03_dp, 0.1958E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, & + 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, & + 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, & + 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp, 0.4969E-02_dp/ + DATA (scaviceplate(19,ja),ja=0,60)/ & + 0._dp, & + 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, & + 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, 0.6912E-02_dp, & + 0.6912E-02_dp, 0.5545E-02_dp, 0.3519E-02_dp, 0.2347E-02_dp, 0.1632E-02_dp, & + 0.1130E-02_dp, 0.7711E-03_dp, 0.5596E-03_dp, 0.4169E-03_dp, 0.3121E-03_dp, & + 0.2427E-03_dp, 0.1921E-03_dp, 0.1378E-03_dp, 0.1036E-03_dp, 0.8239E-04_dp, & + 0.6908E-04_dp, 0.6683E-04_dp, 0.7221E-04_dp, 0.8853E-04_dp, 0.1254E-03_dp, & + 0.1615E-03_dp, 0.1986E-03_dp, 0.2412E-03_dp, 0.3005E-03_dp, 0.3621E-03_dp, & + 0.4049E-03_dp, 0.4572E-03_dp, 0.4942E-03_dp, 0.5103E-03_dp, 0.5340E-03_dp, & + 0.6478E-03_dp, 0.1202E-02_dp, 0.3273E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, & + 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, & + 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, & + 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp, 0.8324E-02_dp/ + DATA (scaviceplate(20,ja),ja=0,60)/ & + 0._dp, & + 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, & + 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, 0.8112E-02_dp, & + 0.8112E-02_dp, 0.6509E-02_dp, 0.4155E-02_dp, 0.2793E-02_dp, 0.1935E-02_dp, & + 0.1349E-02_dp, 0.9293E-03_dp, 0.6722E-03_dp, 0.4995E-03_dp, 0.3734E-03_dp, & + 0.2899E-03_dp, 0.2268E-03_dp, 0.1626E-03_dp, 0.1215E-03_dp, 0.9599E-04_dp, & + 0.8251E-04_dp, 0.8276E-04_dp, 0.9306E-04_dp, 0.1193E-03_dp, 0.1715E-03_dp, & + 0.2235E-03_dp, 0.2809E-03_dp, 0.3529E-03_dp, 0.4399E-03_dp, 0.5415E-03_dp, & + 0.6330E-03_dp, 0.7281E-03_dp, 0.7844E-03_dp, 0.7899E-03_dp, 0.8247E-03_dp, & + 0.1022E-02_dp, 0.1945E-02_dp, 0.5344E-02_dp, 0.1345E-01_dp, 0.1345E-01_dp, & + 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, & + 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, & + 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp, 0.1345E-01_dp/ + DATA (scaviceplate(21,ja),ja=0,60)/ & + 0._dp, & + 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, & + 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, 0.9397E-02_dp, & + 0.9397E-02_dp, 0.7418E-02_dp, 0.4831E-02_dp, 0.3265E-02_dp, 0.2241E-02_dp, & + 0.1576E-02_dp, 0.1104E-02_dp, 0.7952E-03_dp, 0.5940E-03_dp, 0.4429E-03_dp, & + 0.3478E-03_dp, 0.2656E-03_dp, 0.1908E-03_dp, 0.1427E-03_dp, 0.1103E-03_dp, & + 0.9805E-04_dp, 0.1011E-03_dp, 0.1178E-03_dp, 0.1592E-03_dp, 0.2292E-03_dp, & + 0.3020E-03_dp, 0.3917E-03_dp, 0.5168E-03_dp, 0.6506E-03_dp, 0.8238E-03_dp, & + 0.1019E-02_dp, 0.1197E-02_dp, 0.1286E-02_dp, 0.1265E-02_dp, 0.1296E-02_dp, & + 0.1604E-02_dp, 0.3038E-02_dp, 0.8376E-02_dp, 0.2084E-01_dp, 0.2084E-01_dp, & + 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, & + 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, & + 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp, 0.2084E-01_dp/ + DATA (scaviceplate(22,ja),ja=0,60)/ & + 0._dp, & + 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, & + 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, 0.1068E-01_dp, & + 0.1068E-01_dp, 0.8328E-02_dp, 0.5507E-02_dp, 0.3736E-02_dp, 0.2547E-02_dp, & + 0.1803E-02_dp, 0.1279E-02_dp, 0.9183E-03_dp, 0.6884E-03_dp, 0.5123E-03_dp, & + 0.4056E-03_dp, 0.3043E-03_dp, 0.2191E-03_dp, 0.1640E-03_dp, 0.1245E-03_dp, & + 0.1136E-03_dp, 0.1194E-03_dp, 0.1425E-03_dp, 0.1990E-03_dp, 0.2868E-03_dp, & + 0.3805E-03_dp, 0.5026E-03_dp, 0.6806E-03_dp, 0.8614E-03_dp, 0.1106E-02_dp, & + 0.1406E-02_dp, 0.1666E-02_dp, 0.1787E-02_dp, 0.1739E-02_dp, 0.1768E-02_dp, & + 0.2186E-02_dp, 0.4132E-02_dp, 0.1141E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, & + 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, & + 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, & + 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp, 0.2822E-01_dp/ + DATA (scaviceplate(23,ja),ja=0,60)/ & + 0._dp, & + 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, & + 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, 0.1197E-01_dp, & + 0.1197E-01_dp, 0.9237E-02_dp, 0.6183E-02_dp, 0.4207E-02_dp, 0.2853E-02_dp, & + 0.2031E-02_dp, 0.1454E-02_dp, 0.1041E-02_dp, 0.7829E-03_dp, 0.5818E-03_dp, & + 0.4635E-03_dp, 0.3430E-03_dp, 0.2473E-03_dp, 0.1852E-03_dp, 0.1388E-03_dp, & + 0.1291E-03_dp, 0.1377E-03_dp, 0.1673E-03_dp, 0.2388E-03_dp, 0.3445E-03_dp, & + 0.4591E-03_dp, 0.6135E-03_dp, 0.8444E-03_dp, 0.1072E-02_dp, 0.1388E-02_dp, & + 0.1792E-02_dp, 0.2135E-02_dp, 0.2289E-02_dp, 0.2214E-02_dp, 0.2240E-02_dp, & + 0.2769E-02_dp, 0.5226E-02_dp, 0.1444E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, & + 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, & + 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, & + 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp, 0.3561E-01_dp/ + DATA (scaviceplate(24,ja),ja=0,60)/ & + 0._dp, & + 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, & + 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, 0.1325E-01_dp, & + 0.1325E-01_dp, 0.1015E-01_dp, 0.6859E-02_dp, 0.4678E-02_dp, 0.3160E-02_dp, & + 0.2259E-02_dp, 0.1628E-02_dp, 0.1164E-02_dp, 0.8773E-03_dp, 0.6512E-03_dp, & + 0.5213E-03_dp, 0.3817E-03_dp, 0.2756E-03_dp, 0.2065E-03_dp, 0.1530E-03_dp, & + 0.1447E-03_dp, 0.1559E-03_dp, 0.1920E-03_dp, 0.2786E-03_dp, 0.4021E-03_dp, & + 0.5376E-03_dp, 0.7244E-03_dp, 0.1008E-02_dp, 0.1283E-02_dp, 0.1671E-02_dp, & + 0.2178E-02_dp, 0.2604E-02_dp, 0.2791E-02_dp, 0.2689E-02_dp, 0.2712E-02_dp, & + 0.3351E-02_dp, 0.6319E-02_dp, 0.1747E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, & + 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, & + 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, & + 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp, 0.4299E-01_dp/ + DATA (scaviceplate(25,ja),ja=0,60)/ & + 0._dp, & + 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, & + 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, 0.1492E-01_dp, & + 0.1492E-01_dp, 0.1145E-01_dp, 0.7710E-02_dp, 0.5261E-02_dp, 0.3610E-02_dp, & + 0.2559E-02_dp, 0.1864E-02_dp, 0.1326E-02_dp, 0.9913E-03_dp, 0.7496E-03_dp, & + 0.5930E-03_dp, 0.4297E-03_dp, 0.3055E-03_dp, 0.2338E-03_dp, 0.1816E-03_dp, & + 0.1866E-03_dp, 0.2202E-03_dp, 0.2822E-03_dp, 0.4817E-03_dp, 0.7990E-03_dp, & + 0.1196E-02_dp, 0.1670E-02_dp, 0.2281E-02_dp, 0.2885E-02_dp, 0.3655E-02_dp, & + 0.4450E-02_dp, 0.5109E-02_dp, 0.5615E-02_dp, 0.5505E-02_dp, 0.5488E-02_dp, & + 0.6268E-02_dp, 0.9452E-02_dp, 0.2059E-01_dp, 0.4521E-01_dp, 0.4523E-01_dp, & + 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, & + 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, & + 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp, 0.4523E-01_dp/ + DATA (scaviceplate(26,ja),ja=0,60)/ & + 0._dp, & + 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, & + 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, 0.1665E-01_dp, & + 0.1665E-01_dp, 0.1283E-01_dp, 0.8593E-02_dp, 0.5864E-02_dp, 0.4088E-02_dp, & + 0.2874E-02_dp, 0.2111E-02_dp, 0.1495E-02_dp, 0.1109E-02_dp, 0.8534E-03_dp, & + 0.6674E-03_dp, 0.4794E-03_dp, 0.3358E-03_dp, 0.2624E-03_dp, 0.2128E-03_dp, & + 0.2336E-03_dp, 0.2931E-03_dp, 0.3848E-03_dp, 0.7159E-03_dp, 0.1261E-02_dp, & + 0.1964E-02_dp, 0.2775E-02_dp, 0.3766E-02_dp, 0.4752E-02_dp, 0.5964E-02_dp, & + 0.7081E-02_dp, 0.8001E-02_dp, 0.8882E-02_dp, 0.8768E-02_dp, 0.8704E-02_dp, & + 0.9631E-02_dp, 0.1297E-01_dp, 0.2373E-01_dp, 0.4644E-01_dp, 0.4648E-01_dp, & + 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, & + 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, & + 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp, 0.4648E-01_dp/ + DATA (scaviceplate(27,ja),ja=0,60)/ & + 0._dp, & + 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, & + 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, 0.1839E-01_dp, & + 0.1839E-01_dp, 0.1421E-01_dp, 0.9477E-02_dp, 0.6468E-02_dp, 0.4566E-02_dp, & + 0.3189E-02_dp, 0.2359E-02_dp, 0.1664E-02_dp, 0.1227E-02_dp, 0.9572E-03_dp, & + 0.7417E-03_dp, 0.5291E-03_dp, 0.3661E-03_dp, 0.2910E-03_dp, 0.2441E-03_dp, & + 0.2806E-03_dp, 0.3661E-03_dp, 0.4875E-03_dp, 0.9502E-03_dp, 0.1722E-02_dp, & + 0.2732E-02_dp, 0.3880E-02_dp, 0.5251E-02_dp, 0.6618E-02_dp, 0.8273E-02_dp, & + 0.9711E-02_dp, 0.1089E-01_dp, 0.1215E-01_dp, 0.1203E-01_dp, 0.1192E-01_dp, & + 0.1299E-01_dp, 0.1650E-01_dp, 0.2687E-01_dp, 0.4767E-01_dp, 0.4773E-01_dp, & + 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, & + 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, & + 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp, 0.4773E-01_dp/ + DATA (scaviceplate(28,ja),ja=0,60)/ & + 0._dp, & + 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, & + 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, 0.2013E-01_dp, & + 0.2013E-01_dp, 0.1559E-01_dp, 0.1036E-01_dp, 0.7071E-02_dp, 0.5044E-02_dp, & + 0.3504E-02_dp, 0.2606E-02_dp, 0.1833E-02_dp, 0.1344E-02_dp, 0.1061E-02_dp, & + 0.8161E-03_dp, 0.5788E-03_dp, 0.3964E-03_dp, 0.3195E-03_dp, 0.2753E-03_dp, & + 0.3276E-03_dp, 0.4390E-03_dp, 0.5902E-03_dp, 0.1184E-02_dp, 0.2184E-02_dp, & + 0.3500E-02_dp, 0.4985E-02_dp, 0.6735E-02_dp, 0.8485E-02_dp, 0.1058E-01_dp, & + 0.1234E-01_dp, 0.1378E-01_dp, 0.1542E-01_dp, 0.1529E-01_dp, 0.1514E-01_dp, & + 0.1636E-01_dp, 0.2002E-01_dp, 0.3001E-01_dp, 0.4890E-01_dp, 0.4899E-01_dp, & + 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, & + 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, & + 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp, 0.4899E-01_dp/ + DATA (scaviceplate(29,ja),ja=0,60)/ & + 0._dp, & + 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, & + 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, 0.2186E-01_dp, & + 0.2186E-01_dp, 0.1697E-01_dp, 0.1124E-01_dp, 0.7675E-02_dp, 0.5522E-02_dp, & + 0.3819E-02_dp, 0.2854E-02_dp, 0.2002E-02_dp, 0.1462E-02_dp, 0.1165E-02_dp, & + 0.8904E-03_dp, 0.6286E-03_dp, 0.4267E-03_dp, 0.3481E-03_dp, 0.3066E-03_dp, & + 0.3745E-03_dp, 0.5120E-03_dp, 0.6928E-03_dp, 0.1419E-02_dp, 0.2645E-02_dp, & + 0.4269E-02_dp, 0.6090E-02_dp, 0.8220E-02_dp, 0.1035E-01_dp, 0.1289E-01_dp, & + 0.1497E-01_dp, 0.1668E-01_dp, 0.1868E-01_dp, 0.1856E-01_dp, 0.1835E-01_dp, & + 0.1972E-01_dp, 0.2354E-01_dp, 0.3315E-01_dp, 0.5012E-01_dp, 0.5024E-01_dp, & + 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, & + 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, & + 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp, 0.5024E-01_dp/ + DATA (scaviceplate(30,ja),ja=0,60)/ & + 0._dp, & + 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, & + 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, 0.2360E-01_dp, & + 0.2360E-01_dp, 0.1835E-01_dp, 0.1213E-01_dp, 0.8278E-02_dp, 0.6000E-02_dp, & + 0.4134E-02_dp, 0.3101E-02_dp, 0.2171E-02_dp, 0.1580E-02_dp, 0.1269E-02_dp, & + 0.9648E-03_dp, 0.6783E-03_dp, 0.4570E-03_dp, 0.3766E-03_dp, 0.3378E-03_dp, & + 0.4215E-03_dp, 0.5850E-03_dp, 0.7955E-03_dp, 0.1653E-02_dp, 0.3107E-02_dp, & + 0.5037E-02_dp, 0.7195E-02_dp, 0.9704E-02_dp, 0.1222E-01_dp, 0.1520E-01_dp, & + 0.1760E-01_dp, 0.1957E-01_dp, 0.2195E-01_dp, 0.2182E-01_dp, 0.2157E-01_dp, & + 0.2308E-01_dp, 0.2706E-01_dp, 0.3629E-01_dp, 0.5136E-01_dp, 0.5149E-01_dp, & + 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, & + 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, & + 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp, 0.5149E-01_dp/ + DATA (scaviceplate(31,ja),ja=0,60)/ & + 0._dp, & + 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, & + 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, 0.2534E-01_dp, & + 0.2534E-01_dp, 0.1973E-01_dp, 0.1301E-01_dp, 0.8881E-02_dp, 0.6478E-02_dp, & + 0.4449E-02_dp, 0.3349E-02_dp, 0.2339E-02_dp, 0.1698E-02_dp, 0.1372E-02_dp, & + 0.1039E-02_dp, 0.7280E-03_dp, 0.4873E-03_dp, 0.4052E-03_dp, 0.3691E-03_dp, & + 0.4685E-03_dp, 0.6579E-03_dp, 0.8981E-03_dp, 0.1887E-02_dp, 0.3569E-02_dp, & + 0.5805E-02_dp, 0.8300E-02_dp, 0.1119E-01_dp, 0.1409E-01_dp, 0.1751E-01_dp, & + 0.2023E-01_dp, 0.2246E-01_dp, 0.2522E-01_dp, 0.2508E-01_dp, 0.2478E-01_dp, & + 0.2644E-01_dp, 0.3058E-01_dp, 0.3942E-01_dp, 0.5258E-01_dp, 0.5274E-01_dp, & + 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, & + 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, & + 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp, 0.5274E-01_dp/ + DATA (scaviceplate(32,ja),ja=0,60)/ & + 0._dp, & + 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, & + 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, 0.2707E-01_dp, & + 0.2707E-01_dp, 0.2111E-01_dp, 0.1390E-01_dp, 0.9485E-02_dp, 0.6956E-02_dp, & + 0.4764E-02_dp, 0.3596E-02_dp, 0.2508E-02_dp, 0.1815E-02_dp, 0.1476E-02_dp, & + 0.1113E-02_dp, 0.7777E-03_dp, 0.5175E-03_dp, 0.4337E-03_dp, 0.4003E-03_dp, & + 0.5155E-03_dp, 0.7309E-03_dp, 0.1001E-02_dp, 0.2121E-02_dp, 0.4030E-02_dp, & + 0.6574E-02_dp, 0.9405E-02_dp, 0.1267E-01_dp, 0.1595E-01_dp, 0.1982E-01_dp, & + 0.2286E-01_dp, 0.2535E-01_dp, 0.2848E-01_dp, 0.2834E-01_dp, 0.2800E-01_dp, & + 0.2981E-01_dp, 0.3410E-01_dp, 0.4256E-01_dp, 0.5381E-01_dp, 0.5400E-01_dp, & + 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, & + 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, & + 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp, 0.5400E-01_dp/ + DATA (scaviceplate(33,ja),ja=0,60)/ & + 0._dp, & + 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, & + 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, 0.2881E-01_dp, & + 0.2881E-01_dp, 0.2249E-01_dp, 0.1478E-01_dp, 0.1009E-01_dp, 0.7434E-02_dp, & + 0.5079E-02_dp, 0.3844E-02_dp, 0.2677E-02_dp, 0.1933E-02_dp, 0.1580E-02_dp, & + 0.1188E-02_dp, 0.8274E-03_dp, 0.5478E-03_dp, 0.4623E-03_dp, 0.4316E-03_dp, & + 0.5625E-03_dp, 0.8039E-03_dp, 0.1103E-02_dp, 0.2355E-02_dp, 0.4492E-02_dp, & + 0.7342E-02_dp, 0.1051E-01_dp, 0.1416E-01_dp, 0.1782E-01_dp, 0.2213E-01_dp, & + 0.2550E-01_dp, 0.2825E-01_dp, 0.3175E-01_dp, 0.3160E-01_dp, 0.3122E-01_dp, & + 0.3317E-01_dp, 0.3762E-01_dp, 0.4570E-01_dp, 0.5504E-01_dp, 0.5525E-01_dp, & + 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, & + 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, & + 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp, 0.5525E-01_dp/ + DATA (scaviceplate(34,ja),ja=0,60)/ & + 0._dp, & + 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, & + 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, 0.2978E-01_dp, & + 0.2978E-01_dp, 0.2326E-01_dp, 0.1527E-01_dp, 0.1043E-01_dp, 0.7702E-02_dp, & + 0.5255E-02_dp, 0.3982E-02_dp, 0.2772E-02_dp, 0.1999E-02_dp, 0.1638E-02_dp, & + 0.1230E-02_dp, 0.8553E-03_dp, 0.5648E-03_dp, 0.4783E-03_dp, 0.4491E-03_dp, & + 0.5888E-03_dp, 0.8447E-03_dp, 0.1161E-02_dp, 0.2487E-02_dp, 0.4750E-02_dp, & + 0.7772E-02_dp, 0.1113E-01_dp, 0.1499E-01_dp, 0.1886E-01_dp, 0.2342E-01_dp, & + 0.2697E-01_dp, 0.2987E-01_dp, 0.3358E-01_dp, 0.3343E-01_dp, 0.3302E-01_dp, & + 0.3505E-01_dp, 0.3960E-01_dp, 0.4746E-01_dp, 0.5573E-01_dp, 0.5595E-01_dp, & + 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, & + 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, & + 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp, 0.5595E-01_dp/ +!< +!! \filename +!! mo_hammoz_drydep.f90 +!! +!! \brief +!! Module to interface ECHAM submodules with dry deposition module(s). +!! +!! \author M. Schultz (FZ Juelich) +!! \author Grazia Frontoso (C2SM) +!! +!! \responsible_coder +!! M. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-10-26) +!! -# M. Schultz (FZ Juelich) - improved diag routines (2010-04-16) +!! -# Grazia Frontoso (C2SM) - usage of the input variables defined over land, water, ice to account +!! for the non-linearity in the drydep calculations for gridboxes +!! containing both water and sea ice (2012-02-01) +!! +!! \limitations +!! All diag_lists must be defined in order to avoid problems with +!! get_diag_pointer in the actual sedi_interface routine. Lists can be empty. +!! +!! \details +!! Currently there is only one unified interactive drydep scheme for +!! aerosols (HAM) and gas-phase species (MOZ). +!! This module initializes the scheme based on the namelist parameters +!! in submodeldiagctl and creates a stream for variable pointers and +!! diagnostic quantities used in the dry deposition scheme. It also +!! provides a generic interface to the actual dry deposition routine(s). +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! \copyright +!! Copyright and licencing conditions are defined in the ECHAM-HAMMOZ +!! licencing agreement to be found at: +!! https://redmine.hammoz.ethz.ch/projects/hammoz/wiki/1_Licencing_conditions +!! The ECHAM-HAMMOZ software is provided "as is" and without warranty of any kind. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_hammoz_drydep + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: t_diag_list +#endif + IMPLICIT NONE + + PRIVATE + + ! public variables (see declaration below) + + ! subprograms +#ifdef HAMMOZ + PUBLIC :: init_drydep_stream, & + drydep_interface, drydep_init +#else + PUBLIC :: drydep_interface +#endif + ! drydep_stream + INTEGER, PARAMETER :: ndrydepvars=2 + CHARACTER(LEN=32) :: drydepvars(1:ndrydepvars)= & + (/'ddep ', & ! total drydep flux + 'vddep ' /) ! deposition velocity + + ! variable pointers and diagnostic lists +!! TYPE (t_diag_list), PUBLIC :: ddepinst ! inst. dry deposition flux ### needed ??? ### +#ifdef HAMMOZ + TYPE (t_diag_list), PUBLIC :: ddep ! dry deposition flux + TYPE (t_diag_list), PUBLIC :: vddep ! dry deposition velocity +#endif + INTEGER :: idt_ddep_detail + + CONTAINS +#ifdef HAMMOZ +!>>gf #244 + SUBROUTINE drydep_init + + USE mo_hammoz_drydep_lg, ONLY: drydep_lg_init + USE mo_tracdef, ONLY: ntrac, trlist + + !--- initialize the interactive drydep scheme (ndrydep==2) + IF (ANY(trlist%ti(1:ntrac)%ndrydep == 2)) CALL drydep_lg_init + + END SUBROUTINE drydep_init +!< 0) CALL finish ( 'ini_drydep_stream', 'variable '// & + drydepnam(ierr)//' does not exist in drydep stream' ) + END IF + + !-- find out which gas-phase tracers shall be included in diagnostics + CALL validate_traclist(drydep_gastrac, defaultgas, nphase=GAS, & + ldrydep=.true.) !>>dod SOA: removed ltran < 0) THEN + tracflag(jt) = trlist%ti(jt)%ndrydep > 0 + END IF + END IF + END DO + specflag(:) = .FALSE. + DO jt = 1,nspec + specname(jt) = speclist(jt)%shortname + IF (drydep_keytype == BYSPECIES .AND. & + IAND(speclist(jt)%nphase, AEROSOL) /= 0 .AND. & !>>dod SOA removed check of trtype < 0) THEN + specflag(jt) = speclist(jt)%ldrydep + END IF + END DO + DO jt = 1,ntrac + tracname(jt) = trlist%ti(jt)%fullname + IF (trlist%ti(jt)%nphase == GAS) THEN + tracflag(jt) = st1_in_st2_proof(trlist%ti(jt)%fullname, drydep_gastrac) + END IF + END DO +!--mgs + modflag(:) = .FALSE. + modname(:) = '' + !SF #228, adding a condition to check that HAM is active: + !SF #299, adding a condition to check if BYMODE is relevant: + IF (lham .AND. nclass > 0 .AND. (drydep_keytype == BYMODE)) & + CALL ham_get_class_flag(nclass, modflag, modname, modnumname, ldrydep=.true.) + + !-- open new diagnostic stream + CALL new_stream (sdrydep,'drydep',lpost=drydep_lpost,lrerun=.FALSE., & + interval=drydep_tinterval) + CALL default_stream_setting (sdrydep, lrerun = .FALSE., & + leveltype=SURFACE, & !++mgs 20140519: added this for safety + contnorest = .TRUE., table = 199, & + laccu = .false., code = AUTO) + + !-- add standard ECHAM variables + IF (drydep_lpost) THEN + CALL add_stream_reference (sdrydep, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (sdrydep, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (sdrydep, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (sdrydep, 'gboxarea','geoloc',lpost=.TRUE.) + END IF + + !-- add instantaneous drydep rates (always by tracer) + !-- these are used in the calculation and must always be present in the stream + !-- it is never output +!! CALL default_stream_setting (drydep, lrerun=.TRUE.) +!! CALL new_diag_list (ddepinst, drydep, diagname='ddep_inst', tsubmname='', & +!! longname='dry deposition mass flux', units='kg m-2 s-1', & +!! ndims=2, nmaxkey=(/ntrac, 0, 0, 0 /) ) +!! DO jt = 1,ntrac +!! IF (trlist%ti(jt)%ndrydep > 0) THEN +!! cunit = 'kg m-2 s-1' +!! CALL new_diag(ddepinst, 'ddepinst_'//TRIM(trlist%ti(jt)%fullname), & +!! 'dry deposition mass flux of '//TRIM(trlist%ti(jt)%fullname), & +!! cunit, BYTRACER, jt, lpost=.false.) +!! END IF +!! END DO + + !-- instantaneous diagnostic quantities + + CALL default_stream_setting (sdrydep, lrerun=.FALSE., laccu=.FALSE.) + + !-- drydep velocities + !-- these are used in the calculation and must always be present in the stream + !-- drydep_gastrac only controls output + lpost = st1_in_st2_proof( 'vddep', drydepnam) .AND. drydep_lpost + CALL new_diag_list (vddep, sdrydep, diagname='vddep', tsubmname='', & + longname='dry deposition velocity', units='m s-1', & + ndims=2, nmaxkey=(/ntrac, 0, nclass, nclass, 0 /), lpost=lpost ) + CALL new_diag(vddep, ntrac, tracflag, tracname, BYTRACER) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(vddep, nclass, modflag, modname, BYMODE) + CALL new_diag(vddep, nclass, modflag, modnumname, BYNUMMODE) + END IF + + !-- averaged diagnostic quantities + + CALL default_stream_setting (sdrydep, lrerun=.FALSE., laccu=.TRUE.) + + !-- total drydep flux + lpost = st1_in_st2_proof( 'ddep', drydepnam) .AND. drydep_lpost + CALL new_diag_list (ddep, sdrydep, diagname='ddep', tsubmname='', & + longname='accumulated dry deposition flux',& + units='kg m-2 s-1', ndims=2, & + nmaxkey=(/ntrac, nspec, nclass, nclass, 0 /), lpost=lpost ) + ! add diagnostic elements only when output is activated + IF (lpost) THEN + CALL new_diag(ddep, ntrac, tracflag, tracname, BYTRACER) + CALL new_diag(ddep, nspec, specflag, specname, BYSPECIES) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(ddep, nclass, modflag, modname, BYMODE) + CALL new_diag(ddep, nclass, modflag, modnumname, BYNUMMODE) + END IF + END IF + + !++mgs 20140519 : detailed diagnostics + IF (drydep_ldetail) CALL init_drydep_lg_stream(sdrydep, drydep_trac_detail, idt_ddep_detail) + + END SUBROUTINE init_drydep_stream +#endif + !! --------------------------------------------------------------------------------------- + !! drydep_interface: generic interface routine to dry deposition + + SUBROUTINE drydep_interface(kbdim, kproma, klev, krow, & +!>>gf modified argument list (see#78) + pqsfc, pqsssfc, ptsfc, pcfml, pcfmw, pcfmi, & + pcfncl, pcfncw, pcfnci, & + pepdu2, pkap, pum1, pvm1, pgeom1, pril, priw, & + prii, & + ptvir1, ptvl, ptvw, ptvi, paz0, & + ptslm1, loland, & + pm6rp, prhop, & ! m7 + pfrl, pfrw, pfri, pcvs, pcvw, pvgrat, & + psrfl, pu10, pv10, & + pxtems, pxtm1, pdensair, paphp1, pforest, ptsi, & + paz0l, paz0w, paz0i, pcdnl, pcdnw, pcdni, pddepflux, pvdep) !eehol: added pddepflux for diagnostics, pvdep for diagnostics + +!<> gf see #78 + REAL(dp), INTENT(in) :: pcfml (kbdim) ! stability dependend transfer coeff. for momentum over land + REAL(dp), INTENT(in) :: pcfmw (kbdim) ! stability dependend transfer coeff. for momentum over water + REAL(dp), INTENT(in) :: pcfmi (kbdim) ! stability dependend transfer coeff. for momentum over ice + REAL(dp), INTENT(in) :: pcfncl (kbdim) ! function of heat transfer coeff. over land + REAL(dp), INTENT(in) :: pcfncw (kbdim) ! function of heat transfer coeff. over water + REAL(dp), INTENT(in) :: pcfnci (kbdim) ! function of heat transfer coeff. over ice +!<>gf see #78 + REAL(dp), INTENT(in) :: pril (kbdim) ! moist richardson number ocer land + REAL(dp), INTENT(in) :: priw (kbdim) ! moist richardson number over water + REAL(dp), INTENT(in) :: prii (kbdim) ! moist richardson number over ice +!<>gf see #78 + REAL(dp), INTENT(in) :: ptvl (kbdim) ! virtual potential temp. over land + REAL(dp), INTENT(in) :: ptvw (kbdim) ! virtual potential temp. over ocean + REAL(dp), INTENT(in) :: ptvi (kbdim) ! virtual potential temp. over ice +!<>gf see #78 + REAL(dp), INTENT(in) :: pcdnl (kbdim) ! see mo_surface_land + REAL(dp), INTENT(in) :: pcdnw (kbdim) ! see mo_surface_ocean + REAL(dp), INTENT(in) :: pcdni (kbdim) ! see mo_surface_ice +#ifndef HAMMOZ + REAL(dp), PARAMETER :: ustarmin=1.e-5_dp +#endif +!<>gf see #78 + zustveg(kbdim), zustslsn(kbdim), & + zustarl(kbdim), zustarw(kbdim), zustari(kbdim), & + zvgrat(kbdim), zcvbs(kbdim), zrh(kbdim), zhgt(kbdim) !eehol: added zhgt (geopotential height) for analytical calculations +!<2) ) THEN + CALL finish('drydep_interface', 'Dry deposition with ndrydep > 2 not implemented') + END IF + + !--- 2.1) Prescibed dry deposition velocities: +#ifdef HAMMOZ + IF( ANY(trlist%ti(:)%ndrydep==1) ) THEN + CALL ham_vd_presc(kproma, kbdim, klev, krow, loland, & + paphp1, pcvs, pforest, pfri, ptsi, & + pcvw, ptslm1, zws, zwsmx, pdensair, & + zvd ) + END IF +#endif + !--- 2.2) Explicitly calculated dry deposition velocities (Ganzeveld scheme): + + IF ( ANY(trlist%ti(:)%ndrydep==2) ) THEN +#ifdef HAMMOZ + !--- Calculate the aerodynamic resistance: + CALL drydep_lg_calcra (kproma, kbdim, klev, krow, & +!>>gf modified argument list (see #78) + pepdu2, pkap, pum1, pvm1, pgeom1, pril, priw, prii, & + ptvir1, ptvl, ptvw, ptvi, ptslm1, loland, & + pcdnl, pcdnw, pcdni, pcfml, pcfmw, pcfmi, & + pcfncl, pcfncw, pcfnci, & + paz0w, paz0i, paz0l, & + zrahwat, zrahice, zrahveg, zrahslsn, & + zustarl, zustarw, zustari, zustveg, zustslsn ) +!<>gf modified argument list (see#78) + psrfl, ptslm1, pum1, pvm1, zrh, & + pfrl, pfrw, pfri, zcvbs, pcvs, & + pcvw, zvgrat, zrahwat, zrahice, zrahveg, & + zrahslsn, zws, zwsmx, & + zustarw, zustari, zustveg, zustslsn, & + zvd, zvdstom, idt_ddep_detail ) +!<>gf modified argument list (see#78) + pvm1, zustarl, zustarw, zustari, zustveg, zustslsn,& + pu10, pv10, & + pm6rp, prhop, & ! m7 + paz0w, paz0i, zrahwat, zrahice, zrahveg, zrahslsn,& + ptslm1, zrh, pxtm1, zvd ) +!< 0) THEN + !--- Calculate the tracer flux to the surface that is + ! equivalent to the deposition velocity: + pvdep(1:kproma,jt) = zvd(1:kproma,jt) !eehol: dry deposition velocity for diagnostics + + !-->eehol: analytical ddep flux calculations + zhgt(1:kproma)=(paphp1(1:kproma,klev+1)-paphp1(1:kproma,klev))/(pdensair(1:kproma)*grav) + zalpha(1:kproma)=time_step_len*zvd(1:kproma,jt)/zhgt(1:kproma) + zaeri(1:kproma)=pxtm1(1:kproma,klev,jt)*EXP(-1.0_dp*zalpha(1:kproma)) + zdrydepflux(1:kproma)=(pxtm1(1:kproma,klev,jt)-zaeri(1:kproma))*(paphp1(1:kproma,klev+1)-paphp1(1:kproma,klev))*(1.0_dp/time_step_len)*(1.0_dp/grav) + zdrydepflux(1:kproma)=MAX(0._dp,zdrydepflux(1:kproma)) + !<--eehol + + !zdrydepflux(1:kproma)=pxtm1(1:kproma,klev,jt)*pdensair(1:kproma)*zvd(1:kproma,jt) + !zdrydepflux(1:kproma)=MAX(0._dp,(pxtm1(1:kproma,klev,jt)*pdensair(1:kproma)*zvd(1:kproma,jt))) !eehol: ddepflux cant be negative + + !--- Reduce emission flux: + pxtems(1:kproma,jt)=pxtems(1:kproma,jt)-zdrydepflux(1:kproma) + !-->eehol: drydep flux for diagnostics + pddepflux(1:kproma,jt) = zdrydepflux(1:kproma) + !<--eehol + ELSE ! trlist%ti(jt)%ndrydep <= 0 + zdrydepflux(1:kproma)=0._dp + !-->eehol: drydep flux for diagnostics + pddepflux(1:kproma,jt) = zdrydepflux(1:kproma) + !<--eehol + END IF +#ifdef HAMMOZ + ! get diagnostics pointer + CALL get_diag_pointer(ddep, fld2d, jt, ierr=ierr) + IF (ierr == 0) fld2d(1:kproma,krow)=fld2d(1:kproma,krow)+zdrydepflux(1:kproma)*delta_time +!### add stomatal deposition flux ... ### + ! special diagnostics for MOZ + !! CALL moz_drydep_diag() .... ### to be done in mo_moz_diag +#endif + END DO + + END SUBROUTINE drydep_interface + + +END MODULE mo_hammoz_drydep diff --git a/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 new file mode 100644 index 00000000..74d6e07d --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_hammoz_sedimentation.F90 @@ -0,0 +1,294 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_hammoz_sedimentation.f90 +!! +!! \brief +!! module to interface ECHAM submodules with sedimentation module(s) +!! +!! \author M. Schultz (FZ Juelich) +!! +!! \responsible_coder +!! M. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-10-26) +!! -# M. Schultz (FZ Juelich) - improved diag routines (2010-04-16) +!! +!! \limitations +!! All diag_lists must be defined in order to avoid problems with +!! get_diag_pointer in the actual sedi_interface routine. Lists can be empty. +!! Currently there is only one unified interactive sedimentation scheme for +!! aerosols (HAM). +!! +!! \details +!! This module initializes the scheme based on the namelist parameters +!! in submodeldiagctl and creates a stream for variable pointers and +!! diagnostic quantities used in the sedimentation scheme. It also +!! provides a generic interface to the actual sedimentation routine(s). +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_hammoz_sedimentation + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: t_diag_list +#endif + + IMPLICIT NONE + + PRIVATE + + ! public variables (see declaration below) + + ! subprograms + PUBLIC :: sedi_interface +#ifdef HAMMOZ + PUBLIC :: init_sedi_stream + + ! sedi_stream + INTEGER, PARAMETER :: nsedivars=2 + CHARACTER(LEN=32) :: sedivars(1:nsedivars)= & + (/'sed ', & ! total sedimentation flux + 'vsedi ' /) ! sedimentation velocity + + ! variable pointers and diagnostic lists + TYPE (t_diag_list), PUBLIC :: sed ! sedimentation flux + TYPE (t_diag_list), PUBLIC :: vsedi ! sedimentation velocity +#endif + + CONTAINS + +#ifdef HAMMOZ + SUBROUTINE init_sedi_stream + + USE mo_string_utls, ONLY: st1_in_st2_proof + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: finish + USE mo_memory_base, ONLY: t_stream, new_stream, & + default_stream_setting, & + add_stream_reference, & + AUTO + USE mo_ham_m7_trac, ONLY: ham_get_class_flag + USE mo_tracdef, ONLY: ln, ntrac, trlist, AEROSOL + USE mo_species, ONLY: nspec, speclist + USE mo_ham, ONLY: nclass + USE mo_submodel_streams, ONLY: sedi_lpost, sedi_tinterval, sedinam, sedi_keytype + USE mo_submodel_diag, ONLY: new_diag_list, new_diag, & + BYTRACER, BYSPECIES, BYNUMMODE, BYMODE !SF #299 added BYMODE + USE mo_submodel, ONLY: lham !SF, see #228 + + + ! local variables + INTEGER, PARAMETER :: ndefault = 2 + CHARACTER(LEN=32) :: defnam(1:ndefault) = & ! default output + (/ 'sed ', & ! total sedimentation flux + 'vsedi ' /) ! sedimentation velocity + + LOGICAL :: tracflag(ntrac), specflag(nspec), modflag(MAX(nclass,1)) + CHARACTER(LEN=ln) :: tracname(ntrac), specname(nspec), modname(MAX(nclass,1)), & + modnumname(MAX(nclass,1)) !SF #299 + TYPE (t_stream), POINTER :: ssedi + INTEGER :: ierr, jt + LOGICAL :: lpost + + !++mgs: default values and namelist read are done in init_submodel_streams ! + + !-- handle ALL, DETAIL and DEFAULT options for sedi output variables + !-- Note: ALL and DETAIL are identical for sedi output + IF (TRIM(tolower(sedinam(1))) == 'detail') sedinam(1:nsedivars) = sedivars(:) + IF (TRIM(tolower(sedinam(1))) == 'all') sedinam(1:nsedivars) = sedivars(:) + IF (TRIM(tolower(sedinam(1))) == 'default') sedinam(1:ndefault) = defnam(:) + + !-- check that all variable names from namelist are valid + IF (.NOT. st1_in_st2_proof( sedinam, sedivars, ierr=ierr) ) THEN + IF (ierr > 0) CALL finish ( 'ini_sedi_stream', 'variable '// & + sedinam(ierr)//' does not exist in sedi stream' ) + END IF + + !-- define the flags and names for the diagnostic lists. We need one set of flags and + ! names for each key_type (BYTRACER, BYSPECIES, BYMODE) + ! gas-phase tracers will always be defined BYTRACER, for aerosol tracers one of the + ! following lists will be empty. + tracflag(:) = .FALSE. + DO jt = 1,ntrac + tracname(jt) = trlist%ti(jt)%fullname + IF (IAND(trlist%ti(jt)%nphase,AEROSOL) /= 0 .AND. & !>>dod diagnostics bugfix < 0) THEN + tracflag(jt) = trlist%ti(jt)%nsedi > 0 + END IF + END DO + specflag(:) = .FALSE. + DO jt = 1,nspec + specname(jt) = speclist(jt)%shortname + IF (sedi_keytype == BYSPECIES .AND. & + IAND(speclist(jt)%nphase, AEROSOL) /= 0 .AND. & + nclass > 0) THEN + specflag(jt) = .TRUE. + END IF + END DO + modflag(:) = .false. + modname(:) = '' + !SF #228, adding a condition to check that HAM is active: + !SF #299, adding a condition to check if BYMODE is relevant: + IF (lham .AND. nclass > 0 .AND. (sedi_keytype == BYMODE)) & + CALL ham_get_class_flag(nclass, modflag, modname, modnumname, lsedi=.TRUE.) ! get all modes + + !-- open new stream + CALL new_stream (ssedi,'sedi',lpost=sedi_lpost,lrerun=.FALSE., & + interval=sedi_tinterval) + CALL default_stream_setting (ssedi, lrerun = .FALSE., & + contnorest = .TRUE., table = 199, & + laccu = .false., code = AUTO) + + !-- add standard ECHAM variables + IF (sedi_lpost) THEN + CALL add_stream_reference (ssedi, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (ssedi, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (ssedi, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (ssedi, 'gboxarea','geoloc',lpost=.TRUE.) + END IF + + !-- instantaneous diagnostic quantities + + CALL default_stream_setting (ssedi, lrerun=.FALSE., laccu=.FALSE.) + + !-- sedimentation velocities by tracer or by aerosol mode + lpost = st1_in_st2_proof( 'vsedi', sedinam) .AND. sedi_lpost + CALL new_diag_list (vsedi, ssedi, diagname='vsedi', tsubmname='', & + longname='sedimentation velocity', units='m s-1', & + ndims=2, nmaxkey=(/ntrac, 0, nclass, nclass, 0 /), lpost=lpost ) + CALL new_diag(vsedi, ntrac, tracflag, tracname, BYTRACER) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(vsedi, nclass, modflag, modname, BYMODE) + CALL new_diag(vsedi, nclass, modflag, modnumname, BYNUMMODE) + END IF + + !-- average diagnostic quantities + + CALL default_stream_setting (ssedi, lrerun=.FALSE., laccu=.TRUE.) + + !-- total sedi flux + lpost = st1_in_st2_proof( 'sed', sedinam) .AND. sedi_lpost + CALL new_diag_list (sed, ssedi, diagname='sed', tsubmname='', & + longname='accumulated sedimentation flux',& + units='kg m-2 s-1', ndims=2, & + nmaxkey=(/ntrac, nspec, nclass, nclass, 0 /), lpost=lpost ) + ! add diagnostic elements only when output is activated + IF (lpost) THEN + CALL new_diag(sed, ntrac, tracflag, tracname, BYTRACER) + CALL new_diag(sed, nspec, specflag, specname, BYSPECIES) + IF (ANY(modflag)) THEN !SF #299 added mode mass diags and fix for mode number name + CALL new_diag(sed, nclass, modflag, modname, BYMODE) + CALL new_diag(sed, nclass, modflag, modnumname, BYNUMMODE) + END IF + END IF + + END SUBROUTINE init_sedi_stream + +#endif + + !! --------------------------------------------------------------------------------------- + !! sedi_interface: generic interface routine to sedimentation + !! currently, the only sedimentation scheme implemented is that of HAM + + SUBROUTINE sedi_interface(kbdim, kproma, klev, krow, & + pt, pq, & + pap, paph, & + pm6rp, prhop, & !mean mode actual radius [m], mean mode particle density [kg m-3] + pxtm1, pxtte ,psediflux ,psedifluxsurf) + + + USE mo_tracdef, ONLY: ntrac, trlist + USE mo_time_control, ONLY: time_step_len +#ifdef HAMMOZ + USE mo_time_control, ONLY: delta_time + USE mo_submodel_diag, ONLY: get_diag_pointer +#endif + USE mo_ham_sedimentation, ONLY: ham_prep_sedi, ham_sedimentation + USE mo_ham, ONLY: nclass + + !--- parameters + INTEGER, INTENT(in) :: kbdim, kproma, klev, krow + REAL(dp), INTENT(in) :: pt(kbdim, klev), & ! temperature + pq(kbdim, klev), & ! specific humidity + pap(kbdim, klev), & ! full level pressure + paph(kbdim, klev+1), & ! half level pressure + pxtm1(kbdim,klev,ntrac) ! tracer mass/number mixing ratio + + REAL(dp), INTENT(in) :: pm6rp(kbdim, klev, nclass), prhop(kbdim, klev, nclass) + + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + psediflux(kbdim,klev,ntrac), & !sediflux diagnostic + psedifluxsurf(kbdim,ntrac) !sediflux surf diagnostic + !--- local variables + INTEGER :: jt, ierr + REAL(dp) :: ztempc(kbdim, klev), & ! temp. above melting + zvis(kbdim, klev), & ! air viscosity + zlair(kbdim, klev), & ! mean free path + zrho(kbdim, klev), & ! air density + zdpg(kbdim, klev), & ! layer thickness (pressure) + zdz(kbdim, klev), & ! layer thickness (length) + zxtp1(kbdim, klev), & ! updated tracer(jt) + zxtte(kbdim, klev), & ! tracer(jt) tendency + zvsedi(kbdim, klev), & ! sedimentation velocity + zsediflux(kbdim, klev),& ! sedimentation flux + zsedifluxsurf(kbdim) ! sedimentation flux at surf + + REAL(dp), POINTER :: fld2d(:,:) ! pointer for diagnostics + + !--- calculate tracer independent physical variables + ! note: IF (ANY(trlist%ti(:)%nsedi)/=0) THEN not needed -- this is checked upon calling + CALL ham_prep_sedi(kproma, kbdim, klev, & + pt, pq, & + pap, paph, & + ztempc, zvis, & + zlair, zrho, & + zdpg, zdz ) + + !--- tracer loop + DO jt=1, ntrac + IF (trlist%ti(jt)%nsedi==0) CYCLE ! do nothing if tracer doesn't sediment + + !--- update tracer concentration + zxtp1(1:kproma,:) = pxtm1(1:kproma,:,jt) + pxtte(1:kproma,:,jt) * time_step_len + zxtte(1:kproma,:) = pxtte(1:kproma,:,jt) + + !--- call HAM sedimentation routine + CALL ham_sedimentation(kproma, kbdim, klev, krow, & + jt, zvis, zlair, zrho, & + pm6rp, prhop, & + zdpg, zdz, & + zxtp1, zxtte, & + zvsedi, zsediflux, zsedifluxsurf) + +#ifdef HAMMOZ + !--- store diagnostics + CALL get_diag_pointer(sed, fld2d, jt, ierr=ierr) + IF (ierr == 0) fld2d(1:kproma,krow) = fld2d(1:kproma,krow) & + + zsediflux(1:kproma,klev)*delta_time + CALL get_diag_pointer(vsedi, fld2d, jt, ierr=ierr) + IF (ierr == 0) fld2d(1:kproma,krow) = zvsedi(1:kproma,klev) +#endif + + psediflux(1:kproma,:,jt)=zsediflux(1:kproma,:) !TB diagnostic output + psedifluxsurf(1:kproma,jt)=zsedifluxsurf(1:kproma) !eehol: diagnostic sediflux at surf + pxtte(1:kproma,:,jt)=zxtte(1:kproma,:) !csld write tendency out + + END DO + + END SUBROUTINE sedi_interface + + +END MODULE mo_hammoz_sedimentation diff --git a/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 b/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 new file mode 100755 index 00000000..1a5ac2a7 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_hammoz_wetdep.F90 @@ -0,0 +1,1254 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_hammoz_wetdep.f90 +!! +!! \brief +!! module to interface ECHAM submodules with wet deposition module(s) +!! +!! \author M. Schultz (FZ Juelich) +!! \author S. Ferrachat (ETH-Zuerich) +!! +!! \responsible_coder +!! M. Schultz, m.schultz@fz-juelich.de +!! +!! \revision_history +!! -# M. Schultz (FZ Juelich) - original code (2009-10-02) +!! -# S. Ferrachat (ETH-Zuerich) - revision (2009-12-16) +!! +!! \limitations +!! None +!! +!! \details +!! This module initializes the scheme based on the namelist parameters +!! in submodeldiagctl and creates a stream for variable pointers and +!! diagnostic quantities used in the wet deposition scheme. It also +!! provides a generic interface to the actual wet deposition routine(s). +!! +!! \bibliographic_references +!! None +!! +!! \belongs_to +!! HAMMOZ +!! +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz + +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_hammoz_wetdep + + USE mo_kind, ONLY: dp +#ifdef HAMMOZ + USE mo_submodel_diag, ONLY: t_diag_list +#endif + USE mo_ham, ONLY: nclass + + IMPLICIT NONE + + PRIVATE + + ! public variables (see declaration below) + + ! helper flags for use in the computational routines +#ifdef HAMMOZ + PUBLIC :: lwetdepdetail +#endif + + ! subprograms +#ifdef HAMMOZ + PUBLIC :: init_wetdep_stream +#endif + PUBLIC :: wetdep_interface + +#ifdef HAMMOZ + ! wetdep_stream + INTEGER, PARAMETER :: nwetdepvars=24 + CHARACTER(LEN=32) :: wetdepvars(1:nwetdepvars)= & + (/'precipform ', & ! precip. formation rate in kg m-2 s-1 (3D) + 'precipevap ', & ! precip. evaporation rate in kg m-2 s-1 (3D) + 'uparfrac ', & ! updraft grid box fraction (3D) + 'wdep ', & ! total wetdep flux + 'wdep_conv ', & ! wet dep. in convective clouds + 'wdep_strat ', & ! wet dep. in stratiform clouds + 'wdep_incl ', & ! total wet dep. in clouds + 'wdep_blcl ', & ! wet dep. below (convective(?) clouds + 'wdep_incl_swn ', & ! .. in cloud stratiform warm nucleation + 'wdep_incl_swi ', & ! .. in cloud stratiform warm impaction + 'wdep_incl_smn ', & ! .. in cloud stratiform mixed nucleation + 'wdep_incl_smi ', & ! .. in cloud stratiform mixed impaction + 'wdep_incl_scn ', & ! .. in cloud stratiform cold nucleation + 'wdep_incl_sci ', & ! .. in cloud stratiform cold impaction + 'wdep_incl_cwn ', & ! .. in cloud convective warm nucleation + 'wdep_incl_cwi ', & ! .. in cloud convective warm impaction + 'wdep_incl_cmn ', & ! .. in cloud convective mixed nucleation + 'wdep_incl_cmi ', & ! .. in cloud convective mixed impaction + 'wdep_incl_ccn ', & ! .. in cloud convective cold nucleation + 'wdep_incl_cci ', & ! .. in cloud convective cold impaction + 'wdep_blcl_sr ', & ! .. below cloud stratiform rain + 'wdep_blcl_ss ', & ! .. below cloud stratiform snow + 'wdep_blcl_cr ', & ! .. below cloud convective rain + 'wdep_blcl_cs ' /) ! .. below cloud convective snow + + + ! variable pointers and diagnostic lists + REAL(dp), POINTER, PUBLIC :: precipform(:,:,:), precipevap(:,:,:), & + uparfrac(:,:,:) + TYPE (t_diag_list), PUBLIC, TARGET :: wdep ! wet deposition flux + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_conv ! .. in convective precip. + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_strat ! .. in stratiform clouds + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl ! .. total in clouds + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl ! .. below clouds + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_sr ! detailed diagnostics + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_ss + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_cr + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_blcl_cs + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_swn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_swi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_smn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_smi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_scn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_sci + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cwn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cwi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cmn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cmi + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_ccn + TYPE (t_diag_list), PUBLIC, TARGET :: wdep_incl_cci + + LOGICAL :: lwetdepdetail ! produce detailed wetdep diagnostics +#endif + + CONTAINS + +#ifdef HAMMOZ + SUBROUTINE init_wetdep_stream + + USE mo_string_utls, ONLY: st1_in_st2_proof + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: finish + USE mo_memory_base, ONLY: t_stream, new_stream, & + default_stream_setting, & + add_stream_reference, & + add_stream_element, & + AUTO + USE mo_ham_m7_trac, ONLY: ham_get_class_flag + USE mo_tracer, ONLY: validate_traclist + USE mo_tracdef, ONLY: ln, ntrac, trlist, GAS, AEROSOL + USE mo_species, ONLY: nspec, speclist + USE mo_submodel_streams, ONLY: wetdep_lpost, wetdep_tinterval, wetdepnam, & + wetdep_gastrac, wetdep_keytype + USE mo_submodel_diag, ONLY: new_diag_list, new_diag, & + BYTRACER, BYSPECIES, BYMODE, BYNUMMODE + USE mo_submodel, ONLY: lham !SF, see #228 + + ! local variables + INTEGER, PARAMETER :: ndefault = 1 + CHARACTER(LEN=32) :: defnam(1:ndefault) = & ! default output + (/ 'wdep ' /) ! total wetdep flux + + INTEGER, PARAMETER :: nall = 8 + CHARACTER(LEN=32) :: allnam(1:nall) = & ! output for ALL + (/'precipform ', & ! precip. formation rate in kg m-2 s-1 (3D) + 'precipevap ', & ! precip. evaporation rate in kg m-2 s-1 (3D) + 'uparfrac ', & ! updraft grid box fraction (3D) + 'wdep ', & ! total wetdep flux + 'wdep_conv ', & ! wet dep. in convective clouds + 'wdep_strat ', & ! wet dep. in stratiform clouds + 'wdep_incl ', & ! total wet dep. in clouds + 'wdep_blcl ' /) ! wet dep. below (convective(?) clouds + + CHARACTER(len=ln) :: defaultgas(3) = & ! default gas-phase tracers for diagnost + (/ 'SO2 ', & + 'H2SO4 ', & + 'HNO3 ' /) + + LOGICAL :: tracflag(ntrac), specflag(nspec), modflag(MAX(nclass,1)) + CHARACTER(LEN=ln) :: tracname(ntrac), specname(nspec), modname(MAX(nclass,1)), & + modnumname(MAX(nclass,1)) !SF #299 + CHARACTER(LEN=32) :: cdiagname + CHARACTER(LEN=64) :: clongname + TYPE (t_stream), POINTER :: swetdep + INTEGER :: ierr, jt, idiag + LOGICAL :: lpost + TYPE (t_diag_list), POINTER :: ptrwdep ! to avoid code repetition + + !++mgs: default values and namelist read are done in init_submodel_streams ! + + !-- initialize output control variables. Will be set automatically! + lwetdepdetail = .FALSE. + + !-- handle ALL, DETAIL and DEFAULT options for wetdep output variables + !-- Note: ALL means "all you would normally want", use DETAIL to get everything + IF (TRIM(tolower(wetdepnam(1))) == 'detail') THEN + wetdepnam(1:nwetdepvars) = wetdepvars(:) + lwetdepdetail = .TRUE. !SF #567 + ENDIF + IF (TRIM(tolower(wetdepnam(1))) == 'all') wetdepnam(1:nall) = allnam(:) + IF (TRIM(tolower(wetdepnam(1))) == 'default') wetdepnam(1:ndefault) = defnam(:) + + !-- check that all variable names from namelist are valid + IF (.NOT. st1_in_st2_proof( wetdepnam, wetdepvars, ierr=ierr) ) THEN + IF (ierr > 0) CALL finish ( 'ini_wetdep_stream', 'variable '// & + wetdepnam(ierr)//' does not exist in wetdep stream' ) + END IF + + !-- find out which gas-phase tracers shall be included in diagnostics + CALL validate_traclist(wetdep_gastrac, defaultgas, nphase=GAS, & + lwetdep=.true.) !>>dod bugfix << 0) THEN + tracflag(jt) = trlist%ti(jt)%nwetdep > 0 + END IF + END IF + END DO + specflag(:) = .FALSE. + DO jt = 1,nspec + specname(jt) = speclist(jt)%shortname + IF (wetdep_keytype == BYSPECIES .AND. & + IAND(speclist(jt)%nphase, AEROSOL) /= 0 .AND. & !>>dod soa: removed check of trtype < 0) THEN + specflag(jt) = speclist(jt)%lwetdep + END IF + END DO + modflag(:) = .FALSE. + modname(:) = '' + + !SF #228, adding a condition to check that HAM is active: + !SF #299, adding a condition to check if BYMODE is relevant: + IF (lham .AND. nclass > 0 .AND. (wetdep_keytype == BYMODE)) & + CALL ham_get_class_flag(nclass, modflag, modname, modnumname, lwetdep=.true.) + + !-- open new diagnostic stream + CALL new_stream (swetdep,'wetdep',lpost=wetdep_lpost,lrerun=.FALSE., & + interval=wetdep_tinterval) + CALL default_stream_setting (swetdep, lrerun = .FALSE., & + contnorest = .TRUE., table = 199, & + laccu = .false., code = AUTO) + + !-- add standard ECHAM variables + IF (wetdep_lpost) THEN + CALL add_stream_reference (swetdep, 'geosp' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (swetdep, 'lsp' ,'sp' ,lpost=.TRUE.) + CALL add_stream_reference (swetdep, 'aps' ,'g3b' ,lpost=.TRUE.) + CALL add_stream_reference (swetdep, 'gboxarea','geoloc',lpost=.TRUE.) + END IF + + !-- add physical variables to stream + lpost = st1_in_st2_proof( 'precipform', wetdepnam) + CALL add_stream_element (swetdep, 'precipform', precipform, & + longname = 'precipitation formation rate', & + units = 'kg m-2 s-1', lpost = lpost) + + lpost = st1_in_st2_proof( 'precipevap', wetdepnam) + CALL add_stream_element (swetdep, 'precipevap', precipevap, & + longname = 'precipitation evaporation rate', & + units = 'kg m-2 s-1', lpost = lpost) + + lpost = st1_in_st2_proof( 'uparfrac', wetdepnam) + CALL add_stream_element (swetdep, 'uparfrac', uparfrac, & + longname = 'fraction of grid cell covered by convective clouds', & + units = '1', lpost = lpost) + + !-- pure diagnostic quantities (averaged) + + CALL default_stream_setting (swetdep, lrerun=.FALSE., laccu=.TRUE.) + + ! add total wetdep flux and detailed diagnostics + DO idiag = 1,21 + SELECT CASE (idiag) + CASE (1) + ptrwdep => wdep + cdiagname = 'wdep' + clongname = 'wet deposition flux total' + CASE (2) + ptrwdep => wdep_conv + cdiagname = 'wdep_conv' + clongname = 'wet deposition flux in convective clouds' + CASE (3) + ptrwdep => wdep_strat + cdiagname = 'wdep_strat' + clongname = 'wet deposition flux in stratiform clouds' + CASE (4) + ptrwdep => wdep_incl + cdiagname = 'wdep_incl' + clongname = 'wet deposition flux in-cloud' + CASE (5) + ptrwdep => wdep_blcl + cdiagname = 'wdep_blcl' + clongname = 'wet deposition flux below-cloud' + CASE (6) + ptrwdep => wdep_blcl_sr + cdiagname = 'wdep_blcl_sr' + clongname = 'wet deposition flux below-cloud stratiform rain' + CASE (7) + ptrwdep => wdep_blcl_ss + cdiagname = 'wdep_blcl_ss' + clongname = 'wet deposition flux below-cloud stratiform snow' + CASE (8) + ptrwdep => wdep_blcl_cr + cdiagname = 'wdep_blcl_cr' + clongname = 'wet deposition flux below-cloud convective rain' + CASE (9) + ptrwdep => wdep_blcl_cs + cdiagname = 'wdep_blcl_cs' + clongname = 'wet deposition flux below-cloud convective snow' + CASE (10) + ptrwdep => wdep_incl_swn + cdiagname = 'wdep_incl_swn' + clongname = 'wet deposition flux in-cloud stratiform warm nucleation' + CASE (11) + ptrwdep => wdep_incl_swi + cdiagname = 'wdep_incl_swi' + clongname = 'wet deposition flux in-cloud stratiform warm impaction' + CASE (12) + ptrwdep => wdep_incl_smn + cdiagname = 'wdep_incl_smn' + clongname = 'wet deposition flux in-cloud stratiform mixed nucleation' + CASE (13) + ptrwdep => wdep_incl_smi + cdiagname = 'wdep_incl_smi' + clongname = 'wet deposition flux in-cloud stratiform mixed impaction' + CASE (14) + ptrwdep => wdep_incl_scn + cdiagname = 'wdep_incl_scn' + clongname = 'wet deposition flux in-cloud stratiform cold nucleation' + CASE (15) + ptrwdep => wdep_incl_sci + cdiagname = 'wdep_incl_sci' + clongname = 'wet deposition flux in-cloud stratiform cold impaction' + CASE (16) + ptrwdep => wdep_incl_cwn + cdiagname = 'wdep_incl_cwn' + clongname = 'wet deposition flux in-cloud convective warm nucleation' + CASE (17) + ptrwdep => wdep_incl_cwi + cdiagname = 'wdep_incl_cwi' + clongname = 'wet deposition flux in-cloud convective warm impaction' + CASE (18) + ptrwdep => wdep_incl_cmn + cdiagname = 'wdep_incl_cmn' + clongname = 'wet deposition flux in-cloud convective mixed nucleation' + CASE (19) + ptrwdep => wdep_incl_cmi + cdiagname = 'wdep_incl_cmi' + clongname = 'wet deposition flux in-cloud convective mixed impaction' + CASE (20) + ptrwdep => wdep_incl_ccn + cdiagname = 'wdep_incl_ccn' + clongname = 'wet deposition flux in-cloud convective cold nucleation' + CASE (21) + ptrwdep => wdep_incl_cci + cdiagname = 'wdep_incl_cci' + clongname = 'wet deposition flux in-cloud convective cold impaction' + END SELECT + lpost = st1_in_st2_proof( cdiagname, wetdepnam) .AND. wetdep_lpost + CALL new_diag_list (ptrwdep, swetdep, diagname=cdiagname, tsubmname='', & + longname=TRIM(clongname),& + units='kg m-2 s-1', ndims=2, & + nmaxkey=(/ntrac, nspec, nclass, nclass, 0 /), lpost=lpost ) + ! add diagnostic elements only when output is activated + IF (lpost) THEN + IF (ANY(tracflag)) CALL new_diag(ptrwdep, ntrac, tracflag, tracname, BYTRACER) + IF (ANY(specflag)) CALL new_diag(ptrwdep, nspec, specflag, specname, BYSPECIES) + IF (ANY(modflag)) THEN + CALL new_diag(ptrwdep, nclass , modflag, modname, BYMODE) + CALL new_diag(ptrwdep, nclass , modflag, modnumname, BYNUMMODE) !SF #299: add mode number + END IF + END IF + END DO + + END SUBROUTINE init_wetdep_stream +#endif + !! --------------------------------------------------------------------------------------- + !!SF prep_wetdep: preparation routine to wet deposition calculations + !! (collect hydrological variables) + + SUBROUTINE prep_wetdep_hydro(kproma, kbdim, klev, ktop, krow, lstrat, & + pdpg, pmratepr, pmrateps, pmsnowacl, & + pmlwc, pmiwc, paclc, & + pice, peffwat, peffice, pmfu, prhou, & + pfrain, pfsnow, pfevapr, pfsubls, prevap, & + pclceff ) + + USE mo_time_control, ONLY: time_step_len + + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: klev ! numer of levels + INTEGER, INTENT(in) :: ktop ! top layer index + INTEGER, INTENT(in) :: krow ! geographic block number + LOGICAL, INTENT(in) :: lstrat ! indicates stratiform clouds (call from cloud) + REAL(dp), INTENT(in) :: pdpg(kbdim,klev) ! dp/g + REAL(dp), INTENT(in) :: pmratepr(kbdim,klev) ! rain formation in cloudy part + REAL(dp), INTENT(in) :: pmrateps(kbdim,klev) ! snow formation in cloudy part + REAL(dp), INTENT(in) :: pmsnowacl(kbdim,klev) ! accretion rate of snow with cloud drop. in cl [kg/kg] + REAL(dp), INTENT(in) :: pmfu(kbdim,klev) ! convective flux + REAL(dp), INTENT(in) :: prhou(kbdim,klev) ! air density + REAL(dp), INTENT(in) :: pfrain(kbdim,klev) ! rain rate + REAL(dp), INTENT(in) :: pfsnow(kbdim,klev) ! snow rate + REAL(dp), INTENT(in) :: pfevapr(kbdim,klev) ! evaporation of rain + REAL(dp), INTENT(in) :: pfsubls(kbdim,klev) ! sublimation of snow + REAL(dp), INTENT(inout) :: pmlwc(kbdim,klev) ! liquid water content before rain + REAL(dp), INTENT(inout) :: pmiwc(kbdim,klev) ! ice water content before snow + REAL(dp), INTENT(inout) :: paclc(kbdim,klev) ! cloud cover + REAL(dp), INTENT(out) :: pice(kbdim,klev) ! ice mass fraction over total water + REAL(dp), INTENT(out) :: peffwat(kbdim,klev) ! autoconversion rate (liq water) + REAL(dp), INTENT(out) :: peffice(kbdim,klev) ! autoconversion rate (ice) + REAL(dp), INTENT(out) :: prevap(kbdim,klev) ! + REAL(dp), INTENT(out) :: pclceff(kbdim,klev) ! + + !--- Local arrays: + LOGICAL :: lo_2d(1:kbdim,klev) + REAL(dp) :: zilwc(kbdim,klev), zfprec(kbdim,klev), ztmp1(kbdim,klev) + + !--- Constants: + REAL(dp), PARAMETER :: zmin = 1.e-10_dp, & + zwu = 2.0_dp ! Assumed updraft velocity in convective clouds [m s-1]: + + !--- 1.1) Calculate ice mass-fraction of the total water: + + pmiwc(1:kproma,:) = MAX(pmiwc(1:kproma,:),0._dp) + pmlwc(1:kproma,:) = MAX(pmlwc(1:kproma,:),0._dp) + + zilwc(1:kproma,:) = pmiwc(1:kproma,:)+pmlwc(1:kproma,:) + + lo_2d(1:kproma,:) = (zilwc(1:kproma,:) > zmin) + + paclc(1:kproma,:) = MERGE(paclc(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + ztmp1(1:kproma,:) = 0._dp + + WHERE(ABS(zilwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = pmiwc(1:kproma,:)/zilwc(1:kproma,:) + + pice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + + !--- 1.2) Calculate autoconversion rate: + + lo_2d(1:kproma,:) = (pmiwc(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = 0._dp + + WHERE(ABS(pmiwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = pmrateps(1:kproma,:)/pmiwc(1:kproma,:) + + !peffice(1:kproma,:) = MERGE(pmrateps(1:kproma,:)/pmiwc(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + peffice(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + + peffice(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffice(1:kproma,:))) + + lo_2d(1:kproma,:) = (pmlwc(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = 0._dp + WHERE(ABS(pmlwc(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = (pmratepr(1:kproma,:)+pmsnowacl(1:kproma,:))/pmlwc(1:kproma,:) + + peffwat(1:kproma,:) = MERGE(ztmp1(1:kproma,:) , 0._dp, lo_2d(1:kproma,:)) + + + peffwat(1:kproma,:) = MAX(0._dp,MIN(1._dp,peffwat(1:kproma,:))) + + !--- 1.3) Calculate the effective grid-box fraction + ! affected by precipitation (zclceff): + +#ifdef HAMMOZ + !--- Precipitation formation (store for diagnostics [kg m-2 s-1]): + precipform(1:kproma,:,krow) = (pmratepr(1:kproma,:)+pmrateps(1:kproma,:)+pmsnowacl(1:kproma,:)) & + * pdpg(1:kproma,:) / time_step_len + +#endif + !--- 1.3.1) Stratiform clouds: + !--- 1.3.2) Convective clouds: + + IF (.not. lstrat) THEN + + !--- Assume updraft area fraction as precipitiating + ! fraction of grid box + ! + ! Estimate updraft area from prescribed updraft + ! velocities + + pclceff(1:kproma,:) = pmfu(1:kproma,:) / (zwu*prhou(1:kproma,:)) + +#ifdef HAMMOZ + !---updraft grid box fraction (3D) stored for diagnostics + uparfrac(1:kproma,:,krow) = pclceff(1:kproma,:) +#endif + + END IF + + !--- 1.4) Re-evaporation + + zfprec(1:kproma,:) = pfrain(1:kproma,:) + pfsnow(1:kproma,:) + + lo_2d(1:kproma,:) = (zfprec(1:kproma,:) > zmin) + + ztmp1(1:kproma,:) = 0._dp + + WHERE(ABS(zfprec(1:kproma,:))>0._dp) ztmp1(1:kproma,:) = (pfevapr(1:kproma,:)+pfsubls(1:kproma,:))/zfprec(1:kproma,:) + + prevap(1:kproma,:) = MERGE(ztmp1(1:kproma,:), 0._dp, lo_2d(1:kproma,:)) + + prevap(1:kproma,:) = MAX(0._dp,MIN(1._dp,prevap(1:kproma,:))) + +#ifdef HAMMOZ + !--- Store re-evaporation + sublimation for diagnostics: + precipevap(1:kproma,:,krow) = pfevapr(1:kproma,:)+pfsubls(1:kproma,:) +#endif + + END SUBROUTINE prep_wetdep_hydro + + !! --------------------------------------------------------------------------------------- + !! SF: get_lfrac: gas tracer liquid fraction calculation + + SUBROUTINE get_lfrac(kproma, kbdim, krow, klev, ktop, & + ptemp, pmlwc, prho, phenry, plfrac) + + USE mo_physical_constants, ONLY: argas,p0sl_bg + + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: krow ! for diagnostic purposes + INTEGER, INTENT(in) :: klev ! number of levels + INTEGER, INTENT(in) :: ktop ! top layer index + REAL(dp), INTENT(IN) :: ptemp(kbdim,klev) ! temperature + REAL(dp), INTENT(IN) :: pmlwc(kbdim,klev) ! liquid water content + REAL(dp), INTENT(IN) :: prho(kbdim,klev) ! density of air + REAL(dp), INTENT(IN) :: phenry(2) ! Henry's law vars (constant, and activation energy) + REAL(dp), INTENT(OUT) :: plfrac(kbdim,klev) ! liquid tracer fraction + + !--- Gas constant in atm M-1 K-1 (Seinfeld & Pandis 2ed. p290) + REAL(dp), PARAMETER :: zrgas = argas / p0sl_bg * 1.e03_dp, & + zq298 = 1._dp / 298._dp + + !--- Local arrays: + REAL(dp) :: zp(kbdim,klev), zq(kbdim,klev) + + zq(1:kproma,:) = 1._dp / ptemp(1:kproma,:) - zq298 + zp(1:kproma,:) = zrgas*ptemp(1:kproma,:)*pmlwc(1:kproma,:)*prho(1:kproma,:)*1.e-03_dp*phenry(1) & + * exp(phenry(2)*zq(1:kproma,:)) + + plfrac(1:kproma,:) = zp(1:kproma,:) / (1._dp + zp(1:kproma,:)) + + ! make sure vector is filled + IF (kproma.lt.kbdim) plfrac(kproma+1:kbdim,:)=0._dp + + END SUBROUTINE get_lfrac + + !! --------------------------------------------------------------------------------------- + !! gas_setscav: rotuine to set the wetdep flags to handle: + !! - in-cloud and/or below-cloud scav + !! - water and/or ice scav (resp. rain and/or snow) + + SUBROUTINE gas_setscav(kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase) + + ! kscavICtype = 0 no in-cloud scavenging + ! 1 prescribed in-cloud scavenging params + ! + ! kscavBCtype = 0 no below-cloud scavenging + ! 1 prescribed below-cloud scavenging params + ! + ! kscavICphase = 0 no in-cloud scavenging + ! 1 in-cloud water-only scavenging + ! 2 in-cloud ice-only scavenging + ! 3 in-cloud water+ice scavenging + ! + ! kscavBCphase = 0 no below-cloud scavenging + ! 1 below-cloud rain-only scavenging + ! 2 below-cloud snow-only scavenging + ! 3 below-cloud rain+snow scavenging + + USE mo_tracdef, ONLY: trlist + USE mo_species, ONLY: speclist + + INTEGER, INTENT(in) :: kt + INTEGER, INTENT(out) :: kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase + + ! local variables + INTEGER :: ispec + + !--- Normal setting: + + SELECT CASE (trlist%ti(kt)%nwetdep) + CASE(0) !wet dep off + kscavICtype = 0 + kscavBCtype = 0 + kscavICphase = 0 + kscavBCphase = 0 + CASE(1:) !wet dep on + kscavICtype = 1 + kscavBCtype = 0 + !SF kscavICphase = 1 !SFnote: a value of 1 reproduces the echam5.5-ham2 gas scavenging settings + kscavICphase = 3 !SFnote: a value of 3 reproduces the echam5-hammoz gas scavenging settings + kscavBCphase = 3 + END SELECT + + !--- Tracer- or species-specific setting: + + ispec = trlist%ti(kt)%spid + + ! allow below-cloud scavenging for HNO3: + IF (speclist(ispec)%shortname == 'HNO3') kscavBCtype = 1 + + ! allow below-cloud scavenging for H2SO4 + !SF #508: now allows H2SO4 below-cloud scav *also* in case of pure HAM + IF (speclist(ispec)%shortname == 'H2SO4') kscavBCtype = 1 + + END SUBROUTINE gas_setscav + + !! --------------------------------------------------------------------------------------- + !! gas_wetdep: routine to handle gas wet deposition + + SUBROUTINE gas_wetdep(kproma, kbdim, klev, ktop, & + kt, & + kscavICtype, kscavBCtype, & + kscavICphase, kscavBCphase, & + lstrat, & + pxtm1, & + paclc, & + pmfu, & + pdpg, & + peffwat, & + peffice, & + prevap, & + pice, & + plfrac, & + pclc, & + pfrain, & + pfsnow, & + pxtte, & + pxtp10, & + pxtp1c, & + pdepint, & + pdepintbc, & + pdepintbcr, & + pdepintbcs, & + pdepintic, & + pmfuxt ) + + USE mo_time_control, ONLY: time_step_len + USE mo_tracdef, ONLY: ntrac + + INTEGER, INTENT(in) :: kproma ! geographic block number of locations + INTEGER, INTENT(in) :: kbdim ! geographic block maximum number of locations + INTEGER, INTENT(in) :: klev ! numer of levels + INTEGER, INTENT(in) :: ktop ! top layer index + INTEGER, INTENT(in) :: kt ! tracer index + INTEGER, INTENT(in) :: kscavICtype ! indicates in-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavBCtype ! indicates below-cloud scavenging scheme + INTEGER, INTENT(in) :: kscavICphase ! indicates in-cloud scavenging by water and/or ice + INTEGER, INTENT(in) :: kscavBCphase ! indicates below-cloud scavenging by water and/or ice + + LOGICAL, INTENT(in) :: lstrat ! flag for stratiform or convective case + + REAL(dp), INTENT(in) :: pxtm1(kbdim,klev,ntrac), & ! tracer mixing ratio + paclc(kbdim,klev), & ! cloud cover + pmfu(kbdim,klev), & ! convective flux + pdpg(kbdim,klev), & ! grid box thickness + peffwat(kbdim,klev), & ! + peffice(kbdim,klev), & ! + prevap(kbdim,klev), & ! evaporation rate + pice(kbdim,klev), & ! ice fraction + plfrac(kbdim,klev), & ! liquid fraction of corresponding tracer + pclc(kbdim,klev), & ! fraction of grid covered by precip + pfrain(kbdim,klev), & ! rain flux + pfsnow(kbdim,klev) ! snow flux + + REAL(dp), INTENT(inout) :: pxtte(kbdim,klev,ntrac), & ! tracer tendency + pxtp10(kbdim,klev,ntrac), & ! cloud-free mixing ratio + pxtp1c(kbdim,klev,ntrac), & ! cloudy mixing ratio + pdepint(kbdim), & ! global scavenged mr + pdepintbc(kbdim), & ! below-cloud scavenged mr + pdepintbcr(kbdim), & ! below-cloud scavenged by rain mr + pdepintbcs(kbdim), & ! below-cloud scavenged by snow mr + pdepintic(kbdim), & ! in-cloud scavenged mr + pmfuxt(kbdim,klev,ntrac) ! updraft mmr + + !--- local variables + INTEGER :: jk + + LOGICAL :: ll_cloud_cov(kbdim,klev), ll_prcp(kbdim,klev), ll1(1:kproma,klev) !SF #458 + + REAL(dp) :: ztmst + REAL(dp) :: zdxtevapic(kbdim,klev), zdxtevapbc(kbdim,klev), & + zdxtwat(kbdim,klev), zdxtice(kbdim,klev), & + zxtwat(kbdim,klev), zxtice(kbdim,klev), & + zxtp10(kbdim,klev), zmf(kbdim,klev), & + zdep(kbdim,klev), & + zxtp1(kbdim,klev), zxtte(kbdim,klev), & + zxtfrac_col(kbdim,klev), & + zxtfrac_colr(kbdim,klev), zxtfrac_cols(kbdim,klev), & + zscavcoefbcr(kbdim,klev), zscavcoefbcs(kbdim,klev), & + zcoeffr(kbdim,klev), zcoeffs(kbdim,klev), & + zcoeff(kbdim,klev), & + zdxtcol(kbdim,klev), & + zdxtcolr(kbdim,klev), zdxtcols(kbdim,klev) + + REAL(dp) :: ztmp1(kbdim,klev) !SF #458 dummy variable + + !--- Constants: + REAL(dp), PARAMETER :: zmin =1.e-10_dp + + ztmst = time_step_len + + zdxtevapic(1:kproma,:) = 0._dp + zdxtevapbc(1:kproma,:) = 0._dp + + zxtfrac_col(1:kproma,:) = 0._dp + zxtfrac_colr(1:kproma,:) = 0._dp + zxtfrac_cols(1:kproma,:) = 0._dp + + zscavcoefbcr(1:kproma,:) = 0._dp + zscavcoefbcs(1:kproma,:) = 0._dp + + zdxtwat(1:kproma,:) = 0._dp + zdxtice(1:kproma,:) = 0._dp + + IF (lstrat) THEN !stratiform case + + !--- Weight mixing ratios with cloud fraction: + + pxtp1c(1:kproma,:,kt) = pxtp1c(1:kproma,:,kt)*paclc(1:kproma,:) + pxtp10(1:kproma,:,kt) = pxtp10(1:kproma,:,kt)*(1._dp-paclc(1:kproma,:)) + zxtp10(1:kproma,:) = pxtp10(1:kproma,:,kt) + zmf(1:kproma,:) = pdpg(1:kproma,:) / ztmst + !SF note: zxtp10 and zmf are needed in order to transparently + ! handle the strat and the conv cases without writing too many separate, + ! but very similar, equations + ELSE + zxtp10(1:kproma,:) = 0._dp + zmf(1:kproma,:) = pmfu(1:kproma,:) + ENDIF + + !--- Associate tracer masses in the cloud fraction to water/ice phase + ! to the respective mass fractions: + zxtwat(1:kproma,:) = pxtp1c(1:kproma,:,kt)*(1._dp-pice(1:kproma,:)) + zxtice(1:kproma,:) = pxtp1c(1:kproma,:,kt)*pice(1:kproma,:) + + !--- Setting logical masks necessary for MERGE statements (!SF #458) + ll_cloud_cov(1:kproma,:) = (paclc(1:kproma,:) > zmin) + ll_prcp(1:kproma,:) = (pclc(1:kproma,:) > zmin) + + !--- 1/ Process: + + !--- 1.1/ In-cloud scavenging + + IF(kscavICtype > 0) THEN + + !--- 1.1.1/ Phase-specific calculations: + + IF (IAND(kscavICphase,1) /= 0) THEN !water scavenging on (kscavICphase==1 .or. 3) + + !--- Change in in-cloud (strat) or updraft (conv) tracer concentration: + !>>SF #458 (replacing where statements) + ztmp1(1:kproma,:) = zxtwat(1:kproma,:)*plfrac(1:kproma,:)*peffwat(1:kproma,:) + zdxtwat(1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) + !<>SF #458 (replacing where statements) + ztmp1(1:kproma,:) = zxtice(1:kproma,:)*plfrac(1:kproma,:)*peffice(1:kproma,:) + zdxtice(1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll_cloud_cov(1:kproma,:)) + !< 0) THEN + + !--- 1.2.1/ Phase-specific calculations: + + IF (IAND(kscavBCphase,1) /= 0) THEN !rain scavenging on (kscavBCphase==1 .or. 3) + !SFtemporary dummy values for now (in waiting to define two separate rain and snow coeffs) + zscavcoefbcr(1:kproma,:) = 0._dp + ENDIF + + IF (IAND(kscavBCphase,2) /= 0) THEN !snow scavenging on (kscavBCphase==2 .or. 3) + !SFtemporary dummy values for now (in waiting to define two separate rain and snow coeffs) + zscavcoefbcs(1:kproma,:) = 0._dp + ENDIF + !--- 1.2.2/ Put everything together: + + !--- Calculate fraction of below cloud scavenged tracer: + !>>SF #458 (replacing where statements) + ll1(1:kproma,:) = .NOT. ll_cloud_cov(1:kproma,:) .AND. ll_prcp(1:kproma,:) + ztmp1(1:kproma,:) = -ztmst*zscavcoefbcr(1:kproma,:) + zcoeffr (1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:) ) + ztmp1(1:kproma,:) = -ztmst*zscavcoefbcs(1:kproma,:) + zcoeffs (1:kproma,:) = MERGE( ztmp1(1:kproma,:), 0._dp, ll1(1:kproma,:) ) + + ztmp1(1:kproma,:) = MERGE(pclc(1:kproma,:), 1._dp, ll1(1:kproma,:)) !SF 1._dp is a dummy value + !>>SFtemporary (in waiting to define two separate rain and snow coeffs): + ztmp1(1:kproma,:) = -ztmst * 1.626e-2_dp & + * (MAX(0._dp,pfrain(1:kproma,:)+pfsnow(1:kproma,:)) & + / ztmp1(1:kproma,:))**0.6169_dp + !SF The final expression should be: ztmp1(1:kproma,:) = zcoeffr(1:kproma,:)+zcoeffs(1:kproma,:) + !< thk: bug fix: + ! changed the order of the two lines + ! removed commented-out code + USE parkind1, ONLY: dp => JPRB !TeMi + USE parkind1, ONLY: wp => JPRB !eehol + USE parkind1, ONLY: JPRD + IMPLICIT NONE + ! <-- thk + + ! Threshold for branch cutoffs. Historically the double precision + ! epsilon was used throughout the M7 code. That value is now also + ! used to define the **physical cutoffs** in single precision. + REAL(KIND=dp), PARAMETER :: THRESHOLD = REAL(EPSILON(1.0_JPRD), KIND=dp) + +END MODULE mo_kind diff --git a/ifs-source/arpifs/m7/module/mo_math_constants.F90 b/ifs-source/arpifs/m7/module/mo_math_constants.F90 new file mode 100644 index 00000000..bd5a42b8 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_math_constants.F90 @@ -0,0 +1,97 @@ +! Module determines main mathematical constants to be used by shallow water +! prototype. Values are taken from glibc 2.2.5: /usr/include/math.h +! These constants +! are provided to more significant digits than is necessary for a 64-bit +! double precision number; they may be used for other purposes where the +! extra precision is necessary or useful. +! +! +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + +MODULE mo_math_constants + +USE mo_kind, ONLY: wp, THRESHOLD + +IMPLICIT NONE + +PUBLIC + +! +! ! Mathematical constants (in brackets original C names) +! +! ! euler (mo_E ) -- e +! ! log2e (mo_LOG2E ) -- log2(e) +! ! log10e (mo_LOG10E ) -- log10(e) +! ! ln2 (mo_LN2 ) -- ln(2) +! ! ln10 (mo_LN10 ) -- ln(10) +! ! pi (mo_PI ) -- pi +! ! pi_2 (mo_PI_2 ) -- pi/2 +! ! pi_4 (mo_PI_4 ) -- pi/4 +! ! rpi (mo_1_PI ) -- 1/pi +! ! rpi_2 (mo_2_PI ) -- 2/pi +! ! rsqrtpi_2 (mo_2_SQRTPI) -- 2/(sqrt(pi)) +! ! sqrt2 (mo_SQRT2 ) -- sqrt(2) +! ! sqrt1_2 (mo_SQRT1_2 ) -- 1/sqrt(2) +! ! sqrt3 -- sqrt(3) +! ! sqrt1_3 -- 1/sqrt(3) +! ! +! +! + +REAL (wp), PARAMETER :: euler = 2.71828182845904523536028747135266250_wp +REAL (wp), PARAMETER :: log2e = 1.44269504088896340735992468100189214_wp +REAL (wp), PARAMETER :: log10e = 0.434294481903251827651128918916605082_wp +REAL (wp), PARAMETER :: ln2 = 0.693147180559945309417232121458176568_wp +REAL (wp), PARAMETER :: ln10 = 2.30258509299404568401799145468436421_wp +REAL (wp), PARAMETER :: pi = 3.14159265358979323846264338327950288_wp +!$ACC DECLARE COPYIN(pi) +REAL (wp), PARAMETER :: pi_2 = 1.57079632679489661923132169163975144_wp +REAL (wp), PARAMETER :: pi_4 = 0.785398163397448309615660845819875721_wp +REAL (wp), PARAMETER :: rpi = 0.318309886183790671537767526745028724_wp +REAL (wp), PARAMETER :: rpi_2 = 0.636619772367581343075535053490057448_wp +REAL (wp), PARAMETER :: rsqrtpi_2 = 1.12837916709551257389615890312154517_wp +REAL (wp), PARAMETER :: sqrt2 = 1.41421356237309504880168872420969808_wp +REAL (wp), PARAMETER :: sqrt1_2 = 0.707106781186547524400844362104849039_wp +REAL (wp), PARAMETER :: sqrt3 = 1.7320508075688772935274463415058723_wp +REAL (wp), PARAMETER :: sqrt1_3 = 0.5773502691896257645091487805019575_wp +REAL (wp), PARAMETER :: cos45 = sqrt1_2 +REAL (wp), PARAMETER :: one_third = 1.0_wp/3.0_wp + +! +! ! some more useful constants +! ! pi_5 -- half angle of pentagon +! ! rad2deg -- conversion factor from radians to degree +! ! deg2rad -- conversion factor from degree to radians +! ! eps -- residual bound for solvers +! + +REAL (wp), PARAMETER :: pi_5 = pi*0.2_wp +REAL (wp), PARAMETER :: pi2 = pi*2.0_wp +REAL (wp), PARAMETER :: rad2deg = 180.0_wp/pi +!$ACC DECLARE COPYIN(rad2deg) +REAL (wp), PARAMETER :: deg2rad = pi/180.0_wp +REAL (wp), PARAMETER :: eps = 1.e-8_wp +REAL (wp), PARAMETER :: dbl_eps = THRESHOLD !EPSILON(1._wp) ! DOES NOT SEEM TO BE USED ANYWHERE +REAL (wp), PARAMETER :: pi_180 = pi/180._wp + +! +! ! phi0 is the latitude of the lowest major triangle corner +! ! and the latitude of the major hexagonal faces centers +! ! phi0 = 0.5_wp*pi - 2._wp*acos(1.0_wp/(2._wp*sin(pi/5._wp))) +! + +REAL (wp), PARAMETER :: phi0 = 0.46364760900080614903_wp + + +!-------------------------------------------------------------------- + +END MODULE mo_math_constants diff --git a/ifs-source/arpifs/m7/module/mo_namelist.F90 b/ifs-source/arpifs/m7/module/mo_namelist.F90 new file mode 100644 index 00000000..4e73b08a --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_namelist.F90 @@ -0,0 +1,220 @@ +MODULE mo_namelist + ! position_nml - position namelist file for reading + ! + ! Author: + ! + ! L. Kornblueh, MPI, March 2001, original source + ! L. Kornblueh, MPI, January 2003, added error message for open + ! L. Kornblueh, MPI, April 2005, added close_nml + ! L. Kornblueh, MPI, February 2011, make it more usable, when + ! having multiple files open + ! + USE mo_util_string, ONLY: tolower + USE mo_filename, ONLY: find_next_free_unit + IMPLICIT NONE + PRIVATE + ! accessible functions + PUBLIC :: position_nml + PUBLIC :: open_nml + PUBLIC :: close_nml + ! return values from position_nml + PUBLIC :: positioned, missing, closed, length_error, read_error + TYPE t_namelist + CHARACTER(len=64) :: filename + INTEGER :: fileunit + END TYPE t_namelist + TYPE(t_namelist), ALLOCATABLE :: namelist_file_list(:) + + INTEGER, PARAMETER :: chunk = 32 + INTEGER, SAVE :: top = 0 + ! return values of function 'position_nml': + INTEGER, PARAMETER :: positioned = 0 ! file pointer set to namelist group + INTEGER, PARAMETER :: missing = 1 ! namelist group is missing + INTEGER, PARAMETER :: closed = 2 + INTEGER, PARAMETER :: length_error = 3 + INTEGER, PARAMETER :: read_error = 4 +CONTAINS + !================================================================================================ + FUNCTION open_nml (file) RESULT(unit) + INTEGER :: unit ! file handler + CHARACTER(len=*), INTENT(in) :: file ! namelist filename + TYPE(t_namelist), ALLOCATABLE :: tmp_list(:) + INTEGER :: ihandler, istat, iunit + unit = -1 + ! Create or extend table of namelist files + IF (.NOT. ALLOCATED(namelist_file_list)) THEN + ALLOCATE(namelist_file_list(chunk)) + ELSE + IF (MOD(top,chunk) == 0) THEN + CALL move_alloc(namelist_file_list, tmp_list) + ALLOCATE(namelist_file_list(top+chunk)) + namelist_file_list(:top) = tmp_list(:) + DEALLOCATE(tmp_list) + ENDIF + ENDIF + ! Look up file name in table, re-open if close, otherwise go to begin. + ! Return from procedure if an entry was found. + IF (top > 0) THEN + DO ihandler = 1, top + IF (TRIM(namelist_file_list(ihandler)%filename) == file) THEN + IF (namelist_file_list(ihandler)%fileunit == -1) THEN + iunit = find_next_free_unit(100,200) + OPEN (iunit, file=file, iostat=istat, status='old', action='read', delim='apostrophe') + namelist_file_list(ihandler)%fileunit = iunit +!gf CALL message('', 'Namelist file '//TRIM(file)//' reopened') + WRITE(*,*) 'Namelist file --> '//TRIM(file)//' --> reopened' + ELSE +!gf CALL message('', 'Namelist file '//TRIM(file)//' already opened, rewind file to beginning') + WRITE(*,*) 'Namelist file --> '//TRIM(file)//' --> already opened, rewind file to beginning' + REWIND (namelist_file_list(ihandler)%fileunit) + ENDIF + unit = ihandler + RETURN + ENDIF + ENDDO + ENDIF + ! If no entry was found, open file and create table entry. + iunit = find_next_free_unit(100,200) + OPEN (iunit, file=file, iostat=istat, status='old', action='read', delim='apostrophe') + IF (istat == 0) THEN + top = top+1 + namelist_file_list(top)%filename = TRIM(file) + namelist_file_list(top)%fileunit = iunit + unit = top +!gf CALL message('', 'Opened namelist file '//TRIM(file)) + WRITE(*,*) 'Opened namelist file --> '//TRIM(file) + ELSE +!gf +! CALL finish('open_nml','Could not open namelist file '//TRIM(file)) + WRITE(*,*) 'open_nml:Could not open namelist file --> '//TRIM(file) + STOP +!gf + ENDIF + END FUNCTION open_nml + !================================================================================================ + FUNCTION position_nml (name, unit, rewind, status) RESULT (iunit) + + INTEGER :: iunit ! Fortran unit to read namelist from + ! position namelist file for reading on first occurrence + ! namelist /name/ (case independent). + CHARACTER(len=*), INTENT(in) :: name ! namelist group name + INTEGER, INTENT(in) :: unit ! file handler + LOGICAL, INTENT(in) ,OPTIONAL :: rewind ! default: true + INTEGER, INTENT(out) ,OPTIONAL :: status ! error return value + CHARACTER(len=256) :: yline ! line read + CHARACTER(len=256) :: test ! potentially uppercase namelist group name + INTEGER :: stat ! local copy of status variable + INTEGER :: ios ! status variable from read operation + LOGICAL :: lrew ! local copy of rewind flag + CHARACTER(len=64) :: yfilename ! local copy of namelist filename + INTEGER :: len_name ! length of requested namelist group name + CHARACTER :: ytest ! character to test for delimiter + CHARACTER(len=12) :: action ! current action + INTEGER :: ind ! index from index routine + INTEGER :: indc ! index of comment character (!) + CHARACTER(len=256) :: iomsg + IF (namelist_file_list(unit)%fileunit == -1) THEN +!gf +! CALL finish('position_nml','Namelist file '//TRIM(namelist_file_list(unit)%filename)//' already closed') + WRITE(*,*) 'position_nml:Namelist file --> '//TRIM(namelist_file_list(unit)%filename)//' --> already closed' + STOP +!gf + ELSEIF (unit > top) THEN +!gf +! WRITE (message_text,'(a,i0,a)') 'Namelist file for handler ', unit, ' has not been opened' +! CALL finish('position_nml',message_text) + WRITE(*,*) 'Namelist file for handler --> ', unit, ' --> has not been opened' + STOP +!gf + ELSE + iunit = namelist_file_list(unit)%fileunit + yfilename = TRIM(namelist_file_list(unit)%filename) + ENDIF + lrew = .TRUE. + IF (PRESENT(rewind)) lrew = rewind + stat = missing + action = 'missing' + len_name = LEN_TRIM (name) + IF (len_name > LEN(test)) THEN + stat = length_error + action = 'length_error' + ENDIF + test = tolower (name) + + ! Reposition file at beginning: + IF (lrew) THEN + REWIND (iunit) + ENDIF + ! Search start of namelist + + DO + IF (stat /= MISSING) EXIT + yline = '' + + READ (iunit,'(a)',IOSTAT=ios,IOMSG=iomsg) yline + IF (ios < 0) THEN + EXIT ! missing + ELSE IF (ios > 0) THEN + stat = read_error + action = 'read_error' + EXIT + END IF + yline = tolower (yline) + + ind = INDEX(yline,'&'//TRIM(test)) + + IF (ind == 0) CYCLE + + indc = INDEX(yline,'!') + IF (indc > 0 .AND. indc < ind) CYCLE + ! test for delimiter + + ytest = yline(ind+len_name+1:ind+len_name+1) + IF ( (LGE(ytest,'0') .AND. LLE(ytest,'9')) .OR. & + (LGE(ytest,'a') .AND. LLE(ytest,'z')) .OR. & + ytest == '_' .OR. & + (LGE(ytest,'A') .AND. LLE(ytest,'Z'))) THEN + CYCLE + ELSE + stat = positioned + BACKSPACE (iunit) + EXIT + END IF + ENDDO + + IF (PRESENT (status)) status = stat + SELECT CASE (stat) + CASE (positioned) + RETURN + CASE (missing) + IF (PRESENT (status)) RETURN + END SELECT +!gf CALL message ('position_nml','File '//TRIM(yfilename)// 'namelist /'//TRIM(test)//'/ '//TRIM(action)) + WRITE(*,*) 'position_nml: File --> '//TRIM(yfilename)// 'namelist /'//TRIM(test)//'/ '//TRIM(action) + END FUNCTION position_nml + !================================================================================================ + SUBROUTINE close_nml (unit) + INTEGER, INTENT(in) :: unit ! file handler + INTEGER :: istat + IF (unit == -1) THEN +!gf CALL finish('close_nml','Namelist file not opened') + WRITE(*,*) 'close_nml: Namelist file not opened' + ELSE + IF (namelist_file_list(unit)%fileunit == -1) THEN +!gf CALL finish ('close_nml','Namelist file '//TRIM(namelist_file_list(unit)%filename)//' already closed') + WRITE(*,*) 'close_nml: Namelist file --> '//TRIM(namelist_file_list(unit)%filename)//' --> already closed' + ENDIF + ENDIF + CLOSE (namelist_file_list(unit)%fileunit, IOSTAT=istat) + IF (istat == 0) THEN + namelist_file_list(unit)%fileunit = -1 + ELSE +!gf +! CALL finish('close_nml','Could not close namelist file '//TRIM(namelist_file_list(unit)%filename)) + WRITE(*,*) 'close_nml:Could not close namelist file --> '//TRIM(namelist_file_list(unit)%filename) + STOP +!gf + ENDIF + END SUBROUTINE close_nml + !================================================================================================ +END MODULE mo_namelist diff --git a/ifs-source/arpifs/m7/module/mo_netcdf.F90 b/ifs-source/arpifs/m7/module/mo_netcdf.F90 new file mode 100644 index 00000000..266e2ebd --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_netcdf.F90 @@ -0,0 +1,856 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_netcdf + USE netcdf + USE mo_kind, ONLY: dp + USE mo_exception, ONLY: finish, message, message_text + USE mo_control, ONLY: ldebugio +#ifdef HAMMOZ + USE mo_filename, ONLY: NETCDF +#endif + IMPLICIT NONE + + PRIVATE + + PUBLIC :: io_get_varindx ! mo_memory_base + PUBLIC :: add_dim ! + PUBLIC :: add_unknown_dim ! + PUBLIC :: max_dim_name ! mo_memory_gl + PUBLIC :: FILE_INFO ! mo_io + PUBLIC :: nf_check ! checks/print the status of netcdf operations + PUBLIC :: nf_noerr ! mo_io + PUBLIC :: nf_enotnc ! mo_io + PUBLIC :: nf_nowrite ! mo_io + PUBLIC :: nf_write ! mo_io + PUBLIC :: nf_nofill ! mo_io + PUBLIC :: nf_max_var_dims ! mo_read_netcdf + PUBLIC :: io_ndim_ids ! mo_io + PUBLIC :: io_dim_ids ! mo_io + PUBLIC :: io_dim ! io_dim_ids + PUBLIC :: nf_max_name ! mo_io + PUBLIC :: nf_inq_varid ! mo_io + PUBLIC :: nf_inq_dimid ! mo_io + PUBLIC :: nf_inq_dimlen ! + PUBLIC :: nf_get_var_double ! + PUBLIC :: nf_get_var_real ! + PUBLIC :: nf_get_vara_double ! + PUBLIC :: nf_get_vara_real ! + PUBLIC :: nf_get_att_int ! + PUBLIC :: nf_global ! mo_io + PUBLIC :: nf_double ! mo_io + PUBLIC :: nf_create ! mo_io + PUBLIC :: nf__create ! mo_io, version allows setting I/O buffer size +#ifdef PARALLEL_NC4 + PUBLIC :: nf_create_par ! mo_io, version allows parallel I/O HDF5 based +#endif + PUBLIC :: nf_set_fill ! mo_io + PUBLIC :: nf_fill_real ! mo_io + PUBLIC :: nf_strerror ! mo_io + PUBLIC :: nf_open ! mo_io + PUBLIC :: nf__open ! mo_io, version allows setting I/O buffer size + PUBLIC :: nf_clobber ! mo_io + PUBLIC :: nf_close ! mo_io + PUBLIC :: nf_64bit_offset ! mo_io + PUBLIC :: nf_netcdf4 ! mo_io, version allows netcdf I/O HDF5 based + PUBLIC :: nf_def_dim + PUBLIC :: nf_def_var + PUBLIC :: nf_enddef + PUBLIC :: nf_inq_vardimid ! mo_read_ncdf_f77 + PUBLIC :: nf_inq_varndims + PUBLIC :: nf_inq_dimname + PUBLIC :: nf_inq_varname + PUBLIC :: nf_inq_nvars + PUBLIC :: nf_inq_unlimdim + PUBLIC :: nf_inq_attlen + PUBLIC :: nf_get_att_text + PUBLIC :: nf_get_var1_double + PUBLIC :: nf_put_var_double + PUBLIC :: nf_put_var1_double + PUBLIC :: nf_put_vara_double + PUBLIC :: nf_put_att_text + PUBLIC :: nf_unlimited + PUBLIC :: nf_noclobber + PUBLIC :: nf_float + PUBLIC :: nf_real + PUBLIC :: io_inq_dimid ! mo_o3clim + PUBLIC :: io_inq_dimlen ! mo_o3clim + PUBLIC :: io_inq_varid ! mo_o3clim + PUBLIC :: io_get_var_double ! mo_o3clim + PUBLIC :: io_get_var_double1 + PUBLIC :: io_get_vara_double ! mo_o3clim +#ifdef HAMMOZ + PUBLIC :: io_info_print ! mo_sst +#endif + PUBLIC :: message_text ! mo_sst +#ifdef HAMMOZ + PUBLIC :: io_init_dims ! inictl +#endif + PUBLIC :: io_get_att_int ! mo_io + PUBLIC :: io_get_att_double ! mo_io + PUBLIC :: io_get_att_text ! mo_io + PUBLIC :: io_def_var ! mo_io + PUBLIC :: io_put_var_double ! mo_io + PUBLIC :: io_put_var_double1 + PUBLIC :: io_put_att_text ! mo_io + PUBLIC :: io_put_att_int ! mo_io + PUBLIC :: io_put_att_double ! mo_io + PUBLIC :: io_enddef ! mo_io + PUBLIC :: io_def_dim ! mo_io + PUBLIC :: io_info_construct ! mo_io + PUBLIC :: t_att_text ! text attributes data type + PUBLIC :: put_att ! store attribute in attributes data type + PUBLIC :: global_att ! global text attributes + + PUBLIC :: initialsize ! initial size of netCDF file + PUBLIC :: chunksize ! preferred netCDF I/O buffer size + + PUBLIC :: cleanup_netcdf ! deallocate module variables + + INCLUDE 'netcdf.inc' + + PUBLIC :: BELOWSUR, SURFACE, ABOVESUR2, ABOVESUR10, HYBRID, HYBRID_H, TILES, & + SOILLEV, ROOTZONES, CANOPY, & + COSP_LEVELS !ZK #474 + + !----------------------------------------------------------------------------- + ! + ! Due to I/O performance problems, means insufficient return values by + ! OS information in the stat() system call, we change the buffer size + ! to 16 MB fuer netcdf I/O buffer, cannot be PARAMETER, because the netCDF + ! library is written in C and we get trouble passing parameters. + +#if defined (__SX__) || defined (ES) || defined (__PGI) + INTEGER :: initialsize = 33554432 ! that's 32 MByte + INTEGER :: chunksize = 33554432 ! too +#else + INTEGER :: initialsize = 32768 ! that's 32 kByte + INTEGER :: chunksize = 32768 ! too +#endif + + !----------------------------------------------------------------------------- + TYPE FILE_INFO + + LOGICAL :: opened ! open = .true. or closed = .false. + LOGICAL :: parallel ! parallel .true. else .false. + INTEGER :: file_id ! netCDF file id + INTEGER :: access_mode ! access mode for that file + INTEGER :: ncdims(NF_MAX_VAR_DIMS) + INTEGER :: FORMAT ! file format NETCDF + + CHARACTER(len=NF_MAX_NAME) :: creation_program ! name of this program + CHARACTER(len=NF_MAX_NAME) :: creation_user ! who has run this program + CHARACTER(len=NF_MAX_NAME) :: creation_date ! created netCDF file at + CHARACTER(len=NF_MAX_NAME) :: binary_source ! binary type (CRAY or IEEE) + CHARACTER(len=NF_MAX_NAME) :: file_type ! initital or restart file + CHARACTER(len=NF_MAX_NAME) :: file_name ! nc file name + CHARACTER(len=NF_MAX_NAME) :: title + END TYPE FILE_INFO + !----------------------------------------------------------------------------- + INTEGER, PARAMETER :: max_dim_name = 32 + !----------------------------------------------------------------------------- + TYPE IO_dim + INTEGER :: dim_id = 0 ! temporary NetCDF id + INTEGER :: var_id = 0 ! temporary NetCDF id + INTEGER :: dim_len = -1 + CHARACTER(len=max_dim_name) :: dim_name = '' + CHARACTER(len=64) :: longname = '' + CHARACTER(len=32) :: units = '' + INTEGER :: levtyp = 0 ! GRIB level type + LOGICAL :: single = .FALSE. ! single level + REAL(dp) ,POINTER :: VALUE(:) => NULL() + END TYPE IO_dim + !----------------------------------------------------------------------------- + INTEGER ,PARAMETER :: max_dim_ids = 50 + INTEGER :: IO_ndim_ids + TYPE (IO_dim) ,TARGET ,SAVE :: IO_dim_ids (max_dim_ids) + + INTEGER :: BELOWSUR != 111 + INTEGER :: SOILLEV != 71 + INTEGER :: SURFACE != 1 + INTEGER :: ABOVESUR2 != 105 + INTEGER :: ABOVESUR10 != 105 + INTEGER :: HYBRID != 109 ? + INTEGER :: HYBRID_H != 110 ? + INTEGER :: TILES != 70 + INTEGER :: ROOTZONES != 72 + INTEGER :: CANOPY != 73 + INTEGER :: COSP_LEVELS!= 103 !ZK #474 + + !----------------------------------------------------------------------------- + ! data type to hold file attributes + !---------------------------------- + TYPE t_att_text + CHARACTER(len= 32) :: name = '' + CHARACTER(len=128) :: text = '' + END TYPE t_att_text + + TYPE (t_att_text) ,SAVE :: global_att (20) + !----------------------------------------------------------------------------- +CONTAINS + !----------------------------------------------------------------------------- + SUBROUTINE put_att (att, name, VALUE) + TYPE (t_att_text), INTENT(inout) :: att(:) + CHARACTER(len=*), INTENT(in) :: name + CHARACTER(len=*), INTENT(in) :: VALUE + !---------------------------------------------- + ! store an attribute in the attribute data type + !---------------------------------------------- + INTEGER :: i + DO i = 1, SIZE(att) + IF (att(i)% name == '' .OR. att(i)% name == name) THEN + att(i)% name = name + att(i)% text = VALUE + EXIT + ENDIF + END DO + END SUBROUTINE put_att + !----------------------------------------------------------------------------- + SUBROUTINE IO_info_construct(fileinfo) + TYPE(FILE_INFO), INTENT(inout) :: fileinfo + + fileinfo%opened = .FALSE. + fileinfo%parallel = .FALSE. + fileinfo%file_id = 0 + fileinfo%access_mode = 0 + fileinfo%ncdims(:) = 0 + fileinfo%creation_program = '?' + fileinfo%creation_user = '?' + fileinfo%creation_date = '?' + fileinfo%binary_source = '?' + fileinfo%file_type = '?' + fileinfo%file_name = '?' + fileinfo%title = '?' + + END SUBROUTINE IO_info_construct + !----------------------------------------------------------------------------- + FUNCTION IO_get_varindx (dimname) RESULT(indx) + CHARACTER(len=*), INTENT(in) :: dimname + INTEGER :: indx + + DO indx = 1, IO_ndim_ids + IF (IO_dim_ids(indx)%dim_name == dimname) RETURN + END DO + + indx = -1 + + END FUNCTION IO_get_varindx +#ifdef HAMMOZ + !----------------------------------------------------------------------------- + SUBROUTINE IO_init_dims + !--------------------- + ! predifine dimensions + !--------------------- + USE mo_parameters, ONLY: jpgrnd ! hard coded number of soil layers + USE mo_control, ONLY: ngl, nhgl, nlon, nlev, nlevp1, nsp, nvclev, nmp1 + USE mo_cosp_constants, ONLY: Nlr !ZK #474 + + IO_ndim_ids = 0 + !------------------------------- + ! definitions used in rerun file + !------------------------------- + CALL add_dim ("lon", nlon, "longitude", "degrees_east" ) + CALL add_dim ("lat", ngl, "latitude" , "degrees_north") + CALL add_dim ("nhgl", nhgl) + CALL add_dim ("nlevp1", nlevp1) + CALL add_dim ("spc", nsp, "spectral coefficients") + CALL add_dim ("nvclev" , nvclev) + CALL add_dim ("complex", 2, "real, imaginary part") + CALL add_dim ("nmp1", nmp1 ) +!vg ! in conflict with the more flexible definition of "belowsurface" in mo_soil +!vg +!vg CALL add_dim ("belowsurface", jpgrnd, "levels below the surface", & +!vg levtyp = 111, & +!vg indx = BELOWSUR, & +!vg units = 'cm', & +!vg VALUE = (/ 3.0_dp, & +!vg 19.0_dp, & +!vg 78.0_dp, & +!vg 268.0_dp, & +!vg 698.0_dp/)) + !------------------------------------------------------- + ! different/additional definitions used in output stream + !------------------------------------------------------- + CALL add_dim ("lev", nlev, "hybrid level at layer midpoints", & + units = "level", & + levtyp = 109, & + indx = HYBRID) + CALL add_dim ("ilev", nlev+1, "hybrid level at layer interfaces",& + units = "level", & + levtyp = 109, & + indx = HYBRID_H) + ! call add_dim ("time",nf_unlimited) + !-------------------- + ! single level fields + !-------------------- + CALL add_dim ("surface",1, levtyp = 1, & + single = .TRUE., & + indx = SURFACE) + CALL add_dim ("height2m", 1, units = "m", & + levtyp = 105, & + single = .TRUE., & + VALUE = (/2.0_dp/), & + indx = ABOVESUR2) + CALL add_dim ("height10m", 1, units = "m", & + levtyp = 105, & + single = .TRUE., & + VALUE = (/10.0_dp/), & + indx = ABOVESUR10) +!>>ZK #474 + ! Special dimensions used by COSP + CALL add_dim ("cosplev", Nlr, "height of COSP level above MSL", & + units = "m", & + levtyp = 103, & + VALUE = REAL( (/ & + 480, 960, 1440, 1920,& + 2400, 2880, 3360, 3840,& + 4320, 4800, 5280, 5760,& + 6240, 6720, 7200, 7680,& + 8160, 8640, 9120, 9600,& + 10080,10560,11040,11520,& + 12000,12480,12960,13440,& + 13920,14400,14880,15360,& + 15840,16320,16800,17280,& + 17760,18240,18720,19200 & + /), KIND=dp), & + indx = COSP_LEVELS) +!< SIZE(IO_dim_ids)) & + CALL finish ('add_dim','increase size of IO_dim_ids') + idx = IO_ndim_ids + ENDIF + dim => IO_dim_ids(idx) + !--------------------------------------------------------- + ! define attributes, chose defaults or optional parameters + !--------------------------------------------------------- + dim% dim_id = 0 + dim% var_id = 0 + dim% dim_len = len + dim% dim_name = name + dim% longname = '' ; IF (PRESENT (longname)) dim% longname = longname + dim% units = '' ; IF (PRESENT (units )) dim% units = units + dim% levtyp = 0 ; IF (PRESENT (levtyp )) dim% levtyp = levtyp + dim% single = .FALSE.; IF (PRESENT (single )) dim% single = single + IF (ASSOCIATED (dim% VALUE)) DEALLOCATE (dim% VALUE) + IF (PRESENT (VALUE)) THEN + IF (SIZE (VALUE) /= dim% dim_len) & + CALL finish ('add_dim',TRIM(name)//' len /= size (value)') + ALLOCATE (dim% VALUE (SIZE (VALUE))) + dim% VALUE = VALUE + ENDIF + IF (PRESENT(indx)) indx = idx + END SUBROUTINE add_dim + !----------------------------------------------------------------------------- + SUBROUTINE add_unknown_dim (len, indx) + !----------------------------------------- + ! add a dummy entry in the dimension table + !----------------------------------------- + INTEGER, INTENT(in) :: len ! size of dimension + INTEGER, INTENT(out) :: indx ! index of entry in table + + CHARACTER(len=4) :: nam + CHARACTER(len=4) :: form + INTEGER :: i + + SELECT CASE (len) + CASE (1:9) + form ='(i1)' + CASE (10:99) + form ='(i2)' + CASE (100:999) + form ='(i3)' + CASE default + CALL finish ('add_unknown_dim','len < 1 or len > 999') + END SELECT + nam = 'n' + WRITE (nam(2:4),form) len + DO i=1, IO_ndim_ids + IF (IO_dim_ids(i)% dim_name == nam) THEN + indx = i + RETURN + ENDIF + END DO + CALL add_dim (nam, len, levtyp=109, indx=indx) + END SUBROUTINE add_unknown_dim + !----------------------------------------------------------------------------- + SUBROUTINE IO_DEF_DIM (ncid, name, len, dimid) + INTEGER :: ncid, len, dimid, status, indx + CHARACTER(len=*) :: name + + status = NF_DEF_DIM (ncid, name, len, dimid) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name, len + CALL message ('IO_DEF_DIM', message_text) + CALL message ('IO_DEF_DIM', NF_STRERROR(status)) + CALL finish ('IO_DEF_DIM', 'Run terminated.') + END IF + + DO indx = 1, IO_ndim_ids + IF (name == IO_dim_ids(indx)%dim_name) THEN + IO_dim_ids(indx)%dim_id = dimid + RETURN + END IF + END DO + + WRITE (message_text,*) 'element ',name,' not available ...' + CALL message ('IO_DEF_DIM', message_text) + CALL finish('IO_DEF_DIM','IO_dim_ids error') + + END SUBROUTINE IO_DEF_DIM + !----------------------------------------------------------------------------- + SUBROUTINE IO_INQ_DIMID (ncid, name, dimid) + INTEGER :: ncid, dimid, status + CHARACTER(len=*) :: name + + status = NF_INQ_DIMID (ncid, name, dimid) + IF (status /= NF_NOERR) THEN + CALL message ('IO_INQ_DIMID', name) + CALL message ('IO_INQ_DIMID', NF_STRERROR(status)) + CALL finish ('IO_INQ_DIMID', 'Run terminated.') + END IF + + END SUBROUTINE IO_INQ_DIMID + !----------------------------------------------------------------------------- + SUBROUTINE IO_INQ_DIMLEN (ncid, dimid, len) + INTEGER :: ncid, dimid, len, status + + status = NF_INQ_DIMLEN (ncid, dimid, len) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, dimid + CALL message ('IO_INQ_DIMLEN', NF_STRERROR(status)) + CALL finish ('IO_INQ_DIMLEN', 'Run terminated.') + END IF + + END SUBROUTINE IO_INQ_DIMLEN + !----------------------------------------------------------------------------- + SUBROUTINE IO_INQ_VARID (ncid, name, varid, lstat) + INTEGER :: ncid, varid, status + CHARACTER(len=*) :: name + LOGICAL, INTENT(out), OPTIONAL :: lstat + + status = NF_INQ_VARID (ncid, name, varid) + + IF (PRESENT(lstat)) THEN + lstat = status == NF_NOERR + RETURN + ENDIF + + IF (ldebugio) THEN + WRITE(message_text,*) ' Id=',ncid,' varid=',varid,' ',name + CALL message ('IO_INQ_VARID', message_text) + END IF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name + CALL message ('IO_INQ_VARID', message_text) + CALL message ('IO_INQ_VARID', NF_STRERROR(status)) + CALL finish ('IO_INQ_VARID', 'Run terminated.') + END IF + + END SUBROUTINE IO_INQ_VARID + !----------------------------------------------------------------------------- + SUBROUTINE IO_DEF_VAR (ncid, name, xtype, nvdims, vdims, varid, lparallel) + INTEGER :: ncid, varid, xtype, nvdims + CHARACTER(len=*) :: name + INTEGER :: vdims(*) + INTEGER :: status + LOGICAL, OPTIONAL, INTENT(in) :: lparallel + + status = NF_DEF_VAR (ncid, name, xtype, nvdims, vdims, varid) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name, xtype, nvdims,vdims(1:nvdims) + CALL message ('IO_DEF_VAR', message_text) + CALL message ('IO_DEF_VAR', NF_STRERROR(status)) + CALL finish ('IO_DEF_VAR', 'Run terminated.') + ENDIF + IF (PRESENT(lparallel)) THEN + IF (lparallel) THEN +#ifdef PARALLEL_NC4 + status = NF_VAR_PAR_ACCESS(ncid, varid, NF_INDEPENDENT) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, name, xtype, nvdims,vdims(1:nvdims) + CALL message ('IO_DEF_VAR collective', message_text) + CALL message ('IO_DEF_VAR collective', NF_STRERROR(status)) + CALL finish ('IO_DEF_VAR collective', 'Run terminated.') + ENDIF +#else + CALL finish('IO_DEV_VAR', 'Parallel write requires -DPARALLEL_NC4 enabled during compilation') +#endif + ENDIF + ENDIF + + END SUBROUTINE IO_DEF_VAR + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_ATT_TEXT (ncid, varid, name, text) + INTEGER :: ncid, varid, TYPE, len + CHARACTER(len=*) :: name, text + INTEGER :: status + + status = NF_INQ_ATT(ncid, varid, name, TYPE, len) + IF (status /= NF_NOERR) THEN + name = 'not available' + RETURN + ENDIF + + status = NF_GET_ATT_TEXT (ncid, varid, name, text) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_GET_ATT_TEXT', message_text) + CALL message ('IO_GET_ATT_TEXT', NF_STRERROR(status)) + CALL finish ('IO_GET_ATT_TEXT', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_ATT_TEXT + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_ATT_TEXT (ncid, varid, name, text) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name, text + INTEGER :: status + INTEGER :: lentext + + lentext = LEN(TRIM(text)) + + status = NF_PUT_ATT_TEXT (ncid, varid, name, lentext, text) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name, lentext, text + CALL message ('IO_PUT_ATT_TEXT', message_text) + CALL message ('IO_PUT_ATT_TEXT', NF_STRERROR(status)) + CALL finish ('IO_PUT_ATT_TEXT', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_ATT_TEXT + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_ATT_INT (ncid, varid, name, ival, lstat) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + INTEGER :: ival + LOGICAL, INTENT(out), OPTIONAL :: lstat + + INTEGER :: status + + status = NF_GET_ATT_INT (ncid, varid, name, ival) + + IF (PRESENT(lstat)) THEN + lstat = status == NF_NOERR + RETURN + ENDIF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_GET_ATT_INT', message_text) + CALL message ('IO_GET_ATT_INT', NF_STRERROR(status)) + CALL finish ('IO_GET_ATT_INT', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_ATT_INT + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_ATT_INT (ncid, varid, name, ival) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + INTEGER :: ival + INTEGER :: xtype, len + INTEGER :: status + + len = 1 + xtype = NF_INT + status = NF_PUT_ATT_INT (ncid, varid, name, xtype, len, ival) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_PUT_ATT_INT', message_text) + CALL message ('IO_PUT_ATT_INT', NF_STRERROR(status)) + CALL finish ('IO_PUT_ATT_INT', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_ATT_INT + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_ATT_DOUBLE (ncid, varid, name, rval) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + REAL(dp) :: rval + INTEGER :: status + + status = NF_GET_ATT_DOUBLE (ncid, varid, name, rval) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_GET_ATT_DOUBLE', message_text) + CALL message ('IO_GET_ATT_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_ATT_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_ATT_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_ATT_DOUBLE (ncid, varid, name, rval) + INTEGER :: ncid, varid + CHARACTER(len=*) :: name + REAL(dp) :: rval + INTEGER :: xtype, len + INTEGER :: status + + len = 1 + xtype = NF_DOUBLE + + status = NF_PUT_ATT_DOUBLE (ncid, varid, name, xtype, len, rval) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, name + CALL message ('IO_PUT_ATT_DOUBLE', message_text) + CALL message ('IO_PUT_ATT_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_ATT_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_ATT_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_VAR_DOUBLE (ncid, varid, dvals) + INTEGER :: ncid, varid + REAL(dp) :: dvals(*) + INTEGER :: status + + status = NF_GET_VAR_DOUBLE (ncid, varid, dvals) + + IF (ldebugio) THEN + WRITE(message_text,*) ' Id=',ncid,' varid=',varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + END IF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + CALL message ('IO_GET_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_VAR_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_VAR_DOUBLE1 (ncid, varid, dval) + INTEGER :: ncid, varid + REAL(dp) :: dval + INTEGER :: status + + status = NF_GET_VAR_DOUBLE (ncid, varid, dval) + + IF (ldebugio) THEN + WRITE(message_text,*) 'IO_GET_VAR_DOUBLE :',' Id=',ncid,' varid=',varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + END IF + + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_GET_VAR_DOUBLE', message_text) + CALL message ('IO_GET_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_VAR_DOUBLE1 + !----------------------------------------------------------------------------- + SUBROUTINE IO_GET_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + INTEGER :: ncid, varid + INTEGER :: istart(*), icount(*) + REAL(dp) :: dvals(*) + INTEGER :: status + + status = NF_GET_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid, istart(1:4), icount(1:4) + CALL message ('IO_GET_VARA_DOUBLE', message_text) + CALL message ('IO_GET_VARA_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_GET_VARA_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_GET_VARA_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + INTEGER :: ncid, varid + INTEGER :: istart(*), icount(*) + REAL(dp) :: dvals(*) + INTEGER :: status + CHARACTER(len=80) :: varname + + status = NF_PUT_VARA_DOUBLE (ncid, varid, istart, icount, dvals) + IF (status /= NF_NOERR) THEN + status = NF_INQ_VARNAME (ncid, varid, varname) + WRITE(message_text,*) ncid, varid, varname + CALL message ('IO_PUT_VARA_DOUBLE', message_text) + CALL message ('IO_PUT_VARA_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VARA_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_VARA_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_VAR_DOUBLE (ncid, varid, dvals) + INTEGER :: ncid, varid + REAL(dp) :: dvals(*) + INTEGER :: status + CHARACTER(len=80) :: varname + + IF (ldebugio) THEN + status = NF_INQ_VARNAME (ncid, varid, varname) + WRITE(message_text,*) ncid, varid, varname + CALL message ('IO_PUT_VAR_DOUBLE', message_text) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', message_text) + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + END IF + + status = NF_PUT_VAR_DOUBLE (ncid, varid, dvals) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', message_text) + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_VAR_DOUBLE + !----------------------------------------------------------------------------- + SUBROUTINE IO_PUT_VAR_DOUBLE1 (ncid, varid, dval) + INTEGER :: ncid, varid + REAL(dp) :: dval + INTEGER :: status + CHARACTER (80) :: varname + + IF (ldebugio) THEN + status = NF_INQ_VARNAME (ncid, varid, varname) + WRITE(message_text,*) 'IO_PUT_VAR_DOUBLE :', ncid, varid, varname + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) 'IO_PUT_VAR_DOUBLE :', ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + END IF + + status = NF_PUT_VAR_DOUBLE (ncid, varid, dval) + IF (status /= NF_NOERR) THEN + WRITE(message_text,*) 'IO_PUT_VAR_DOUBLE :', ncid, varid + CALL message ('IO_PUT_VAR_DOUBLE', NF_STRERROR(status)) + CALL finish ('IO_PUT_VAR_DOUBLE', 'Run terminated.') + END IF + + END SUBROUTINE IO_PUT_VAR_DOUBLE1 + !----------------------------------------------------------------------------- + SUBROUTINE IO_ENDDEF (ncid) + INTEGER :: ncid, status + + status = NF_ENDDEF (ncid) + IF (status /= NF_NOERR) THEN + CALL message ('IO_ENDDEF', NF_STRERROR(status)) + CALL finish ('IO_ENDDEF', 'Run terminated.') + END IF + + END SUBROUTINE IO_ENDDEF +#ifdef HAMMOZ + !----------------------------------------------------------------------------- + SUBROUTINE IO_info_print(fileinfo) + TYPE(FILE_INFO) :: fileinfo + INTEGER :: i + + CALL message('',' ') + WRITE(message_text,*) & + 'File name ',TRIM(fileinfo%file_name), & + ' type ', TRIM(fileinfo%file_type), & + ' title ', TRIM(fileinfo%title) + CALL message('',message_text) + SELECT CASE (fileinfo%format) + CASE (NETCDF) + CALL message('',' File type : NETCDF') + CASE default + CALL message('',' File type : UNKNOWN') + END SELECT + IF (fileinfo%opened) THEN + CALL message('',' File open.') + ELSE + CALL message('',' File closed.') + END IF + WRITE(message_text,*) & + 'File id :', fileinfo%file_id,& + ' access mode :',fileinfo%access_mode + CALL message('',message_text) + DO i = 1, NF_MAX_VAR_DIMS + IF (fileinfo%ncdims(i) /= 0) THEN + WRITE(message_text,*) & + 'Variable id :',i,' field dimension :',fileinfo%ncdims(i) + CALL message('',message_text) + END IF + END DO + WRITE(message_text,*) & + 'Created by ',TRIM(fileinfo%creation_user), & + ' with ', TRIM(fileinfo%creation_program), & + ' at ', TRIM(fileinfo%creation_date), & + ' source ', TRIM(fileinfo%binary_source) + CALL message('',message_text) + CALL message('',' ') + + END SUBROUTINE IO_info_print + !----------------------------------------------------------------------------- +#endif + SUBROUTINE cleanup_netcdf + ! + ! deallocate module variables + ! + INTEGER :: i + + DO i=1, SIZE(IO_dim_ids) + IF (ASSOCIATED (IO_dim_ids(i)% VALUE)) DEALLOCATE (IO_dim_ids(i)% VALUE) + END DO + + END SUBROUTINE cleanup_netcdf + !----------------------------------------------------------------------------- + ! turns nf_* function into subroutine and checks status + SUBROUTINE nf_check(status, fname) + INTEGER :: status + CHARACTER(len=*), OPTIONAL :: fname + + IF (status /= nf_noerr) THEN + IF (PRESENT(fname)) THEN + CALL finish('netcdf error in '//TRIM(fname),nf_strerror(status)) + ELSE + CALL finish('netcdf error',nf_strerror(status)) + END IF + ENDIF + + END SUBROUTINE nf_check + !----------------------------------------------------------------------------- +END MODULE mo_netCDF diff --git a/ifs-source/arpifs/m7/module/mo_param_switches.F90 b/ifs-source/arpifs/m7/module/mo_param_switches.F90 new file mode 100644 index 00000000..3941c2f9 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_param_switches.F90 @@ -0,0 +1,9 @@ +MODULE mo_param_switches + + IMPLICIT NONE + + LOGICAL :: lcdnc_progn ! true for prognostic cloud droplet activation !HK + INTEGER :: ncd_activ ! type of cloud droplet activation scheme (see physctl.inc) !HK + INTEGER :: nactivpdf ! sub-grid scale PDF of updraft velocities (see physctl.inc) !ZK + INTEGER :: cdnc_min_fixed ! minimum number of cloud droplet number concentration cm-3 +END MODULE mo_param_switches diff --git a/ifs-source/arpifs/m7/module/mo_physical_constants.F90 b/ifs-source/arpifs/m7/module/mo_physical_constants.F90 new file mode 100644 index 00000000..1bf52083 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_physical_constants.F90 @@ -0,0 +1,243 @@ +! This module provides physical constants for the ICON general circulation models. +! +! Physical constants are grouped as follows: +! - Natural constants +! - Molar weights +! - Earth and Earth orbit constants +! - Thermodynamic constants for the dry and moist atmosphere +! - Constants used for the computation of lookup tables of the saturation +! mixing ratio over liquid water (*c_les*) or ice(*c_ies*) +! (to be shifted to the module that computes the lookup tables) +! +! +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + +MODULE mo_physical_constants + + USE mo_kind, ONLY: wp + + IMPLICIT NONE + + PUBLIC + + ! Natural constants + ! ----------------- + ! +!!$ ! ECHAM values +!!$ REAL(wp), PARAMETER :: avo = 6.022045e23_wp ! [1/mo] Avogadro constant +!!$ REAL(wp), PARAMETER :: ak = 1.380662e-23_wp ! [J/K] Boltzmann constant +!!$ REAL(wp), PARAMETER :: argas = 8.314409_wp ! [J/K/mol] molar/universal/ideal gas constant +!!$ REAL(wp), PARAMETER :: stbo = 5.67E-8_wp ! [W/m2/K4] Stephan-Boltzmann constant + ! WMO/SI values + REAL(wp), PARAMETER :: avo = 6.02214179e23_wp !> [1/mo] Avogadro constant + REAL(wp), PARAMETER :: ak = 1.3806504e-23_wp !! [J/K] Boltzmann constant + REAL(wp), PARAMETER :: argas = 8.314472_wp !! [J/K/mol] molar/universal/ideal gas constant + REAL(wp), PARAMETER :: stbo = 5.6704E-8_wp !! [W/m2/K4] Stephan-Boltzmann constant + + + !> Molar weights + !! ------------- + !! + !! Pure species + REAL(wp), PARAMETER :: amco2 = 44.011_wp !>[g/mol] CO2 + REAL(wp), PARAMETER :: amch4 = 16.043_wp !! [g/mol] CH4 + REAL(wp), PARAMETER :: amo3 = 47.9982_wp !! [g/mol] O3 + REAL(wp), PARAMETER :: amo2 = 31.9988_wp !! [g/mol] O2 + REAL(wp), PARAMETER :: amn2o = 44.013_wp !! [g/mol] N2O + REAL(wp), PARAMETER :: amc11 =137.3686_wp !! [g/mol] CFC11 + REAL(wp), PARAMETER :: amc12 =120.9140_wp !! [g/mol] CFC12 + REAL(wp), PARAMETER :: amw = 18.0154_wp !! [g/mol] H2O + REAL(wp), PARAMETER :: amo = 15.9994_wp !! [g/mol] O + REAL(wp), PARAMETER :: amno = 30.0061398_wp !! [g/mol] NO + REAL(wp), PARAMETER :: amn2 = 28.0134_wp !! [g/mol] N2 + REAL(wp), PARAMETER :: amso4 = 96.0626_wp !! [g/mol] SO4 + REAL(wp), PARAMETER :: ams = 32.06_wp !! [g/mol] S + ! + !> Mixed species + REAL(wp), PARAMETER :: amd = 28.970_wp !> [g/mol] dry air + ! + !> Auxiliary constants + ! ppmv2gg converts ozone from volume mixing ratio in ppmv + ! to mass mixing ratio in g/g + REAL(wp), PARAMETER :: ppmv2gg=1.e-6_wp*amo3/amd + REAL(wp), PARAMETER :: o3mr2gg=amo3/amd + + !> Conversion factor from CO2 volume to mass mixing ratio [kg(CO2)/kg(Air)/(mol(CO2)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_co2 = amco2 / amd + !> Conversion factor from CH4 volume to mass mixing ratio [kg(CH4)/kg(Air)/(mol(CH4)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_ch4 = amch4 / amd + !> Conversion factor from N2O volume to mass mixing ratio [kg(N2O)/kg(Air)/(mol(N2O)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_n2o = amn2o / amd + !> Conversion factor from CFC11 volume to mass mixing ratio [kg(CFC11)/kg(Air)/(mol(CFC11)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_c11 = amc11 / amd + !> Conversion factor from CFC12 volume to mass mixing ratio [kg(CFC12)/kg(Air)/(mol(CFC12)/mol(Air))]. + REAL(wp), PARAMETER :: vmr_to_mmr_c12 = amc12 / amd + + !> Earth and Earth orbit constants + !! ------------------------------- + !! +! REAL(wp), PARAMETER :: re = 6.371229e6_wp !! [m] average radius +! REAL(wp), PARAMETER :: rre = 1._wp/ph_re !! [1/m] + REAL(wp), PARAMETER :: earth_radius = 6.371229e6_wp !! [m] average radius + REAL(wp), PARAMETER :: inverse_earth_radius = 1._wp/earth_radius !! [1/m] + REAL(wp), PARAMETER :: earth_angular_velocity = 7.29212e-5_wp !! [rad/s] angular velocity + ! +!!$ ! ECHAM values +!! REAL(wp), PARAMETER :: grav = 9.80616_wp ! [m/s2] av. gravitational acceleration + ! WMO/SI value + REAL(wp), PARAMETER :: grav = 9.80665_wp !> [m/s2] av. gravitational acceleration + !$ACC DECLARE COPYIN(grav) + REAL(wp), PARAMETER :: rgrav = 1._wp/grav !! [s2/m] + ! + REAL(wp), PARAMETER :: rae = 0.1277E-2_wp !> [m/m] ratio of atm. scale height + ! !! to Earth radius + + + ! Thermodynamic constants for the dry and moist atmosphere + ! -------------------------------------------------------- + ! + !> Dry air + REAL(wp), PARAMETER :: rd = 287.04_wp !> [J/K/kg] gas constant + !$ACC DECLARE COPYIN(rd) + REAL(wp), PARAMETER :: cpd = 1004.64_wp !! [J/K/kg] specific heat at constant pressure + REAL(wp), PARAMETER :: cvd = cpd-rd !! [J/K/kg] specific heat at constant volume + REAL(wp), PARAMETER :: con_m = 1.50E-5_wp !! [m^2/s] kinematic viscosity of dry air + REAL(wp), PARAMETER :: con_h = 2.20E-5_wp !! [m^2/s] scalar conductivity of dry air + REAL(wp), PARAMETER :: con0_h= 2.40e-2_wp !! [J/m/s/K]thermal conductivity of dry air + REAL(wp), PARAMETER :: eta0d = 1.717e-5_wp !! [N*s/m2] dyn viscosity of dry air at tmelt + ! + !> H2O + !! - gas + REAL(wp), PARAMETER :: rv = 461.51_wp !> [J/K/kg] gas constant for water vapor + !$ACC DECLARE COPYIN(rv) + REAL(wp), PARAMETER :: cpv = 1869.46_wp !! [J/K/kg] specific heat at constant pressure + REAL(wp), PARAMETER :: cvv = cpv-rv !! [J/K/kg] specific heat at constant volume + REAL(wp), PARAMETER :: dv0 = 2.22e-5_wp !! [m^2/s] diff coeff of H2O vapor in dry air at tmelt + !> - liquid / water + REAL(wp), PARAMETER :: rhoh2o= 1000._wp !> [kg/m3] density of liquid water + !> - solid / ice + REAL(wp), PARAMETER :: rhoice= 916.7_wp !> [kg/m3] density of pure ice + + !REAL(wp), PARAMETER :: clw = 4186.84_wp !! [J/K/kg] specific heat of water + !! see below + REAL(wp), PARAMETER :: cv_i = 2000.0_wp + !> - phase changes + REAL(wp), PARAMETER :: alv = 2.5008e6_wp !> [J/kg] latent heat for vaporisation + !$ACC DECLARE COPYIN(alv) + REAL(wp), PARAMETER :: als = 2.8345e6_wp !! [J/kg] latent heat for sublimation + !$ACC DECLARE COPYIN(als) + REAL(wp), PARAMETER :: alf = als-alv !! [J/kg] latent heat for fusion + !$ACC DECLARE COPYIN(alf) + REAL(wp), PARAMETER :: tmelt = 273.15_wp !! [K] melting temperature of ice/snow + REAL(wp), PARAMETER :: t3 = 273.16_wp !! [K] Triple point of water at 611hPa + ! + !> Auxiliary constants + REAL(wp), PARAMETER :: rdv = rd/rv !> [ ] + !$ACC DECLARE COPYIN(rdv) + REAL(wp), PARAMETER :: vtmpc1= rv/rd-1._wp !! [ ] + !$ACC DECLARE COPYIN(vtmpc1) + REAL(wp), PARAMETER :: vtmpc2= cpv/cpd-1._wp !! [ ] + REAL(wp), PARAMETER :: rcpv = cpd/cpv-1._wp !! [ ] + REAL(wp), PARAMETER :: alvdcp= alv/cpd !! [K] + REAL(wp), PARAMETER :: alsdcp= als/cpd !! [K] + REAL(wp), PARAMETER :: rcpd = 1._wp/cpd !! [K*kg/J] + REAL(wp), PARAMETER :: rcvd = 1._wp/cvd !! [K*kg/J] + REAL(wp), PARAMETER :: rcpl = 3.1733_wp !! cp_d / cp_l - 1 + ! + REAL(wp), PARAMETER :: clw = (rcpl + 1.0_wp) * cpd !> specific heat capacity of liquid water + REAL(wp), PARAMETER :: cv_v = (rcpv + 1.0_wp) * cpd - rv + ! + REAL(wp), PARAMETER :: o_m_rdv = 1._wp-rd/rv !> [ ] + !$ACC DECLARE COPYIN(o_m_rdv) + REAL(wp), PARAMETER :: rd_o_cpd = rd/cpd !! [ ] + !$ACC DECLARE COPYIN(rd_o_cpd) + REAL(wp), PARAMETER :: cvd_o_rd = cvd/rd !! [ ] + ! + REAL(wp), PARAMETER :: p0ref = 100000.0_wp !> [Pa] reference pressure for Exner function + + !> Variables for computing cloud cover in RH scheme + REAL(wp), PARAMETER :: uc1 = 0.8_wp + REAL(wp), PARAMETER :: ucl = 1.00_wp + + !> U.S. standard atmosphere vertical tropospheric temperature gradient + REAL(wp), PARAMETER :: dtdz_standardatm = -6.5e-3_wp ! [ K/m ] + + !> constants for radiation module + REAL(wp), PARAMETER :: zemiss_def = 0.996_wp !> lw sfc default emissivity factor + + !> salinity factor for reduced saturation vapor pressure over oceans + REAL(wp), PARAMETER :: salinity_fac = 0.981_wp + + !> dielectric constants at reference temperature 0 degree Celsius for radar reflectivity calculation: + REAL(wp), PARAMETER :: K_w_0 = 0.93_wp + REAL(wp), PARAMETER :: K_i_0 = 0.176_wp + +!------------below are parameters for ocean model--------------- + ! coefficients in linear EOS + REAL(wp), PARAMETER :: a_T = 2.55E-04_wp, & ! thermal expansion coefficient (kg/m3/K) + & b_S = 7.64E-01_wp ! haline contraction coefficient (kg/m3/psu) + + ! density reference values, to be constant in Boussinesq ocean models + REAL(wp), PARAMETER :: rho_ref = 1025.022_wp ! reference density [kg/m^3] + REAL(wp), PARAMETER :: rho_inv = 0.0009755881663_wp ! inverse reference density [m^3/kg] + REAL(wp), PARAMETER :: sal_ref = 35.0_wp ! reference salinity [psu] + + REAL(wp), PARAMETER :: SItodBar = 1.0e-4_wp !Conversion from pressure [p] to pressure [bar] + !used in ocean thermodynamics + REAL(wp),PARAMETER :: sfc_press_pascal = 101300.0_wp + REAL(wp),PARAMETER :: sfc_press_bar = 101300.0_wp*SItodBar + + REAL(wp), PARAMETER :: p0sl_bg = 101325._wp ! [Pa] sea level pressure + +!----------below are parameters for sea-ice and lake model--------------- + REAL(wp), PARAMETER :: & + ks = 0.31_wp, & ! heat conductivity snow [J / (m s K)] + ki = 2.1656_wp, & ! heat conductivity ice [J / (m s K)] + rhoi = 917.0_wp, & ! density of sea ice [kg / m**3] + rhos = 300.0_wp, & ! density of snow [kg / m**3] + ci = 2106.0_wp, & ! Heat capacity of ice [J / (kg K)] + cs = 2090._wp, &! Heat capacity of snow [J / (kg K)] + + Tf = -1.80_wp, & ! Temperature ice bottom [C] + mu = 0.054_wp, & ! Constant in linear freezing- + ! point relationship [C/ppt] + ! (aka melting) temperature) [C] +! muS = -(-0.0575 + 1.710523E-3*Sqrt(Sice) - 2.154996E-4*Sice) * Sice + albedoW = 0.07_wp, & ! albedo of the ocean used in atmosphere + + + fr_fac = 1.1925_wp, & ! Frank Roeske energy budget closing factor for OMIP +! fr_fac = 1.0_wp, ! factor not active + +! CCSM3 albedo scheme - not used for coupling + alb_ice_vis = 0.73_wp, & ! Albedo of dry ice (visible) + alb_ice_nir = 0.33_wp, & ! Albedo of dry ice (near-infrared) + alb_sno_vis = 0.96_wp, & ! Albedo of dry snow (visible) + alb_sno_nir = 0.68_wp, & ! Albedo of dry snow (near-infrared) + !I_0 = 0.3 ! Ice-surface penetrating shortwave fraction + I_0 = 0.17_wp ! Ice-surface penetrating shortwave fraction + +!--------- parameters for NWP sea-ice model (we should agree on a single value)----- +!_cdm> +! The value of the salt-water freezing point is the same as in GME and COSMO (-1.7 dgr C). +! Note that a different value (Tf=-1.8 dgr C) is defined in "mo_physical_constants". +!_cdm< + REAL (wp), PARAMETER :: & + & tf_salt = 271.45_wp !< salt-water freezing point [K] + !< (note that it differs from Tf) + + ! Length of day in seconds, as integer and real + ! + INTEGER, PARAMETER :: idaylen=86400 ! [s] + REAL(wp), PARAMETER :: rdaylen=86400._wp ! [s] + +END MODULE mo_physical_constants diff --git a/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 new file mode 100644 index 00000000..64503ed7 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_radiation_parameters.F90 @@ -0,0 +1,16 @@ +MODULE mo_radiation_parameters + + USE mo_kind, ONLY: wp + USE mo_math_constants, ONLY: pi + +IMPLICIT NONE + + PRIVATE + + + PUBLIC :: iaero, decl_sun_cur + + INTEGER :: iaero = 1 !< aerosol model + REAL(wp) :: decl_sun_cur !< solar declination at current time step + +END MODULE mo_radiation_parameters diff --git a/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 b/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 new file mode 100644 index 00000000..78a2b671 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_read_netcdf77.F90 @@ -0,0 +1,1184 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +MODULE mo_read_netcdf77 + ! + ! Description: + ! + ! subroutines for reading (hyperslabs) of variables from netcdf files + ! order of dimensions in netcdf files and fortran variable can be different + ! + ! Authors: + ! + ! J.S. Rast, MPI, May 2005, change all netcdf routines to fortran 77 calls + ! D.O'Donnell, MPI-M, Feb 2008, added read 4-D variable + + USE mo_kind, ONLY: dp, JPRD + USE mo_exception, ONLY: finish + USE mo_netcdf, ONLY: nf_check, nf_max_var_dims, nf_open, nf__open, & + nf_close, chunksize, nf_nowrite, & + nf_inq_dimlen, nf_inq_dimid, nf_inq_varid, & + nf_get_vara_double, nf_inq_varndims, & + nf_inq_nvars, nf_inq_vardimid, nf_inq_varname, & + nf_get_var_double, & + nf_get_vara_real, nf_get_var_real + IMPLICIT NONE + + PRIVATE + + PUBLIC :: read_var_nf77_0d ! read 0D-variable + PUBLIC :: read_var_nf77_1d ! read 1D-variable + PUBLIC :: read_var_nf77_2d ! read 2D-variable + PUBLIC :: read_var_nf77_3d ! read 3D-variable + PUBLIC :: read_var_nf77_4d ! read 4D-variable + PUBLIC :: read_sumvar_nf77_2d ! read sum of hyperslab of 3D-variables (third dim. has to + ! have length 12, sum of all such 3D-variables is calc. + PUBLIC :: read_var_hs_nf77_0d + PUBLIC :: read_var_hs_nf77_1d ! read hyperslab of 2D-variable (second dim. is time) + PUBLIC :: read_var_hs_nf77_2d ! read hyperslab of 3D-variable (third dim. is time) + PUBLIC :: read_var_hs_nf77_3d ! read hyperslab of 4D-variable (fourth dim. is time) + PUBLIC :: search_var_nf77 ! searches for variable in file + PUBLIC :: read_diml_nf77 ! gives length of a dimension + +CONTAINS +!=============================================================================== + SUBROUTINE read_var_nf77_0d (file_name, varname, var, ierr) + + ! Description: + ! + ! read variable varname from file file_name + ! + ! Method: + ! + ! Open the netCDF file named file_name and read varname into var. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: var ! variable value on exit + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname + ! was sucessfully read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2010, original source + ! + ! Arguments: + ! + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: var + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! inquire variable and number of dimensions + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + IF(dp==JPRD)THEN + CALL nf_check(nf_get_var_double(zncid, znvar, var), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_var_real(zncid, znvar, var), fname=TRIM(file_name)) + ENDIF + ELSE + CALL finish('read_var_nf77_0d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid)) + END SUBROUTINE read_var_nf77_0d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_1d (file_name, dimname, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname). + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname). + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname ! name of dimension in the netCDF + ! file which shall appear as the dimension of varptr. + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:) ! variable values on exit, has to have + ! dimension exactly as the lengths of dimname in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, August 2004, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, znvar, zvardims + INTEGER :: zdims, zdimid + zdims = SIZE (varptr) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenght of dimension + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname), zdimid), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid, zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims) THEN + CALL finish('read_var_nf77_1d:', 'wrong length of dim in file '//TRIM(file_name)) + END IF +! inquire variable and number of dimensions + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims), fname=TRIM(file_name)) + IF (zvardims /= 1) THEN + CALL finish('read_var_nf77_1d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, (/1/), (/zdims/), varptr), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, (/1/), (/zdims/), varptr), fname=TRIM(file_name)) + ENDIF + ELSE + CALL finish('read_var_nf77_1d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_1d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_2d (file_name, dimname1, dimname2, var_name, varptr, ierr) + + ! Description: + ! + ! read in a variable from a netCDF file ******************(not yet tested)******************* + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the values of var_name + ! dimname1,dimname2 are the names of the dimension in the order as they will + ! be in varptr. The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: var_name ! name of the variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,...,dimname3 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 if it was not found in file file_name + ! + ! Authors: + ! + ! J.S. Rast, MPI, December 2002, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(dp), INTENT(out) :: varptr(:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, zvarid, zvardims, i, j + INTEGER, DIMENSION(2) :: zdims, zdimid, zorder, zcountvar + INTEGER, DIMENSION(NF_MAX_VAR_DIMS) :: zvardimids + REAL(dp), POINTER :: zin(:,:) + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_nf77_2d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_nf77_2d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + ierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, zvarid, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, zvarid, zvardimids), fname=TRIM(file_name)) + IF (zvardims /= 2) THEN + CALL finish('read_var_nf77_2d:', & + 'wrong number of dimension of variable '//TRIM(var_name)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)))) + zcountvar(1)=zdims(zorder(1)) + zcountvar(2)=zdims(zorder(2)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1/), zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, zvarid, (/1,1/), zcountvar, zin), fname=TRIM(file_name)) + ENDIF + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + IF (ALL(zorder == (/ 1, 2 /))) THEN + varptr = zin + ELSE + varptr = RESHAPE(zin, zdims, order=zorder) + ENDIF + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_nf77_2d:', & + 'variable '//TRIM(var_name)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_2d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_3d (file_name, dimname1, dimname2, dimname3, var_name, varptr, ierr) + + ! Description: + ! + ! read in a variable from a netCDF file + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the values of var_name + ! dimname1,...,dimname3 are the names of the dimension in the order as they will + ! be in varptr. The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of dimension in the netCDF + ! file which shall appear as the third dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: var_name ! name of the variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,...,dimname3 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 if it was not found in file file_name + ! + ! Authors: + ! + ! J.S. Rast, MPI, December 2002, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(dp), INTENT(out) :: varptr(:,:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, zvarid, zvardims, i, j + INTEGER, DIMENSION(3) :: zdims, zdimid, zorder, zcountvar + INTEGER, DIMENSION(NF_MAX_VAR_DIMS) :: zvardimids + REAL(dp), POINTER :: zin(:,:,:) + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = SIZE (varptr, DIM = 3) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('rad_var_nf77_3d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('rad_var_nf77_3d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(3)) THEN + CALL finish('rad_var_nf77_3d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF + ierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, zvarid, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, zvarid, zvardimids), fname=TRIM(file_name)) + IF (zvardims /= 3) THEN + CALL finish('rad_var_nf77_3d:', & + 'wrong number of dimension of variable '//TRIM(var_name)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)))) + zcountvar(1)=zdims(zorder(1)) + zcountvar(2)=zdims(zorder(2)) + zcountvar(3)=zdims(zorder(3)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, zvarid, (/1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ENDIF + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + IF (ALL(zorder == (/ 1, 2, 3 /))) THEN + varptr = zin + ELSE + varptr = RESHAPE(zin, zdims, order=zorder) + ENDIF + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_nf77_3d:', & + 'variable '//TRIM(var_name)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_3d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_nf77_4d (file_name, dimname1, dimname2, dimname3, dimname4, & + var_name, varptr, ierr) + + ! Description: + ! + ! read in a variable from a netCDF file + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the values of var_name + ! dimname1,...,dimname4 are the names of the dimension in the order as they will + ! be in varptr. The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of dimension in the netCDF + ! file which shall appear as the third dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname4 ! name of dimension in the netCDF + ! file which shall appear as the fourth dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: var_name ! name of the variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,...,dimname4 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 if it was not found in file file_name + ! + ! Authors: + ! + ! D. O'Donnell, MPI-M, Feb 2008, based on other read_var_... subroutines by J.S.Rast + ! + ! + ! Arguments: + ! + + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + CHARACTER (LEN = *), INTENT (in) :: dimname4 + CHARACTER (LEN = *), INTENT (in) :: var_name + REAL(dp), INTENT(out) :: varptr(:,:,:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, zdimlength, zvarid, zvardims, i, j + INTEGER, DIMENSION(4) :: zdims, zdimid, zorder, zcountvar + INTEGER, DIMENSION(NF_MAX_VAR_DIMS) :: zvardimids + REAL(dp), POINTER :: zin(:,:,:,:) + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = SIZE (varptr, DIM = 3) + zdims(4) = SIZE (varptr, DIM = 4) +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(3)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname4), zdimid(4)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(4), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(4)) THEN + CALL finish('read_var_nf77_4d:', 'wrong length of dim4 in initial file '//TRIM(file_name)) + END IF + ierr=nf_inq_varid(zncid, TRIM(var_name), zvarid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, zvarid, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, zvarid, zvardimids), fname=TRIM(file_name)) + IF (zvardims /= 4) THEN + CALL finish('read_var_nf77_4d:', & + 'wrong number of dimension of variable '//TRIM(var_name)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)), zdims(zorder(4)) )) + zcountvar(1)=zdims(zorder(1)) + zcountvar(2)=zdims(zorder(2)) + zcountvar(3)=zdims(zorder(3)) + zcountvar(4)=zdims(zorder(4)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, zvarid, (/1,1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, zvarid, (/1,1,1,1/), zcountvar, zin), fname=TRIM(file_name)) + ENDIF + CALL nf_check(nf_close(zncid), fname=TRIM(file_name)) + IF (ALL(zorder == (/ 1, 2, 3, 4 /))) THEN + varptr = zin + ELSE + varptr = RESHAPE(zin, zdims, order=zorder) + ENDIF + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_nf77_4d:', & + 'variable '//TRIM(var_name)//' not found in '//TRIM(file_name)) + END IF + END SUBROUTINE read_var_nf77_4d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_sumvar_nf77_2d (file_name, dimname1, dimname2, dimname3, imonth, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file the sum of all variables containing dimname1 + ! and dimname2 and a time dimension of size 12 + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr the sum of the + ! values of all variables containing the dimensions dimname1, dimname2 + ! which are the names of the dimensions in the order + ! as they will be in varptr. The order of the dimensions in the netCDF file is + ! irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. var_name can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of the time dimension + ! currently, there must be 12 values for the 12 months + ! INTEGER, INTENT (in) :: imonth ! number of month in the + ! year (range 1..12) + ! REAL(dp), INTENT(out) :: varptr(:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,dimname2 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable var_name is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2003, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + INTEGER, INTENT(in) :: imonth + REAL(dp), INTENT(out) :: varptr(:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims, i, j, ivar + INTEGER, DIMENSION(3) :: zdims, zdimid, zvardimids, zorder, zstart, zcount, & + zstartvar, zcountvar + LOGICAL, DIMENSION(3) :: zorderlog + REAL(dp), POINTER :: zin(:,:,:) +!,zinre(:,:,:) + character (len = 256) :: zvarname + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = 1 ! the dimension length is 12, but we only read one month +! define start vector of dimensions and number of indices in each dimension to be read + zstart(1) = 1 + zstart(2) = 1 + zstart(3) = imonth + zcount(1) = zdims(1) + zcount(2) = zdims(2) + zcount(3) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_sumvar_nf77_2d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_sumvar_nf77_2d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= 12) THEN + CALL finish('read_sumvar_nf77_2d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF +! determine number of variables in netCDF file + CALL nf_check(nf_inq_nvars(zncid, znvar),fname=TRIM(file_name)) + IF (znvar == 0) THEN + ierr=1 + RETURN + END IF + varptr = 0._dp + DO ivar=1,znvar + CALL nf_check(nf_inq_varndims(zncid,ivar,zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_varname(zncid,ivar,zvarname),fname=TRIM(file_name)) + IF (zvardims == 3) THEN + CALL nf_check(nf_inq_vardimid(zncid,ivar,zvardimids),fname=TRIM(file_name)) + zorderlog(:)=.false. + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + zorderlog(i)=.true. + EXIT + END IF + END DO + END DO + IF ( ANY (zorderlog .eqv. .false. )) THEN + CALL finish ('read_sumvar_nf77_2d:','dimensions of variable '//TRIM(zvarname)//' of file '// & + TRIM(file_name)//' unknown') + END IF + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)))) +! ALLOCATE(zinre(zdims(1),zdims(2),zdims(3))) + zstartvar(1)=zstart(zorder(1)) + zstartvar(2)=zstart(zorder(2)) + zstartvar(3)=zstart(zorder(3)) + zcountvar(1)=zcount(zorder(1)) + zcountvar(2)=zcount(zorder(2)) + zcountvar(3)=zcount(zorder(3)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, ivar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, ivar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ENDIF +! zinre=RESHAPE(zin, zdims, order=zorder) + varptr = varptr + RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:2)) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + END IF + END DO + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_sumvar_nf77_2d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_0d (file_name, dimname, & + idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname. + ! dimname2 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname2(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname. + ! The routine is intended to be run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension2 (<= length of unlimited (time) dimension) + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr ! variable value on exit + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, March 2010, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims + INTEGER :: zdimid + INTEGER, DIMENSION(1) :: zstart, zcount, zvardimid + REAL(dp), POINTER :: zin(:) + + character (len = 256) :: zerrstrg + +! define dimension length vector +! zdims(1) = SIZE (varptr, DIM = 1) +! zdims(2) = 1 ! the dimension length is arbitrary, but we only read one +! month define start vector of dimensions and number of indices in each +! dimension to be read + zstart(1) = idx + zcount(1) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenght of time dimension + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname), zdimid),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid, zdimlength),fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_0d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimid),fname=TRIM(file_name)) + IF (zvardims /= 1) THEN + CALL finish('read_var_hs_nf77_0d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + ALLOCATE(zin(1)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ENDIF + varptr = zin(1) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_1d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_0d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_1d (file_name, dimname1, dimname2, & + idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname1). + ! dimname2 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname2(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname1). + ! The routine is intended to be run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension2 (<= length of unlimited (time) dimension) + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:) ! variable values on exit, has to have + ! dimension exactly as the lengths of dimname1 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, August 2004, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims + INTEGER, DIMENSION(2) :: zdims, zdimid, zvardimids, & + zstart, zcount + REAL(dp), POINTER :: zin(:,:) + + character (len = 256) :: zerrstrg + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = 1 ! the dimension length is arbitrary, but we only read one +! month define start vector of dimensions and number of indices in each +! dimension to be read + zstart(1) = 1 + zstart(2) = idx + zcount(1) = zdims(1) + zcount(2) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_hs_nf77_1d:', 'wrong length of dim1 in file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength),fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_1d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimids),fname=TRIM(file_name)) + IF (zvardims /= 2) THEN + CALL finish('read_var_hs_nf77_1d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + ALLOCATE(zin(zdims(1), zdims(2))) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstart, zcount, zin),fname=TRIM(file_name)) + ENDIF + varptr = zin(:,1) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_1d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_1d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_2d (file_name, dimname1, dimname2, dimname3, idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname1, dimname2). + ! dimname3 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname3(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname1, dimname2). + ! The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. varname can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. varname can + ! have this dimension at any of the three possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension3 + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,dimname2 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2003, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims, i, j + INTEGER, DIMENSION(3) :: zdims, zdimid, zvardimids, zorder, zstart, zcount, & + zstartvar, zcountvar + REAL(dp), POINTER :: zin(:,:,:) +!,zinre(:,:,:) + character (len = 256) :: zerrstrg + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = 1 ! the dimension length normally is arbitrary, but we only read one month +! define start vector of dimensions and number of indices in each dimension to be read + zstart(1) = 1 + zstart(2) = 1 + zstart(3) = idx + zcount(1) = zdims(1) + zcount(2) = zdims(2) + zcount(3) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid), fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_hs_nf77_2d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength), fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_hs_nf77_2d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)), fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength), fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_2d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims), fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimids),fname=TRIM(file_name)) + IF (zvardims /= 3) THEN + CALL finish('read_var_hs_nf77_2d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)))) + zstartvar(1)=zstart(zorder(1)) + zstartvar(2)=zstart(zorder(2)) + zstartvar(3)=zstart(zorder(3)) + zcountvar(1)=zcount(zorder(1)) + zcountvar(2)=zcount(zorder(2)) + zcountvar(3)=zcount(zorder(3)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin), fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstartvar, zcountvar, zin), fname=TRIM(file_name)) + ENDIF + varptr = RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:2)) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_2d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_2d +!=============================================================================== +!=============================================================================== + SUBROUTINE read_var_hs_nf77_3d (file_name, dimname1, dimname2, dimname3, dimname4, & + idx, varname, varptr, ierr) + + ! Description: + ! + ! read in from a netCDF file variable varname(dimname1, dimname2, dimname3). + ! dimname4 has to be the unlimited time dimension of arbitrary length. + ! The hyperslab dimname4(idx) will be read. + ! + ! Method: + ! + ! Open the netCDF file named file_name and read in varptr varname(dimname1, dimname2, dimname3). + ! The order of the dimensions in the netCDF file is irrelevant. + ! The routine is to be intended to run on the I/O-processor + ! + ! Parameter list: + ! + ! CHARACTER (LEN = *), INTENT (in) :: file_name ! file name of the netCDF file + ! from which variable should be read + ! CHARACTER (LEN = *), INTENT (in) :: dimname1 ! name of dimension in the netCDF + ! file which shall appear as the first dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname2 ! name of dimension in the netCDF + ! file which shall appear as the second dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname3 ! name of dimension in the netCDF + ! file which shall appear as the third dimension of varptr. varname can + ! have this dimension at any of the four possible positions + ! CHARACTER (LEN = *), INTENT (in) :: dimname4 ! name of the unlimited (time) dimension + ! can have an arbitrary length, but idx <= length of this dimension constrained + ! INTEGER, INTENT (in) :: idx ! index number of unlimited (time) + ! dimension4 (<= length of unlimited (time) dimension) + ! CHARACTER (LEN = *), INTENT (in) :: varname ! name of variable to be read + ! REAL(dp), INTENT(out) :: varptr(:,:,:) ! variable values on exit, has to + ! dimension exactly as the lengths of dimname1,dimname2,dimname3 in netCDF file + ! INTEGER, INTENT(out) :: ierr ! ierr is 0 if variable varname is successfully + ! read, 1 otherwise + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2003, original source + ! + ! Arguments: + ! + CHARACTER (LEN = *), INTENT (in) :: file_name + CHARACTER (LEN = *), INTENT (in) :: dimname1 + CHARACTER (LEN = *), INTENT (in) :: dimname2 + CHARACTER (LEN = *), INTENT (in) :: dimname3 + CHARACTER (LEN = *), INTENT (in) :: dimname4 + INTEGER, INTENT(in) :: idx + CHARACTER (LEN = *), INTENT (in) :: varname + REAL(dp), INTENT(out) :: varptr(:,:,:) + INTEGER, INTENT (out) :: ierr + ! + ! Local variables: + ! + INTEGER :: zncid, znvar, zdimlength, zvardims, i, j + INTEGER, DIMENSION(4) :: zdims, zdimid, zvardimids, zorder, zstart, zcount, & + zstartvar, zcountvar + REAL(dp), POINTER :: zin(:,:,:,:) + + + character (len = 256) :: zerrstrg + +! define dimension length vector + zdims(1) = SIZE (varptr, DIM = 1) + zdims(2) = SIZE (varptr, DIM = 2) + zdims(3) = SIZE (varptr, DIM = 3) + zdims(4) = 1 ! the dimension length is arbitrary, but we only read one +! month define start vector of dimensions and number of indices in each +! dimension to be read + zstart(1) = 1 + zstart(2) = 1 + zstart(3) = 1 + + zstart(4) = idx + zcount(1) = zdims(1) + zcount(2) = zdims(2) + zcount(3) = zdims(3) + zcount(4) = 1 +! open netCDF file + CALL nf_check(nf__open(TRIM(file_name), nf_nowrite, chunksize, zncid),fname=TRIM(file_name)) +! verify lenghts of dimensions + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname1), zdimid(1)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(1), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(1)) THEN + CALL finish('read_var_hs_nf77_3d:', 'wrong length of dim1 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname2), zdimid(2)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(2), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(2)) THEN + CALL finish('read_var_hs_nf77_3d:', 'wrong length of dim2 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname3), zdimid(3)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(3), zdimlength),fname=TRIM(file_name)) + IF (zdimlength /= zdims(3)) THEN + CALL finish('read_var_hs_nf77_3d:', 'wrong length of dim3 in initial file '//TRIM(file_name)) + END IF + CALL nf_check(nf_inq_dimid(zncid, TRIM(dimname4), zdimid(4)),fname=TRIM(file_name)) + CALL nf_check(nf_inq_dimlen(zncid, zdimid(4), zdimlength),fname=TRIM(file_name)) + IF (zdimlength < idx) THEN + WRITE (zerrstrg,*) idx + CALL finish('read_var_hs_nf77_3d:', 'actual length of unlimited dimension is less than index ' & + //TRIM(zerrstrg)) + END IF +! inquire variable and number of dimension including the unlimited (time) dimension + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_varndims(zncid, znvar, zvardims),fname=TRIM(file_name)) + CALL nf_check(nf_inq_vardimid(zncid, znvar, zvardimids),fname=TRIM(file_name)) + IF (zvardims /= 4) THEN + CALL finish('read_var_hs_nf77_3d:', & + 'wrong number of dimension of variable '//TRIM(varname)) + END IF + DO i = 1, zvardims + DO j = 1, zvardims + IF (zvardimids(j) == zdimid(i)) THEN + zorder(i)=j + EXIT + END IF + END DO + END DO + ALLOCATE(zin(zdims(zorder(1)), zdims(zorder(2)), zdims(zorder(3)), zdims(zorder(4)))) + zstartvar(1)=zstart(zorder(1)) + zstartvar(2)=zstart(zorder(2)) + zstartvar(3)=zstart(zorder(3)) + zstartvar(4)=zstart(zorder(4)) + zcountvar(1)=zcount(zorder(1)) + zcountvar(2)=zcount(zorder(2)) + zcountvar(3)=zcount(zorder(3)) + zcountvar(4)=zcount(zorder(4)) + IF(dp==JPRD)THEN + CALL nf_check(nf_get_vara_double(zncid, znvar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ELSE + CALL nf_check(nf_get_vara_real(zncid, znvar, zstartvar, zcountvar, zin),fname=TRIM(file_name)) + ENDIF + varptr = RESHAPE(RESHAPE(zin, zdims, order=zorder),zdims(1:3)) + IF (ASSOCIATED(zin)) DEALLOCATE(zin) + ELSE + CALL finish('read_var_hs_nf77_3d:', & + 'variable '//TRIM(varname)//' not found in '//TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid),fname=TRIM(file_name)) + END SUBROUTINE read_var_hs_nf77_3d +!=============================================================================== +!============================================================================================= + LOGICAL FUNCTION search_var_nf77(file_name, varname) + + ! Description: + ! + ! search for the variable varname in file file_name + ! + ! LOGICAL :: search_var_nf77 ! if varname is in file_name, then + ! search_var_nf77=.true., else it is .false. + ! CHARACTER (LEN = *) :: file_name ! file name of the netCDF file + ! in which the variable varname should be searched + ! CHARACTER (LEN = *) :: varname ! name of variable you are searching + ! for + ! + ! Authors: + ! + ! J.S. Rast, MPI, July 2006, original source + ! + + CHARACTER (LEN = *) :: file_name + CHARACTER (LEN = *) :: varname + + ! local variables + INTEGER :: zncid, znvar, ierr + + search_var_nf77=.false. +! open netCDF file + CALL nf_check(nf_open(TRIM(file_name), nf_nowrite, zncid),fname=TRIM(file_name)) + ierr=nf_inq_varid(zncid, TRIM(varname), znvar) + IF (ierr == 0) THEN + search_var_nf77=.true. + END IF + END FUNCTION search_var_nf77 +!=============================================================================== +!=============================================================================== + INTEGER FUNCTION read_diml_nf77(file_name, dimname) + + ! Description: + ! + ! gives length of dimension dimname in file file_name + ! + ! INTEGER :: read_diml_nf77 ! length of dimension dimname, + ! if dimname is not present in file_name, read_diml_nf77=-1 + ! CHARACTER (LEN = *) :: file_name ! file name of the netCDF file + ! containing dimension dimname + ! CHARACTER (LEN = *) :: dimname ! name of dimension the length + ! of which is searched + ! + ! Authors: + ! + ! J.S. Rast, MPI, January 2010, original source + + CHARACTER (LEN = *) :: file_name + CHARACTER (LEN = *) :: dimname + + ! local variables + INTEGER :: zncid, zdimid, ierr + read_diml_nf77=-1 + CALL nf_check(nf_open(TRIM(file_name), nf_nowrite, zncid),fname=TRIM(file_name)) + ierr=nf_inq_dimid(zncid, TRIM(dimname), zdimid) + IF (ierr == 0) THEN + CALL nf_check(nf_inq_dimlen(zncid, zdimid, read_diml_nf77),fname=TRIM(file_name)) + END IF + CALL nf_check(nf_close(zncid)) + END FUNCTION read_diml_nf77 +!=============================================================================== + END MODULE mo_read_netcdf77 diff --git a/ifs-source/arpifs/m7/module/mo_species.F90 b/ifs-source/arpifs/m7/module/mo_species.F90 new file mode 100644 index 00000000..87689b42 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_species.F90 @@ -0,0 +1,827 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! mo_species assigns identities and properties to species. +!! Former ECHAM versions had physical and chemical information stored with tracers which +!! meant duplication of fields when more than one tracer was defined for a given species. +!! Examples are aerosol modes or tagged gas-phase tracers. +!! With mo_species, these species characteristics are defined once and the tracerinfo +!! is trimmed down to the essential quantities that vary with tracer. +!! Some duplication is unavoidable in order to keep flexibility. +!! +!! @author +!!
    +!!
  1. Declan O'Donnell (MPI-Met) +!!
  2. M. Schultz (FZ-Juelich) +!!
+!! +!! $Id: 1423$ +!! +!! @par Revision History +!!
    +!!
  1. Declan O'Donnell (MPI-Met) - original version - (2008-xx-xx) +!!
  2. M. Schultz (FZ-Juelich) - generalisation and only one species list for everything - (2009-06-xx) +!!
  3. K. Zhang (MPI-Met) - merge Declan's and Martin's version - (2009-08-11) +!!
  4. M. Schultz (FZ-Juelich) - further cleanup (2009-09-21) +!!
+!! +!! @par This module is used by +!! to_be_added +!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +!! ### nphase is additive and lumps all phases of a chemical species +!! ### into one definition of a species. +!! ### nphase: 1 = gas, 2 = aerosol, (4 = liquid) (3 = gas + aerosol, etc.) +!! ### must replace IF (speclist()%nphase == GAS) by IF (IAND(speclist()%nphase,GAS)) +!! ### must think about diagnostics: BYSPECIES = BYSPECIES_AND_PHASE ?? + + +MODULE mo_species + + !--- inherited types, data and functions + + USE mo_kind, ONLY: dp + USE mo_tracdef, ONLY: GAS, AEROSOL, GAS_OR_AEROSOL, jptrac + USE mo_exception, ONLY: message, finish, em_error, em_warn, em_none + + + IMPLICIT NONE + + PRIVATE + + !--- public member functions + + PUBLIC :: init_splist + PUBLIC :: new_species + PUBLIC :: query_species + PUBLIC :: get_nspec ! return number of species defined, optionally keyed by submodel name + PUBLIC :: printspec + + !--- Parameters and integer declarations + + INTEGER, PARAMETER, PUBLIC :: nmaxspec = jptrac ! maximum number of species in the model + INTEGER, PARAMETER, PUBLIC :: nmaxtrspec = 42 ! maximum number of tracers per species + + ! Tracer types + + INTEGER, PARAMETER, PUBLIC :: itrnone = 0 ! No ECHAM tracer + INTEGER, PARAMETER, PUBLIC :: itrpresc = 1 ! Prescribed tracer, read from file + INTEGER, PARAMETER, PUBLIC :: itrdiag = 2 ! Diagnostic tracer, no transport + INTEGER, PARAMETER, PUBLIC :: itrprog = 3 ! Prognostic tracer, transport by ECHAM + + ! Number of species + INTEGER, PUBLIC :: nspec ! number of all species defined + INTEGER, PUBLIC :: naerospec ! number of species in aerosol phase + + ! Species-Tracer relationship + + INTEGER, PUBLIC :: spec_idt(nmaxspec, nmaxtrspec) + INTEGER, PUBLIC :: spec_ntrac(nmaxspec) + + ! Basic 'species' type common for gas and aerosol. + + TYPE, PUBLIC :: t_species + + ! --- basic information --- + CHARACTER(LEN=64) :: longname ! Name of the species + CHARACTER(LEN=32) :: shortname ! Shorthand name + CHARACTER(LEN=15) :: units ! Units for 'outside world', usually kg kg-1 + REAL(dp) :: moleweight ! Molecular weight [g mol-1] + ! --- transport --- + INTEGER :: itrtype ! Tracer transport mechanism + ! --- physical and chemical parameters --- + INTEGER :: nphase ! phase of specie + ! && gas && + REAL(dp) :: tdecay ! Exponential decay rate (simple tracers) + ! e-folding time in seconds + ! will always be applied if /= 0 !! + REAL(dp) :: henry(2) ! Henry's law coefficient and activation energy + REAL(dp) :: dryreac ! Dry reactivity if species is subject to dry deposition + ! && aerosol && + REAL(dp) :: density ! Density of solid or liquid phase [g cm-3] + LOGICAL :: lwatsol ! Species dissolves in water + ! NBB THIS IS NOT THE SAME AS M7 'soluble', which means + ! that an M7 mode can take up water. This flag means + ! that the species can physically dissolve in water. + ! Should be set = TRUE for weakly soluble substances + ! and FALSE only for e.g. dust, black carbon + LOGICAL :: lelectrolyte ! Species dissociates into ions in aqueous solution + INTEGER :: nion ! Number of ions if electrolyte + REAL(dp) :: osm ! Osmotic coefficient + REAL(dp) :: kappa ! Kappa-Koehler coefficient for the species. + ! See: Petters and Kreidenweis + ! ACP 7, 1961-1971, 2007 + ! --- process instructions --- + LOGICAL :: lburden ! Calculate column burden for this species + LOGICAL :: lrad ! Corresponding tracer should interact with radiation + LOGICAL :: lemis ! Corresponding tracer should be emitted + LOGICAL :: ldrydep ! Corresponding tracer should be dry deposited + LOGICAL :: lwetdep ! Corresponding tracer should be scavenged + INTEGER :: nbudg ! Budget calculations + INTEGER :: iaerorad ! Index to aerosol radiation table + ! --- accounting --- + LOGICAL :: ltrreq ! Tracer request + INTEGER :: idt ! Tracer index for gas-phase tracer + INTEGER, ALLOCATABLE :: iaerocomp(:) ! Index to aerocomp array. Dimension nmod. + ! --- in which submodel --- + CHARACTER(LEN=15) :: tsubmname ! the submodel that the tracer belongs to + END TYPE t_species + + ! derived variables + + TYPE(t_species), TARGET, PUBLIC :: speclist(nmaxspec) ! aerosol and gas-phase species lists + ! (analogy to trlist in mo_tracdef) + INTEGER, PUBLIC :: aero_idx(nmaxspec) ! indices of aerosol species + + CONTAINS + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Set defaults in the species lists +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!! initialize before calling init_trlist +!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE init_splist + + USE mo_kind, ONLY: dp + USE mo_physical_constants, ONLY: amd ! dry air mass + + nspec = 0 + naerospec = 0 + + speclist(:)% longname = '' + speclist(:)% shortname = '' + speclist(:)% units = '' + speclist(:)% moleweight = amd + speclist(:)% idt = -1 + speclist(:)% tdecay = 0._dp + speclist(:)% itrtype = itrprog + speclist(:)% nbudg = 0 + speclist(:)% lburden = .TRUE. + speclist(:)% henry(1) = 0._dp + speclist(:)% henry(2) = 0._dp + speclist(:)% dryreac = 0._dp + speclist(:)% density = 0._dp + speclist(:)% lwatsol = .FALSE. + speclist(:)% lelectrolyte = .FALSE. + speclist(:)% nion = 0 + speclist(:)% osm = 0._dp + speclist(:)% kappa = 0._dp + speclist(:)% lrad = .FALSE. + speclist(:)% lemis = .FALSE. + speclist(:)% ldrydep = .FALSE. + speclist(:)% lwetdep = .FALSE. + speclist(:)% iaerorad = 0 + speclist(:)% ltrreq = .FALSE. + speclist(:)% tsubmname = '' + + aero_idx(:) = 0 + + spec_idt(:,:) = -1 + spec_ntrac(:) = 0 + + END SUBROUTINE init_splist + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! new_species defines the physical and chemical properties of a chemical species. +!! Normally, each species will also be defined as tracer (new_tracer routine in mo_tracer). +!! The same species can be used in the definition of various tracers (for example +!! different aerosol modes) +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!!
    +!!
  1. ham_define_tracers +!!
  2. moz_define_tracers +!!
+!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE new_species(nphase, & + longname, & + shortname, & + units, & + mw, & + tsubmname, & + itrtype, & + tdecay, &!gas + henry, & + dryreac, & + density, &!aerosol + lwatsol, & + lelectrolyte, & + nion, & + osm, & + kappa, & + lemis, & + ldrydep, & + lwetdep, & + nbudg, & + lrad, & + iaerorad, & + lburden, & + ltrreq, & + idx) + + + + USE mo_exception, ONLY: message, message_text + + + INTEGER, INTENT(IN) :: nphase ! GAS or AEROSOL + CHARACTER(LEN=*), INTENT(IN) :: longname ! full name (e.g. for diagnostics) + CHARACTER(LEN=*), INTENT(IN) :: shortname ! short name (e.g. variable name in output files) + CHARACTER(LEN=*), INTENT(IN) :: units ! concentration units, eg 'kg kg-1', 'VMR' + REAL(dp), INTENT(IN) :: mw ! Molecular weight (required for conversions) + CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: tsubmname ! name of module defining the species + INTEGER, INTENT(IN), OPTIONAL :: itrtype ! apply tracer transport? + INTEGER, INTENT(IN), OPTIONAL :: nbudg ! Calculate species budget + REAL(dp), INTENT(IN), OPTIONAL :: tdecay ! e-folding time in seconds + ! will always be applied if /= 0 !! + REAL(dp), INTENT(IN), OPTIONAL :: henry(2) ! Henry coefficient + REAL(dp), INTENT(IN), OPTIONAL :: dryreac ! dry reactivity coefficient + REAL(dp), INTENT(IN), OPTIONAL :: density ! (aerosol) density + LOGICAL, INTENT(IN), OPTIONAL :: lwatsol ! flag for water soluble (SOA scheme) + LOGICAL, INTENT(IN), OPTIONAL :: lelectrolyte ! flag for dissociation in water + INTEGER, INTENT(IN), OPTIONAL :: nion ! number of ions formed + REAL(dp), INTENT(IN), OPTIONAL :: osm ! osmotic coefficient + REAL(dp), INTENT(IN), OPTIONAL :: kappa ! Kappa-Koehler coefficient + LOGICAL, INTENT(IN), OPTIONAL :: lemis ! flag for emission + LOGICAL, INTENT(IN), OPTIONAL :: ldrydep ! flag for dry deposition + LOGICAL, INTENT(IN), OPTIONAL :: lwetdep ! flag for wet deposition + LOGICAL, INTENT(IN), OPTIONAL :: lrad ! flag for radiation interaction + INTEGER, INTENT(IN), OPTIONAL :: iaerorad ! index to aerosol radiation table + LOGICAL, INTENT(IN), OPTIONAL :: lburden ! Calculate column burden + LOGICAL, INTENT(IN), OPTIONAL :: ltrreq ! if or not request tracer + INTEGER, INTENT(OUT),OPTIONAL :: idx ! index to species list + + + !--- Local data + INTEGER :: i + CHARACTER(len=16) :: cphasenam + + !--- executable procedure + ! Default return value + IF (PRESENT(idx)) idx = 0 + + ! Check validity of nphase + SELECT CASE(nphase) + CASE(GAS) + cphasenam = 'Gas-phase' + CASE(AEROSOL) + cphasenam = 'Aerosol' + CASE(GAS_OR_AEROSOL) + cphasenam = 'Gas or Aerosol' + CASE DEFAULT + CALL message('new_species', 'Invalid value for nphase. Only GAS or AEROSOL allowed.', level=em_error) + RETURN + END SELECT + + ! Check if a species of this name has already been defined + CALL query_species(longname=longname, nphase=nphase, index=i) +!!mgs!! write(0,*) ' new_species: query longname='//longname,' nphase=',nphase,', index=',i + + IF (i > 0) THEN + CALL message('new_species', TRIM(cphasenam)//' species '//TRIM(longname)//' already defined.', & + level=em_warn) + CALL message('', 'Will use existing properties.', level=em_none) + IF (PRESENT(idx)) idx = i ! return index + RETURN + END IF + +!!bug fix mgs: added shortname= ! 2010-02-01 + CALL query_species(shortname=shortname, nphase=nphase, index=i) +!!mgs!! write(0,*) ' new_species: query shortname='//shortname,' nphase=',nphase,', index=',i + + IF (i > 0) THEN + CALL message('new_species', TRIM(cphasenam)//' species '//TRIM(shortname)//' already defined.', & + level=em_warn) + CALL message('', 'Will use existing properties.', level=em_none) + IF (PRESENT(idx)) idx = i ! return index + RETURN + END IF + + ! Check if table is full + IF (nspec >= nmaxspec) THEN + WRITE (message_text,*) 'Species list full. nmaxspec = ',nmaxspec + CALL finish('new_species', message_text) + END IF + + ! Increment number of species instances and store data + nspec = nspec + 1 + i = nspec + + ! set species properties + speclist(i)% nphase = nphase + speclist(i)% longname = longname + speclist(i)% shortname = shortname + speclist(i)% units = units + speclist(i)% moleweight = mw + IF (PRESENT(tsubmname)) speclist(i)% tsubmname = tsubmname + IF (PRESENT(tdecay)) speclist(i)% tdecay = tdecay + IF (PRESENT(nbudg)) speclist(i)% nbudg = nbudg + IF (PRESENT(lburden)) speclist(i)% lburden = lburden + IF (PRESENT(lrad)) speclist(i)% lrad = lrad + IF (PRESENT(lemis)) speclist(i)% lemis = lemis + IF (PRESENT(ldrydep)) speclist(i)% ldrydep = ldrydep + IF (PRESENT(lwetdep)) speclist(i)% lwetdep = lwetdep + IF (PRESENT(ltrreq)) speclist(i)% ltrreq = ltrreq + IF (PRESENT(itrtype)) speclist(i)% itrtype = itrtype + +!!mgs!! write(0,*) '### new_species: defining new species: index=',i,', shortname=',shortname,', tsubmname=',tsubmname + ! for gas only + IF (PRESENT(dryreac)) speclist(i)% dryreac = dryreac ! ## rename to drygamma ??? + IF (PRESENT(henry)) speclist(i)% henry = henry + ! for aerosol only + IF (PRESENT(density)) speclist(i)% density = density + IF (PRESENT(lwatsol)) speclist(i)% lwatsol = lwatsol + IF (PRESENT(lelectrolyte)) speclist(i)% lelectrolyte = lelectrolyte + IF (PRESENT(nion)) speclist(i)% nion = nion + IF (PRESENT(osm)) speclist(i)% osm = osm + IF (PRESENT(kappa)) speclist(i)% kappa = kappa + IF (PRESENT(iaerorad)) speclist(i)% iaerorad = iaerorad + + ! capture species definition errors + IF (IAND(nphase, AEROSOL) == 0) THEN + + ! capture errors + IF (PRESENT(density)) CALL message('new_species', & + 'Property "density" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(lwatsol)) CALL message('new_species', & + 'Property "lwatsol" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(lelectrolyte)) CALL message('new_species', & + 'Property "lelectrolyte" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(nion)) CALL message('new_species', & + 'Property "nion" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(osm)) CALL message('new_species', & + 'Property "osm" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(kappa)) CALL message('new_species', & + 'Property "kappa" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(iaerorad)) CALL message('new_species', & + 'Property "iaerorad" undefined for gas-phase species '//TRIM(shortname), & + level=em_error) + + ELSE IF (IAND(nphase, GAS) == 0) THEN + + ! capture errors + IF (PRESENT(dryreac)) CALL message('new_species', & + 'Property "dryreac" undefined for aerosol species '//TRIM(shortname), & + level=em_error) + IF (PRESENT(henry)) CALL message('new_species', & + 'Property "henry" undefined for aerosol species '//TRIM(shortname), & + level=em_error) + + END IF + + ! test validity of aerosol species + IF (IAND(nphase, AEROSOL) /= 0) THEN + + CALL check_aerosol_species(i) + ! add aerosol species to aero_idx list + naerospec = naerospec + 1 + aero_idx(naerospec) = i + + END IF + +! CALL message('new_species', speclist(i)%shortname) + + ! Note: no warning if phase is neither gas or aerosol. Nothing will happen: quiet ignorance... + ! idx will be 0 -- this can be used as indicator for an error + + IF (PRESENT(idx)) idx = i ! return index + + + END SUBROUTINE new_species + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Check the metadata for consistency +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!!
    +!!
  1. new_species +!!
+!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE check_aerosol_species (idx) + + + INTEGER, INTENT(IN) :: idx ! species index + + ! lelectrolyte & nion + + IF (speclist(idx)% lelectrolyte) THEN + IF (speclist(idx)% nion < 2) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': lelectrolyte=T requires nion > 1.', level=em_error) + END IF + ELSE ! electrolyte=F so nion cannot be accepted unless 0 or 1 + IF (speclist(idx)% nion > 1) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': nion > 1 requires lelectrolyte=T.', level=em_error) + END IF + END IF + + ! kappa & lwatsol + + IF (ABS(speclist(idx)% kappa) > 1.e-20_dp) THEN + IF (.NOT. speclist(idx)% lwatsol) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': kappa /= 0 requires lwatsol=T.', level=em_error) + END IF + END IF + + ! lrad & iaerorad + + IF (speclist(idx)% lrad) THEN + +!SF Note: I think the following is a pretty much reasonable requirement, even if outside of a +! HAM-related context. I therefore think this should stay as is. + IF (speclist(idx)% iaerorad < 0) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': iradkey requires >= 0', level=em_error) + END IF + +!SF Note: in the process of fixing #360, I wanted to clean up the following, but the simple fix +! introduces a circular dependency (importing naeroradspec from mo_ham_rad_data, enclosed into +! #ifdef HAMMOZ / #endif statements). +! --> I leave that off for the moment... + IF (speclist(idx)% iaerorad > 7) THEN + CALL message('new_species', TRIM(speclist(idx)% shortname) // & + ': iradkey requires <= 7', level=em_error) + END IF + + END IF + + END SUBROUTINE check_aerosol_species + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! get properties of a specific species identified by +!! either its longname or shortname. Query by index is ambivalent due to split +!! in gas-phase and aerosol species lists. If you want to know species properties +!! for a given index in speclist, you can get the result directly as +!! speclist(idx)% . +!! This routine will return ierr/=0 if the species is undefined. +!! +!! @author see module info +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see module info +!! +!! @par This subroutine is called by +!!
    +!!
  1. new_species +!!
+!! +!! @par Externals: +!!
    +!!
  1. none +!!
+!! +!! @par Notes +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + SUBROUTINE query_species (longname, shortname, & ! search criteria + index, & ! query results ... + nphase, units, & + mw, & + tsubmname, & + tdecay, & + henry, dryreac, & + density, & + lwatsol, lelectrolyte, & + nion, osm, kappa, & + lrad, & + lemis, ldrydep, lwetdep, & + iaerorad, & + itrtype, & + idt, & + ierr) + + + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: longname ! name of species + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: shortname ! subname of species + INTEGER ,INTENT(in) ,OPTIONAL :: nphase ! GAS or AEROSOL + + INTEGER ,INTENT(out) ,OPTIONAL :: index ! index of species as query result + CHARACTER(len=*) ,INTENT(out) ,OPTIONAL :: units ! physical units of tracer + REAL(dp) ,INTENT(out) ,OPTIONAL :: mw ! molecular weight + CHARACTER(len=*) ,INTENT(out) ,OPTIONAL :: tsubmname ! tsubmname + REAL(dp) ,INTENT(out) ,OPTIONAL :: tdecay ! e-folding time in seconds + REAL(dp) ,INTENT(out) ,OPTIONAL :: henry(2) ! Henry coefficient + REAL(dp) ,INTENT(out) ,OPTIONAL :: dryreac ! dry reactivity coefficient + REAL(dp) ,INTENT(out) ,OPTIONAL :: density ! (aerosol) density + LOGICAL ,INTENT(out) ,OPTIONAL :: lwatsol ! flag for water soluble (SOA scheme) + LOGICAL ,INTENT(out) ,OPTIONAL :: lelectrolyte ! flag for dissociation in water + INTEGER ,INTENT(out) ,OPTIONAL :: nion ! number of ions formed + REAL(dp) ,INTENT(out) ,OPTIONAL :: osm ! osmotic coefficient + REAL(dp) ,INTENT(out) ,OPTIONAL :: kappa ! Kappa-Koehler coefficient + LOGICAL ,INTENT(out) ,OPTIONAL :: lrad ! flag for radiation interaction + LOGICAL ,INTENT(out) ,OPTIONAL :: lemis ! flag for emissions + LOGICAL ,INTENT(out) ,OPTIONAL :: ldrydep ! flag for dry deposition + LOGICAL ,INTENT(out) ,OPTIONAL :: lwetdep ! flag for wet deposition + INTEGER ,INTENT(out) ,OPTIONAL :: iaerorad ! index to aerosol radiation table + INTEGER ,INTENT(out) ,OPTIONAL :: itrtype ! tracer type (transport characteristics) + INTEGER ,INTENT(out) ,OPTIONAL :: idt ! associated tracer index + INTEGER ,INTENT(out) ,OPTIONAL :: ierr ! error return value + + ! --- local variables + INTEGER :: i + INTEGER :: ispec ! local species id + INTEGER :: iphase + INTEGER, PARAMETER :: OK = 0 + INTEGER, PARAMETER :: UNDEF = 1 + + ! -- set defaults + ispec = 0 + IF (PRESENT(ierr)) ierr = UNDEF ! default error: species not found + IF (PRESENT(index)) index = 0 + IF (PRESENT(units)) units = '' + IF (PRESENT(mw)) mw = 0._dp + IF (PRESENT(tsubmname)) tsubmname = '' + IF (PRESENT(tdecay)) tdecay = 0._dp + IF (PRESENT(henry)) henry(:) = 0._dp + IF (PRESENT(dryreac)) dryreac = 0._dp + IF (PRESENT(density)) density = 0._dp + IF (PRESENT(lwatsol)) lwatsol = .FALSE. + IF (PRESENT(lelectrolyte)) lelectrolyte = .FALSE. + IF (PRESENT(nion)) nion = 0 + IF (PRESENT(osm)) osm = 0._dp + IF (PRESENT(kappa)) kappa = 0._dp + IF (PRESENT(lrad)) lrad = .FALSE. + IF (PRESENT(lemis)) lemis = .FALSE. + IF (PRESENT(ldrydep)) ldrydep = .FALSE. + IF (PRESENT(lwetdep)) lwetdep = .FALSE. + IF (PRESENT(itrtype)) itrtype = 0 + IF (PRESENT(idt)) idt = 0 + IF (PRESENT(iaerorad)) iaerorad = 0 + + ! -- test if phase if given + iphase = -1 ! undefined + IF (PRESENT(nphase)) THEN + iphase = nphase + IF (IAND(iphase, GAS+AEROSOL) == 0) CALL message('query_species', & + 'Invalid value for nphase!', level=em_error) + END IF + + ! -- search for species: always search for longname first + IF (PRESENT(longname)) THEN +!!mgs!! IF (iphase == 1 .OR. iphase == 2 .OR. iphase == 4) THEN +!!mgs!! DO i=1, nspec +!!mgs!! IF (TRIM(speclist(i)%longname) == TRIM(longname) .AND. IAND(speclist(i)%nphase,iphase) /= 0) THEN +!!mgs!! ispec = i +!!mgs!! EXIT +!!mgs!! END IF +!!mgs!! END DO +!!mgs!! ELSE + DO i=1, nspec + IF (TRIM(speclist(i)%longname) == TRIM(longname)) THEN + ispec = i + EXIT + END IF + END DO +!!mgs!! END IF + END IF + + ! -- if no species found or longname not given look for shortname + IF (ispec == 0 .AND. PRESENT(shortname)) THEN +!!mgs!! IF (iphase == 1 .OR. iphase == 2 .OR. iphase == 4) THEN +!!mgs!! DO i=1, nspec +!!mgs!! IF (TRIM(speclist(i)%shortname) == TRIM(shortname) .AND. IAND(speclist(i)%nphase,iphase) /= 0) THEN +!!mgs!! ispec = i +!!mgs!! EXIT +!!mgs!! END IF +!!mgs!! END DO +!!mgs!! ELSE + DO i=1, nspec + IF (TRIM(speclist(i)%shortname) == TRIM(shortname)) THEN + ispec = i + EXIT + END IF + END DO +!!mgs!! END IF + END IF + + ! --- Collect species properties + IF (ispec > 0) THEN + IF (PRESENT(ierr)) ierr = OK ! error status: OK + IF (PRESENT(index)) index = ispec + IF (PRESENT(units)) units = speclist(ispec)% units + IF (PRESENT(mw)) mw = speclist(ispec)% moleweight + IF (PRESENT(tsubmname)) tsubmname = speclist(ispec)% tsubmname + IF (PRESENT(tdecay)) tdecay = speclist(ispec)% tdecay + IF (PRESENT(henry)) henry(:) = speclist(ispec)% henry + IF (PRESENT(dryreac)) dryreac = speclist(ispec)% dryreac + IF (PRESENT(density)) density = speclist(ispec)% density + IF (PRESENT(lwatsol)) lwatsol = speclist(ispec)% lwatsol + IF (PRESENT(lelectrolyte)) lelectrolyte = speclist(ispec)% lelectrolyte + IF (PRESENT(nion)) nion = speclist(ispec)% nion + IF (PRESENT(osm)) osm = speclist(ispec)% osm + IF (PRESENT(kappa)) kappa = speclist(ispec)% kappa + IF (PRESENT(lrad)) lrad = speclist(ispec)% lrad + IF (PRESENT(lemis)) lemis = speclist(ispec)% lemis + IF (PRESENT(ldrydep)) ldrydep = speclist(ispec)% ldrydep + IF (PRESENT(lwetdep)) lwetdep = speclist(ispec)% lwetdep + IF (PRESENT(itrtype)) itrtype = speclist(ispec)% itrtype + IF (PRESENT(idt)) idt = speclist(ispec)% idt + IF (PRESENT(iaerorad)) iaerorad = speclist(ispec)% iaerorad + END IF + + END SUBROUTINE query_species + + +!! get_nspec: return number of specers defined, optionally keyed by submodel name + + FUNCTION get_nspec (tsubmname) RESULT (ispec) + + INTEGER :: ispec + CHARACTER(len=*), INTENT(in), OPTIONAL :: tsubmname + + INTEGER :: jt + + ispec = 0 + + IF (PRESENT(tsubmname)) THEN + DO jt = 1,nspec + IF (speclist(jt)%tsubmname == tsubmname) ispec = ispec + 1 + END DO + ELSE + ispec = nspec ! return number of all specers + END IF + + END FUNCTION + + SUBROUTINE printspec + !! print species definitions + !! and fill spec_idt matrix + + USE mo_exception, ONLY: message, message_text, em_info, em_param + USE mo_tracdef, ONLY: ntrac, trlist + USE mo_util_string, ONLY: separator + + INTEGER :: jt, ispec, i + CHARACTER(len=11) :: cstring + + CALL message('', 'Species definitions:', level=em_info) + CALL message('','',level=em_param) + WRITE(message_text,'(a)') 'Id shortname phase submodel '//& + 'mol.wght unit itrtype idt longname' + CALL message('', message_text, level=em_param) + DO jt = 1, nspec + + SELECT CASE(speclist(jt)%nphase) + CASE (GAS) + cstring = 'gas ' + CASE (AEROSOL) + cstring = 'aerosol ' + CASE (GAS_OR_AEROSOL) + cstring = 'gas|aerosol' + END SELECT + +!SF Note: in the line below, all string fields are meant to be printed with their original declared length +! (which should make sense!), except for the shortname property (otherwise these lines are +! extremely long and unreadable). Therefore it may be that the shortname property is truncated in the +! printed lines (> 18 characters...) + WRITE(message_text,'(i0,t4,a,t22,2(a,1x),f7.3,3x,a,1x,i3,1x,i3,2x,a)') & + jt,TRIM(speclist(jt)%shortname), cstring, speclist(jt)%tsubmname, & + speclist(jt)%moleweight, speclist(jt)%units, speclist(jt)%itrtype, & + speclist(jt)%idt, speclist(jt)%longname + + CALL message('', message_text, level=em_param) + + END DO + + CALL message('','',level=em_param) + WRITE(message_text,'(a)') 'Notes:' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a)') '1. itrtype meaning: ' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrnone,' = No ECHAM tracer, ' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrpresc,' = Prescribed tracer, read from file' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrdiag,' = Diagnostic tracer, no transport' + CALL message('', message_text, level=em_param) + WRITE(message_text,'(a,i0,a)') ' --> ',itrprog,' = Prognostic tracer, transport by ECHAM' + CALL message('', message_text, level=em_param) + CALL message('','',level=em_param) + WRITE(message_text,'(a)') '2. idt is the tracer index for gas-phase tracers only' + CALL message('', message_text, level=em_param) + + !! fill spec_idt matrix + DO jt = 1, ntrac + ispec = trlist%ti(jt)%spid + IF (ispec > 0) THEN + spec_ntrac(ispec) = spec_ntrac(ispec) + 1 + spec_idt(ispec, spec_ntrac(ispec)) = jt + END IF + END DO + + CALL message('','',level=em_param) + CALL message('', 'Species-tracer matrix:', level=em_param) + CALL message('', 'Species index : Tracer index/indices', level=em_param) + !>>dod removed use of list-directed I/O to variable + message_text='' + DO jt = 1, nspec + WRITE(message_text, '(i0,t15,a1)') jt,':' + DO i=1,spec_ntrac(jt) + WRITE(cstring,'(i0,1x)') spec_idt(jt,i) + WRITE(message_text,'(a,1x,a)') TRIM(message_text), TRIM(cstring) + END DO + CALL message('', message_text, level=em_param) + END DO + !<YRPHY2%TSPHY) !TeMi + + CONTAINS + SUBROUTINE init_mo_time_control(YRRIP) + TYPE(TRIP), intent(in) :: YRRIP + ! copy the time step length from IFS control structure + time_step_len = YRRIP%TSTEP + END SUBROUTINE init_mo_time_control + ! --> thk +END MODULE mo_time_control + diff --git a/ifs-source/arpifs/m7/module/mo_tracdef.F90 b/ifs-source/arpifs/m7/module/mo_tracdef.F90 new file mode 100644 index 00000000..895b096c --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_tracdef.F90 @@ -0,0 +1,230 @@ +MODULE mo_tracdef + + + USE mo_kind, ONLY: dp + + IMPLICIT NONE + + PRIVATE + + PUBLIC :: trlist ! tracer info list variable + PUBLIC :: t_trlist, t_trinfo, t_flag ! "" type definitions + PUBLIC :: ln, ll, lf, nf ! length of names in trlist + + PUBLIC :: jptrac ! max. number of tracers + PUBLIC :: ntrac ! number of tracers actually defined (*) + ! Note (*): ntrac always equal trlist% ntrac. + ! It's just more convenient. + + !-- flag values + ! general flag values + PUBLIC :: OK + PUBLIC :: ON + PUBLIC :: OFF + ! initialization mode 'ninit' + PUBLIC :: INITIAL + PUBLIC :: RESTART + PUBLIC :: CONSTANT + PUBLIC :: PERIODIC + ! 'nsoluble' + PUBLIC :: SOLUBLE + PUBLIC :: INSOLUBLE + ! 'nphase' + PUBLIC :: GAS + PUBLIC :: AEROSOL + PUBLIC :: GAS_OR_AEROSOL + PUBLIC :: AEROSOLMASS + PUBLIC :: AEROSOLNUMBER + PUBLIC :: UNDEFINED + ! choice of advection scheme 'ntran' + ! tracer type 'itrtype' + PUBLIC :: ITRNONE + PUBLIC :: ITRPRESC + PUBLIC :: ITRDIAG + PUBLIC :: ITRPROG + ! Limits + ! + INTEGER, PARAMETER :: jptrac = 500 ! maximum number of tracers allowed + ! + ! Individual settings for each tracer + ! + INTEGER, PARAMETER :: ln = 24 ! length of name (char) components + INTEGER, PARAMETER :: ll = 256 ! length of longname and standardname + INTEGER, PARAMETER :: lf = 8 ! length of flag character string + INTEGER, PARAMETER :: nf = 10 ! number of user defined flags + INTEGER, PARAMETER :: ns = 20 ! max number of submodels + + ! + ! Constants (argument values for new_tracer routine in mo_tracer) + ! + ! + ! error return values + ! + INTEGER, PARAMETER :: OK = 0 + INTEGER, PARAMETER :: NAME_USED = 2 + INTEGER, PARAMETER :: NAME_MISS = 3 + INTEGER, PARAMETER :: TABLE_FULL = 4 + ! + ! general flags + ! + INTEGER, PARAMETER :: OFF = 0 + INTEGER, PARAMETER :: ON = 1 + ! + ! initialisation flag (ninit) + ! + INTEGER, PARAMETER :: CONSTANT = 1 + INTEGER, PARAMETER :: RESTART = 2 + INTEGER, PARAMETER :: INITIAL = 4 + INTEGER, PARAMETER :: PERIODIC = 8 + ! + ! Tracer type + ! + INTEGER, PARAMETER :: ITRNONE = 0 ! No ECHAM tracer + INTEGER, PARAMETER :: ITRPRESC = 1 ! Prescribed tracer, read from file + INTEGER, PARAMETER :: ITRDIAG = 2 ! Diagnostic tracer, no transport + INTEGER, PARAMETER :: ITRPROG = 3 ! Prognostic tracer, transport by ECHAM + ! + ! soluble flag (nsoluble) + ! + INTEGER, PARAMETER :: INSOLUBLE = 0 ! insoluble + INTEGER, PARAMETER :: SOLUBLE = 1 ! soluble + ! + ! phase indicator (nphase) + ! + INTEGER, PARAMETER :: GAS = 1 ! gas + INTEGER, PARAMETER :: AEROSOL = 2 ! aerosol (for species definition) + INTEGER, PARAMETER :: GAS_OR_AEROSOL = 3 ! gas or aerosol (for species definition) + INTEGER, PARAMETER :: AEROSOLMASS = 2 ! aerosol mass + INTEGER, PARAMETER :: AEROSOLNUMBER = -2 ! particle number concentration + INTEGER, PARAMETER :: UNDEFINED = 0 ! other tracers (e.g. CDNC) + + ! + ! General purpose flag (additional tracer property) + ! + TYPE t_flag + CHARACTER(len=lf) :: c ! character string + REAL(dp) :: v ! value + END TYPE t_flag + + ! + ! Individual settings for each tracer + ! Default values are marked with * * + ! + !=============! + TYPE t_trinfo + !=============! + ! + ! identification of transported quantity + ! + CHARACTER(len=ln) :: basename ! name (instead of xt..) + CHARACTER(len=ln) :: subname ! optional for 'colored' tracer + CHARACTER(len=ln) :: fullname ! name_subname + CHARACTER(len=ln) :: modulename ! name of requesting sub-model + CHARACTER(len=ln) :: units ! units + CHARACTER(len=ll) :: longname ! long name + CHARACTER(len=ll) :: standardname ! CF standard name + INTEGER :: trtype ! type of tracer: 0=undef., 1=prescribed, 2=diagnostic (no transport), + ! *3*=prognostic (transported) + INTEGER :: spid ! species id (index in speclist) where physical/chemical + ! properties are defined + INTEGER :: nphase ! phase (1=GAS, 2=AEROSOLMASS, 3=AEROSOLNUMBER, ...??) + ! [add liquid or ice phase ??] + INTEGER :: mode ! aerosol mode or bin number (default 0) + REAL(dp) :: moleweight ! molecular mass (copied from species upon initialisation) +! INTEGER :: tag ! tag of requesting routine + + ! + ! Requested resources ... + ! + INTEGER :: burdenid ! index in burden diagnostics + INTEGER :: nbudget ! calculate budgets (default 0) + INTEGER :: ntran ! perform transport (default 1) + INTEGER :: nfixtyp ! type of mass fixer for semi lagrangian adv. (default 1) + INTEGER :: nconvmassfix ! use xt_conv_massfix in cumastr + INTEGER :: nvdiff ! vertical diffusion flag (default 1) + INTEGER :: nconv ! convection flag (default 1) + INTEGER :: ndrydep ! dry deposition flag: *0*=no drydep, 1=prescribed vd, + ! 2=Ganzeveld + INTEGER :: nwetdep ! wet deposition flag (default 0) + INTEGER :: nsedi ! sedimentation flag (default 0) + REAL(dp) :: tdecay ! decay time (exponential) (default 0.sec) + INTEGER :: nemis ! surface emission flag (default 0) + ! emission flag: *0*=no emissions, + ! 1=surface flux cond., + ! 2=tendency (2D emis.) [additive] +! INTEGER :: nint ! integration flag (default 1) + + ! + ! initialization and restart + ! + INTEGER :: ninit ! initialization request flag + INTEGER :: nrerun ! rerun flag + REAL(dp) :: vini ! initialisation value (default 0.) + INTEGER :: init ! initialisation method actually used + ! + ! Flags used for postprocessing + ! + INTEGER :: nwrite ! write flag (default 1) + INTEGER :: code ! tracer code, (default 235...) + INTEGER :: table ! tracer code table (default 0) + INTEGER :: gribbits ! bits for encoding (default 16) + INTEGER :: nint ! integration (accumulation) flag (default 1) + + ! + ! Flags to be used by chemistry or tracer modules + ! +!### henry constant will be removed from trlist -- available as species property instead +!!mgs!! REAL(dp) :: henry ! Henry coefficient [?] (default 1.e-10) +!!mgs!! REAL(dp) :: dryreac ! dry reactivity coeff. (default 0.) + INTEGER :: nsoluble ! soluble flag (default 0) + + TYPE(t_flag) :: myflag (nf)! user defined flag + ! + ! Indicate actions actually performed by ECHAM + ! + + END TYPE t_trinfo + + + ! + ! Reference to memory buffer information for each tracer + ! used to access the 'restart' flags + ! + + ! + ! Basic data type definition for tracer info list + ! + !=============! + TYPE t_trlist + !=============! + ! + ! global tracer list information + ! + INTEGER :: ntrac ! number of tracers specified + INTEGER :: anyfixtyp ! mass fixer types used + INTEGER :: anywetdep ! wet deposition requested for any tracer + INTEGER :: anydrydep ! wet deposition requested for any tracer + INTEGER :: anysedi ! sedimentation requested for any tracer + INTEGER :: anysemis ! surface emission flag for any tracer + INTEGER :: anyconv ! convection flag + INTEGER :: anyvdiff ! vertical diffusion flag + INTEGER :: anyconvmassfix ! + INTEGER :: nadvec ! number of advected tracers + LOGICAL :: oldrestart ! true to read old restart format + ! + ! individual information for each tracer + ! + TYPE (t_trinfo) :: ti (jptrac) ! Individual settings for each tracer + ! + ! reference to memory buffer info + ! + END TYPE t_trlist + ! + ! module variables + ! + + TYPE(t_trlist) ,SAVE ,TARGET :: trlist ! tracer list + INTEGER ,SAVE :: ntrac = 0 ! number of tracers actually defined + +END MODULE mo_tracdef + diff --git a/ifs-source/arpifs/m7/module/mo_tracer.F90 b/ifs-source/arpifs/m7/module/mo_tracer.F90 new file mode 100644 index 00000000..bcfd950b --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_tracer.F90 @@ -0,0 +1,1083 @@ +!> +!! @par Copyright +!! This code is subject to the MPI-M-Software - License - Agreement in it's most recent form. +!! Please see URL http://www.mpimet.mpg.de/en/science/models/model-distribution.html and the +!! file COPYING in the root of the source tree for this code. +!! Where software is supplied by third parties, it is indicated in the headers of the routines. +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! Definition of tracer meta information and structure for burden diagnostics. Also contains +!! generic routines to define tracers, get tracer ids or retrieve flag values. +!! +!! +!! +!! @author +!!
    +!!
  1. ECHAM5 developers +!!
  2. M. Schultz (FZ-Juelich) +!!
+!! +!! $Id: 1423$ +!! +!! @par Revision History +!!
    +!!
  1. ECHAM5 developers - original code - (before 2009) +!!
  2. M. Schultz (FZ-Juelich) - new tracer definition scheme - (2009-05-xx) +!! +!!
+!! +!! @par This module is used by +!! a lot of subroutines +!! +!! @par Responsible coder +!! m.schultz@fz-juelich.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +MODULE mo_tracer + + USE mo_kind, ONLY: dp + USE mo_util_string, ONLY: separator ! format string (----) +#ifdef HAMMOZ + USE mo_time_conversion, ONLY: tc_set ! routine to set 'time_days' +#endif + USE mo_tracdef, ONLY: trlist, & ! tracer info variable +!!mgs!! t_trlist, & ! tracer info data type + t_trinfo, & ! data type, component of t_trlist + t_flag, & ! data type, component of t_trlist + ln, nf ! len of char components of trlist + USE mo_tracdef, ONLY: jptrac, & ! maximum number of prog. tracers + ntrac, & ! number of tracers defined + RESTART, & + CONSTANT, & ! + GAS, & ! + AEROSOLMASS, & ! + AEROSOLNUMBER ! +! USE mo_memory_gl, ONLY: xt ! tracer field array +! USE mo_memory_g1a, ONLY: xtm1 ! tracer field array (t-1) + USE mo_exception, ONLY: finish, & + message, & + message_text + USE mo_advection, ONLY: iadvec ! selected advection scheme + + IMPLICIT NONE + + + PRIVATE + + + !! Tracer info list + +!!mgs!! PUBLIC :: t_trinfo ! +!!mgs!! PUBLIC :: t_flag ! type definition + + PUBLIC :: nburden, diag_burden, d_burden ! burden diagnostics + + !! Interface routines ! purpose ! called by + + PUBLIC :: new_tracer ! request tracer ! chemical modules +#ifdef HAMMOZ + PUBLIC :: get_tracer ! get reference to tracer ! chemical modules +#endif + PUBLIC :: get_ntrac ! get number of tracers optionally keyed to submodel name +#ifdef HAMMOZ + PUBLIC :: validate_traclist ! evaluate a list of tracer names for certain properties + PUBLIC :: flag ! get value of userdef.flag ! chemical modules + PUBLIC :: init_trlist + PUBLIC :: finish_tracer_definition +#endif + PUBLIC :: new_diag_burden ! get_diag_burden(?) + + ! type declaration + TYPE diag_burden + CHARACTER(len=ln) :: name + INTEGER :: itype ! type of burden calculation (see below) + ! additive binary values + ! ### also add 64 = global totals (old trastat function)? + REAL(dp), POINTER :: ptr1(:,:) ! pointer for type= 1 : total column mass + REAL(dp), POINTER :: ptr2(:,:) ! pointer for type= 2 : tropospheric column mass + REAL(dp), POINTER :: ptr4(:,:) ! pointer for type= 4 : stratospheric column mass + REAL(dp), POINTER :: ptr8(:,:) ! pointer for type= 8 : column density + REAL(dp), POINTER :: ptr16(:,:) ! pointer for type=16 : tropospheric column density + REAL(dp), POINTER :: ptr32(:,:) ! pointer for type=32 : stratospheric column density + END TYPE diag_burden + + ! Parameters + INTEGER, PARAMETER :: nmaxburden = jptrac ! maximum number of burden diagnostics allowed + + ! module variables + INTEGER :: nburden = 0 ! number of burden diagnostics currently defined + +!!mgs!! --- for trastat ---------------------- +!!mgs!! INTEGER :: icount = 0 ! counter for time steps +!!mgs!! -------------------------------------- + + + TYPE (diag_burden) :: d_burden(nmaxburden) + + +!!mgs!! --- for trastat ---------------------- +!!mgs!! REAL(dp), ALLOCATABLE :: tropm (:,:) ! zonal mass budgets of tracers, troposphere +!!mgs!! REAL(dp), ALLOCATABLE :: stratm(:,:) ! zonal mass budgets of tracers, stratosphere +!!mgs!! -------------------------------------- + + + !! error return values + + INTEGER, PARAMETER :: OK = 0 + INTEGER, PARAMETER :: NAME_USED = 2 + INTEGER, PARAMETER :: NAME_MISS = 3 + INTEGER, PARAMETER :: TABLE_FULL = 4 + INTEGER, PARAMETER :: UNDEFINED = 5 !mgs + INTEGER, PARAMETER :: INVALID_ID = 6 !mgs + + INTEGER ,PARAMETER :: IUNDEF = -999 + REAL(dp) ,PARAMETER :: RUNDEF = -999.0_dp + + + !! interfaces +#ifdef HAMMOZ + INTERFACE flag + MODULE PROCEDURE flag_by_name + MODULE PROCEDURE flag_by_index + END INTERFACE ! flag +#endif + + CONTAINS + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Set defaults of the tracer info data type. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! initialize +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! combination of the original code and mgs02 +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifdef HAMMOZ + SUBROUTINE init_trlist + + INTEGER :: i + + trlist% ti(:)% code = 0 + trlist% ti(:)% table = 131 ! MPI-Meteorology, Hamburg + trlist% ti(:)% gribbits = 16 + trlist% ti(:)% basename = '' + trlist% ti(:)% subname = '' + trlist% ti(:)% fullname = '' + trlist% ti(:)% modulename = '' + trlist% ti(:)% units = '' + trlist% ti(:)% longname = '' + trlist% ti(:)% moleweight = 0._dp! molecular mass (copied from species upon initialisation) + + trlist% ti(:)% nbudget = 0 + trlist% ti(:)% ntran = iadvec + trlist% ti(:)% nfixtyp = 1 + trlist% ti(:)% nvdiff = 1 + trlist% ti(:)% nconv = 1 + + trlist% ti(:)% nwrite = 1 + trlist% ti(:)% ninit = RESTART+CONSTANT + trlist% ti(:)% vini = 0._dp + trlist% ti(:)% ndrydep = 0 + trlist% ti(:)% nwetdep = 0 + trlist% ti(:)% nsedi = 0 + trlist% ti(:)% nemis = 0 + trlist% ti(:)% nint = 1 ! default: accumulate (average) tracer concentrations + + trlist% ti(:)% nsoluble = 0 + trlist% ti(:)% nphase = 0 ! phase undefined + trlist% ti(:)% mode = 0 ! aerosol mode or bin (0 is ok for gas-phase tracers) + trlist% ti(:)% init = 0 + trlist% ti(:)% nrerun = 1 ! save in rerun file + + !ori but not msg02 +!!mgs!! trlist% ti(:)% henry = 1.e-10_dp +!!mgs!! trlist% ti(:)% dryreac = 0._dp + trlist% ti(:)% tdecay = 0._dp + + !msg02 but not ori + trlist% ti(:)% standardname = '' + trlist% ti(:)% trtype = 0 ! tracer undefined + trlist% ti(:)% spid = 0 ! no species index attached + trlist% ti(:)% burdenid = -1 + + + DO i = 1, UBOUND(trlist% ti,1) + trlist% ti(i) % myflag = t_flag ('',0._dp) + CALL tc_set (0,0,trlist% ti(i)% tupdatel) + CALL tc_set (0,0,trlist% ti(i)% tupdaten) + END DO + + END SUBROUTINE init_trlist +#endif + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Print tracer information as set by namelist and modules. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! finish_tracer_definition +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! original version +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +#ifdef HAMMOZ + SUBROUTINE printtrac !! please keep this subroutine for testing use + + USE mo_mpi, ONLY: p_parallel_io + + INTEGER :: i + CHARACTER(len=*) ,PARAMETER :: form = '(2x,i4,1x,2a16,2i5,3i2,g11.3,6i2)' + + + IF (ntrac > 0 .AND. p_parallel_io) THEN + CALL message('',separator) + CALL message('','') + WRITE(message_text,'(a,i4)') ' Number of tracers:', trlist% ntrac + CALL message('',message_text) + CALL message('','') + IF (ntrac > 0) THEN + CALL message('',' p r n w d s s p m') + CALL message('',' r e i e r e o h o') + CALL message('',' grib i s n t y d l a d') + CALL message('',' name module code table n t i vini d d i u s e') + CALL message('',' t a t e e b e ') + CALL message('',' r p p l ') + ENDIF + CALL message('','') + DO i=1,ntrac + WRITE(message_text,form) i, & + trlist% ti(i)% fullname, & + trlist% ti(i)% modulename, & + trlist% ti(i)% code, & + trlist% ti(i)% table, & + trlist% ti(i)% nwrite, & + trlist% ti(i)% nrerun, & + trlist% ti(i)% ninit, & + trlist% ti(i)% vini, & + trlist% ti(i)% nwetdep, & + trlist% ti(i)% ndrydep, & + trlist% ti(i)% nsedi, & + trlist% ti(i)% nsoluble, & + trlist% ti(i)% nphase, & + trlist% ti(i)% mode + CALL message('',message_text) + END DO + CALL message('','') + CALL message('',separator) + ENDIF + + END SUBROUTINE printtrac +#endif + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Print tracer information as set by namelist and modules. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! finish_tracer_definition +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! new version by Martin +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifdef HAMMOZ + SUBROUTINE printtrac2 + + + USE mo_mpi, ONLY: p_parallel_io + USE mo_tracdef, ONLY: trlist, &! tracer info variable + ITRPRESC, &! tracer type + ITRDIAG, &! ... + ITRPROG ! ... + USE mo_exception, ONLY: message, & + message_text, & + em_param + + + INTEGER :: i + CHARACTER(len=*) ,PARAMETER :: form1 = '(2x,2a16,6i6,g11.3)' + CHARACTER(len=*) ,PARAMETER :: form2 = '(2x,2a16,6i6,g11.3)' + CHARACTER(len=6) :: ctype, cphase + + + IF (p_parallel_io) THEN + CALL message('',separator) + CALL message('','', level=em_param) + WRITE(message_text,'(a,i4)') ' Number of tracers:', trlist% ntrac + CALL message('',message_text, level=em_param) + CALL message('','', level=em_param) + IF (ntrac > 0) THEN + CALL message('',' Tracer properties and processes:', level=em_param) + CALL message('',' name module type phase mode species ndryd nwetd nsedi nsol', & + level=em_param) + CALL message('','', level=em_param) + DO i=1,ntrac + ctype = ' undef' + SELECT CASE (trlist% ti(i)% trtype) + CASE (ITRPRESC) ; ctype = ' presc' + CASE (ITRDIAG) ; ctype = ' diag' + CASE (ITRPROG) ; ctype = ' progn' + END SELECT + cphase = ' undef' + SELECT CASE (trlist% ti(i)% nphase) + CASE (GAS) ; cphase = ' gas' + CASE (AEROSOLMASS) ; cphase = ' aerom' + CASE (AEROSOLNUMBER) ; cphase = ' aeron' + END SELECT + WRITE(message_text,form1) trlist% ti(i)% fullname, & + trlist% ti(i)% modulename, & + ctype, & + cphase, & + trlist% ti(i)% mode, & + trlist% ti(i)% spid, & + trlist% ti(i)% ndrydep, & + trlist% ti(i)% nwetdep, & + trlist% ti(i)% nsedi, & + trlist% ti(i)% nsoluble + CALL message('',message_text, level=em_param) + CALL message('','', level=em_param) + END DO + CALL message('','', level=em_param) + CALL message('',' Tracer initialisation and output:', level=em_param) + CALL message('',' name module nwrite nint grbc grbt ninit nrerun vini', & + level=em_param) + CALL message('','', level=em_param) + DO i=1,ntrac + WRITE(message_text,form2) trlist% ti(i)% fullname, & + trlist% ti(i)% modulename, & + trlist% ti(i)% nwrite, & + trlist% ti(i)% nint, & + trlist% ti(i)% code, & + trlist% ti(i)% table, & + trlist% ti(i)% ninit, & + trlist% ti(i)% nrerun, & + trlist% ti(i)% vini + CALL message('',message_text, level=em_param) + END DO + CALL message('','', level=em_param) + ENDIF + CALL message('',separator) + ENDIF + + END SUBROUTINE printtrac2 +#endif + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! Call this routine from modules to define new tracers +!! +!! Normally, before defining a tracer, the corresponding species metadata should be +!! defined by calling the new_species subroutine. New_tracer will then store +!! the species index in the spid field. +!! If spid and nphase are valid, name can be left empty. In this case, the species +!! shortname will be used as tracer name. +!! For backward-compatibility new_tracer can also be called if the corresponding species +!! has not been defined. In this case, a new species will be created based on the +!! parameters provided (at a minimum, name and moleweight must be given). Note, +!! however, that new_tracer allows to control fewer parameters than new_species. +!! It is therefore recommended to adapt existing code to use new_species first and +!! new_tracer with the species id. +!! +!! @author see above +!! +!! $Id: 1423$ +!! +!! @par Revision History +!! see above +!! +!! @par This subroutine is called by +!! initrac +!! +!! @par Externals: +!!
    +!!
  1. None +!!
+!! +!! @par Notes +!! original version +!! +!! +!! @par Responsible coder +!! kai.zhang@zmaw.de +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + + SUBROUTINE new_tracer (name, modulename, spid, subname, longname, & ! names... + units, trtype, nphase, mode, & + ninit, nrerun, vini, & ! initialisation + nwrite, nint, code, table, bits, & ! output + burdenid, nbudget, & ! diagnostics + ntran, nfixtyp, nvdiff, nconv, & ! processes + ndrydep, nwetdep, nsedi, nemis, nsoluble, & + moleweight, tdecay, & ! species properties + !!mgs!! moleweight, henry, dryreac, tdecay, & ! species properties + idx, myflag, ierr) ! return info + + USE mo_exception, ONLY: message, message_text, em_warn, em_error + + CHARACTER(len=*) ,INTENT(in) :: name ! name of tracer + CHARACTER(len=*) ,INTENT(in) :: modulename! name of routine/module + INTEGER ,INTENT(in) ,OPTIONAL :: spid ! species index + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: subname ! optional for 'colored' + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: longname ! long name + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: units ! units + INTEGER ,INTENT(in) ,OPTIONAL :: trtype ! tracer type + INTEGER ,INTENT(in) ,OPTIONAL :: nphase ! phase indicator + INTEGER ,INTENT(in) ,OPTIONAL :: mode ! mode indicator or bin number + INTEGER ,INTENT(in) ,OPTIONAL :: ninit ! initialisation flag + INTEGER ,INTENT(in) ,OPTIONAL :: nrerun ! restart flag + REAL(dp) ,INTENT(in) ,OPTIONAL :: vini ! initialisation value + INTEGER ,INTENT(in) ,OPTIONAL :: nwrite ! flag to print tracer + INTEGER ,INTENT(in) ,OPTIONAL :: nint ! integration flag + INTEGER ,INTENT(in) ,OPTIONAL :: code ! grib code + INTEGER ,INTENT(in) ,OPTIONAL :: table ! grib table + INTEGER ,INTENT(in) ,OPTIONAL :: bits ! grib encoding bits + INTEGER ,INTENT(in) ,OPTIONAL :: burdenid ! burden diagnostics number + INTEGER ,INTENT(in) ,OPTIONAL :: nbudget ! budget diagnostics + INTEGER ,INTENT(in) ,OPTIONAL :: ntran ! transport switch + INTEGER ,INTENT(in) ,OPTIONAL :: nfixtyp ! type of mass fixer + INTEGER ,INTENT(in) ,OPTIONAL :: nvdiff ! vertical diffusion fl. + INTEGER ,INTENT(in) ,OPTIONAL :: nconv ! convection flag + INTEGER ,INTENT(in) ,OPTIONAL :: ndrydep ! dry deposition flag + INTEGER ,INTENT(in) ,OPTIONAL :: nwetdep ! wet deposition flag + INTEGER ,INTENT(in) ,OPTIONAL :: nsedi ! sedimentation flag + INTEGER ,INTENT(in) ,OPTIONAL :: nemis ! surface emission flag + INTEGER ,INTENT(in) ,OPTIONAL :: nsoluble ! soluble flag + + !! species properties (to be removed in future versions (ICON?)) + REAL(dp) ,INTENT(in) ,OPTIONAL :: moleweight! molecular weight +!!mgs!! REAL(dp) ,INTENT(in) ,OPTIONAL :: henry ! Henry coefficient +!!mgs!! REAL(dp) ,INTENT(in) ,OPTIONAL :: dryreac ! reactivity coefficient + REAL(dp) ,INTENT(in) ,OPTIONAL :: tdecay ! tracer exp-decay-time + TYPE(t_flag) ,INTENT(in) ,OPTIONAL :: myflag(:) ! user defined flags + + !! return values + INTEGER ,INTENT(out) ,OPTIONAL :: idx ! position in tracerinfo + INTEGER ,INTENT(out) ,OPTIONAL :: ierr ! error return value + + INTEGER :: i + CHARACTER(len=ln) :: fullname + TYPE(t_trinfo) ,POINTER :: ti + LOGICAL :: lspec ! species id provided as input? + !INTEGER :: iphase ! local copy -- needed for species definition + ! Variable IPHASE set but never referenced + CHARACTER(len=ln) :: cname ! local copy + INTEGER :: ispid ! local copy of species index + INTEGER :: ierrlevel ! local error level (em_error if ierr not present, em_warn otherwise) + ! "module settings": ### these default values should be re-defined in the wetdep and drydep modules + ! ### in analogy to iadvec in mo_transport. Then one would find a USE mo_drydep, ONLY: idrydep here. + !INTEGER, PARAMETER :: iwetdep = 1 + !INTEGER, PARAMETER :: idrydep= 2 ! interactive Ganzeveld scheme + !INTEGER, PARAMETER :: isoluble= 1 + ! + ! note: nconvmassfix is set automatically (ON for aerosol tracers, OFF for others) + ! + ! set default values for optional INTENT(out) parameters + ! + IF (PRESENT(ierr)) ierr = UNDEFINED ! fail safe + IF (PRESENT(idx)) idx = 0 + + ! set error level for message output + IF (PRESENT(ierr)) THEN + ierrlevel = em_warn + ELSE + ierrlevel = em_error + END IF + + ! test for presence of valid spid + lspec = PRESENT(spid) + ispid = 0 + + IF (lspec) THEN + ! ### WARNING: no error check for validity of species index value ! + ispid = spid + END IF + + ! make sure that nphase is defined if spid is given + IF (lspec) THEN + ! IF (PRESENT(nphase)) THEN + ! iphase = nphase + ! ELSE + ! iphase = 0 + ! CALL message('new_tracer', 'Undefined phase for tracer ' // TRIM(name), level=em_error) + ! END IF + ! Variable IPHASE set but never referenced !! + IF (.NOT. PRESENT(nphase)) & + CALL message('new_tracer', 'Undefined phase for tracer ' // TRIM(name), level=em_error) + END IF + + ! + ! derive full name + ! + ! error if name is empty + cname = name + IF (LEN_TRIM(name) == 0) THEN + WRITE(message_text,*) 'Empty species name, ntrac=', ntrac + CALL message('new_tracer', message_text, level=em_error) + END IF +!++mgs: fix for empty subnames (mo_ham_m7_trac) + IF(PRESENT(subname)) THEN + IF(TRIM(subname) /= '') THEN + fullname = TRIM(cname)//'_'//subname + ELSE + fullname = cname + END IF +!--mgs + ELSE + fullname = cname + END IF + ! + ! check for table full and name used errors + ! + IF (ntrac >= jptrac) THEN + WRITE (message_text, *) 'Tracer table full. jptrac =',jptrac + CALL finish('new_tracer', message_text) + IF (PRESENT(ierr)) ierr = TABLE_FULL + RETURN + END IF + IF (ANY(trlist% ti(1:ntrac)% fullname==fullname)) THEN + CALL message('new_tracer', 'Tracer name already used: ' // TRIM(fullname), level=ierrlevel) + IF (PRESENT(ierr)) ierr = NAME_USED + RETURN + ENDIF + + + ! complete warnings +!!mgs!! IF (PRESENT(henry)) CALL message('new_tracer', 'Henry value definition obsolete - now done in new_species.' & +!!mgs!! // ' Value will be ignored.', level=em_warn) + ! + ! set tracer info for the new tracer + ! + ntrac = ntrac + 1 + trlist% ntrac = ntrac + ti => trlist% ti (ntrac) + IF (PRESENT(idx)) idx = ntrac + IF (PRESENT(ierr)) ierr = OK ! now we have a valid new entry even if it may contain rubbish + ! + ! special handling for colored tracers: + ! take over properties of previous tracer + ! use same attributes + ! + IF (PRESENT(subname) .AND. ntrac > 1) THEN + DO i=1,ntrac-1 + IF ( trlist% ti (i)% basename == name & + .AND.trlist% ti (i)% subname == '' ) THEN + ti = trlist% ti (i) + IF (trlist% ti (i)% code > 0) ti% code = 0 + ENDIF + END DO + ENDIF + ! + ! define tracer properties + ! + ti% basename = name + ti% fullname = fullname + ti% modulename = modulename + ti% longname = fullname + ti% spid = ispid + + IF (PRESENT(subname)) ti% subname = subname + IF (PRESENT(longname)) ti% longname = longname + IF (PRESENT(units)) ti% units = units + IF (PRESENT(trtype)) ti% trtype = trtype + IF (PRESENT(nphase)) ti% nphase = nphase + IF (PRESENT(mode)) ti% mode = mode + IF (PRESENT(ninit)) ti% ninit = ninit + IF (PRESENT(nrerun)) ti% nrerun = nrerun + IF (PRESENT(vini)) ti% vini = vini + IF (PRESENT(nwrite)) ti% nwrite = nwrite + IF (PRESENT(nint)) ti% nint = nint + IF (PRESENT(code)) ti% code = code + IF (PRESENT(table)) ti% table = table + IF (PRESENT(bits)) ti% gribbits = bits + IF (PRESENT(burdenid)) ti% burdenid = burdenid + IF (PRESENT(nbudget)) ti% nbudget = nbudget + IF (PRESENT(ntran)) ti% ntran = ntran + IF (PRESENT(nfixtyp)) ti% nfixtyp = nfixtyp + IF (PRESENT(nvdiff)) ti% nvdiff = nvdiff + IF (PRESENT(nconv)) ti% nconv = nconv + IF (PRESENT(ndrydep)) ti% ndrydep = ndrydep + IF (PRESENT(nwetdep)) ti% nwetdep = nwetdep + IF (PRESENT(nsedi)) ti% nsedi = nsedi + IF (PRESENT(nemis)) ti% nemis = nemis + IF (PRESENT(nsoluble)) ti% nsoluble = nsoluble + IF (PRESENT(moleweight)) ti% moleweight = moleweight +!!mgs!! IF (PRESENT(henry)) ti% henry = henry +!!mgs!! IF (PRESENT(dryreac)) ti% dryreac = dryreac + IF (PRESENT(tdecay)) ti% tdecay = tdecay + + ! set nconvmassfix + ti% nconvmassfix = 0 + IF (ti% nphase == AEROSOLMASS .OR. ti% nphase == AEROSOLNUMBER) ti% nconvmassfix = 1 + + IF (PRESENT(myflag)) THEN + IF (SIZE(myflag) > nf) CALL finish ('new_tracer','size(myflag) > nf') + ti% myflag (:SIZE(myflag)) = myflag + ENDIF + + IF (PRESENT(myflag)) THEN + IF (SIZE(myflag) > nf) CALL finish ('new_tracer','size(myflag) > nf') + ti% myflag (:SIZE(myflag)) = myflag + ENDIF + + ! + ! Add tracer index to species structure + ! + + END SUBROUTINE new_tracer + +#ifdef HAMMOZ + + FUNCTION flag_by_name (string, name, subname, undefined) RESULT (value) + REAL(dp) :: value ! value of flag + CHARACTER(len=*) ,INTENT(in) :: string ! name of flag + CHARACTER(len=*) ,INTENT(in) :: name ! name of tracer + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: subname ! subname of tracer + REAL(dp) ,INTENT(in) ,OPTIONAL :: undefined ! return value on error + INTEGER :: i + CHARACTER(len=ln) :: fullname + + IF(PRESENT(subname)) THEN + fullname = name//'_'//subname + ELSE + fullname = name + ENDIF + + DO i=1,trlist% ntrac + IF (trlist% ti(i)% fullname == fullname) THEN + value = flag (string, i, undefined) + RETURN + ENDIF + END DO + + CALL finish ('function flag','tracer not found: '//fullname) + + END FUNCTION flag_by_name + + + + FUNCTION flag_by_index (string, idx, undefined) RESULT (value) + REAL(dp) :: value ! value of flag + CHARACTER(len=*) ,INTENT(in) :: string ! name of flag + INTEGER ,INTENT(in) :: idx ! index of tracer + REAL(dp) ,INTENT(in) ,OPTIONAL :: undefined ! return value on error + + INTEGER :: j + + DO j=1,nf + IF (trlist% ti(idx)% myflag(j)% c == string) THEN + value = trlist% ti(idx)% myflag(j)% v + RETURN + ENDIF + END DO + + IF (PRESENT (undefined)) THEN + value = undefined + RETURN + ELSE + CALL finish ('function flag','flag not found: '//string) + ENDIF + + END FUNCTION flag_by_index + + SUBROUTINE get_tracer (name, subname, modulename, idx, pxt, pxtm1, ierr) + ! + ! get pointer or index of tracer + ! + CHARACTER(len=*) ,INTENT(in) :: name ! name of tracer + CHARACTER(len=*) ,INTENT(in) ,OPTIONAL :: subname ! subname of tracer + CHARACTER(len=*) ,INTENT(out) ,OPTIONAL :: modulename ! name of module + INTEGER ,INTENT(out) ,OPTIONAL :: idx ! index of tracer + REAL(dp) ,POINTER ,OPTIONAL :: pxt (:,:,:) ! pointer to tracer + REAL(dp) ,POINTER ,OPTIONAL :: pxtm1(:,:,:) ! ptr to tr. at t-1 + INTEGER ,INTENT(out) ,OPTIONAL :: ierr ! error return value + + CHARACTER(len=ln) :: fullname + INTEGER :: i + + + IF(PRESENT(subname)) THEN + fullname = name//'_'//subname + ELSE + fullname = name + ENDIF + + IF (PRESENT(modulename)) modulename='' + IF (PRESENT(idx)) idx=0 + IF (PRESENT(pxt)) NULLIFY(pxt) + IF (PRESENT(pxtm1)) NULLIFY(pxtm1) + + DO i=1, trlist% ntrac + IF (trlist% ti(i)% fullname == fullname) THEN + IF (PRESENT(modulename)) modulename = trlist% ti(i)% modulename + IF (PRESENT(idx)) idx = i + IF (PRESENT(pxt)) pxt => xt (:,:,i,:) + IF (PRESENT(pxtm1)) pxtm1 => xtm1 (:,:,i,:) + IF (PRESENT(ierr)) ierr = 0 + RETURN + ENDIF + END DO + + IF (PRESENT(ierr)) THEN + ierr = 1 + ELSE + CALL finish ('get_tracer','tracer not found: '//fullname) + ENDIF + + END SUBROUTINE get_tracer +#endif + +!! get_ntrac: return number of tracers defined, optionally keyed by submodel name + + FUNCTION get_ntrac (tsubmname) RESULT (itrac) + + INTEGER :: itrac + CHARACTER(len=*), INTENT(in), OPTIONAL :: tsubmname + + INTEGER :: jt + + itrac = 0 + + IF (PRESENT(tsubmname)) THEN + DO jt = 1,ntrac + IF (trlist%ti(jt)%modulename == tsubmname) itrac = itrac + 1 + END DO + ELSE + itrac = ntrac ! return number of all tracers + END IF + + END FUNCTION +#ifdef HAMMOZ + !@brief: evaluate a list of tracer names for certain properties + !! + !! the tracnam array will contain only valid tracer names after this routine. + !! invalid names will be set to empty strings (there may thus be "holes" in the array) + + SUBROUTINE validate_traclist(tracnam, defaultnam, nphase, & + ltran, ldrydep, lwetdep, lsedi, lemis) + + USE mo_tracdef, ONLY: ln, jptrac, ntrac, trlist + USE mo_string_utls, ONLY: st1_in_st2_idx + USE mo_util_string, ONLY: tolower + USE mo_exception, ONLY: finish, message, message_text, em_error, em_warn + USE mo_mpi, ONLY: p_parallel_io + + CHARACTER(len=*), INTENT(inout) :: tracnam(:) ! tracer names to be tested + CHARACTER(len=*), OPTIONAL, INTENT(in) :: defaultnam(:) ! default names in list + ! expanded when first entry is 'default' + INTEGER, OPTIONAL, INTENT(in) :: nphase ! phase value to be tested + LOGICAL, OPTIONAL, INTENT(in) :: ltran ! test for ntran>0 + LOGICAL, OPTIONAL, INTENT(in) :: ldrydep ! test for ndrydep>0 + LOGICAL, OPTIONAL, INTENT(in) :: lwetdep ! test for nwetdep>0 + LOGICAL, OPTIONAL, INTENT(in) :: lsedi ! test for nsedi>0 + LOGICAL, OPTIONAL, INTENT(in) :: lemis ! test for nemis>0 + + CHARACTER(len=ln) :: allnam(jptrac) ! complete array of tracer names defined + INTEGER :: tridx(jptrac) ! map tracnam to trlist indices + INTEGER :: listsize, ndef, jt, ind + LOGICAL :: ltest(jptrac) ! result of tracer property test + LOGICAL :: lspecial ! default or all option was used + + !-- initialize + listsize = SIZE(tracnam) + IF (p_parallel_io) write(0,*) 'tracnam list size = ',listsize, ' string length = ',LEN(tracnam(1)) + ltest(:) = .true. ! default: accept all tracers as valid + lspecial = .false. + ndef = 0 ! number of tracers copied from default list + DO jt = 1,ntrac + allnam(jt) = trlist%ti(jt)%fullname + END DO + tridx(:) = 0 + + !-- establish list of valid tracer names + !-- handle special keyword "all" + IF (tolower(tracnam(1)) == 'all') THEN + DO jt = 1,ntrac + tracnam(jt) = TRIM(allnam(jt)) + END DO + lspecial = .true. + END IF + + !-- handle special keyword "default" + IF (tolower(tracnam(1)) == 'default') THEN + IF (PRESENT(defaultnam)) THEN + ndef = SIZE(defaultnam) + !-- copy extra entries after "default" to make room for default tracers + ! (in extreme cases some tracers could get lost, but this would mean a bizarre tracnam list) + DO jt = listsize-ndef,2,-1 + tracnam(jt+ndef) = tracnam(jt) + END DO + !-- fill in the default tracer names + DO jt=1,ndef + tracnam(jt) = TRIM(defaultnam(jt)) + END DO + lspecial = .true. + ELSE + CALL message('validate_traclist', 'Found string "default" in tracnam, '// & + 'but there is no defaultnam argument!', level=em_error) + tracnam(1) = '' + END IF + END IF + + !-- validity check: make sure that all tracers in tracnam are valid tracer names + DO jt = 1, listsize + ind = st1_in_st2_idx(tracnam(jt), allnam) + IF (ind <= 0) THEN + !-- report error and remove invalid tracer name + IF (TRIM(tracnam(jt)) /= '' .AND. (.NOT. lspecial .OR. (lspecial .AND. jt > ndef))) THEN + WRITE (message_text,'(a,a,a,i0,a)') 'Invalid tracer name in tracnam list : ', & + '>'//TRIM(tracnam(jt))//'<', ', ind = ',jt,' (simply discarded)' + CALL message('validate_traclist', message_text, level=em_warn) + + END IF + !-- defuse invalid tracnam + tracnam(jt) = '' + ELSE + tridx(jt) = ind + END IF + END DO + + !-- tracer property tests + IF (PRESENT(nphase)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer nphase is not equal to argument. If so, set ltest(jt) to false + IF (trlist%ti(tridx(jt))%nphase /= nphase) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nphase /= nphase) write(0,*) '##DEBUG## ltest(',jt,')=false because nphase/=',nphase + END IF + END DO + END IF + IF (PRESENT(ltran)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is not transported. If so, remove from list + IF (trlist%ti(tridx(jt))%ntran == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%ntran == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because ntran = 0' + END IF + END DO + END IF + IF (PRESENT(ldrydep)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to dry deposition scheme + IF (trlist%ti(tridx(jt))%ndrydep == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%ndrydep == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because ndrydep==0' + END IF + END DO + END IF + IF (PRESENT(lwetdep)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to wet deposition scheme + IF (trlist%ti(tridx(jt))%nwetdep == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nwetdep == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because nwetdep==0' + END IF + END DO + END IF + IF (PRESENT(lsedi)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to sedimentation scheme + IF (trlist%ti(tridx(jt))%nsedi == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nsedi == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because nsedi==0' + END IF + END DO + END IF + IF (PRESENT(lemis)) THEN + DO jt = 1,listsize + IF (tridx(jt) > 0) THEN + ! test if tracer is attached to emissions scheme + IF (trlist%ti(tridx(jt))%nemis == 0) ltest(jt) = .false. +!! IF (trlist%ti(tridx(jt))%nemis == 0) write(0,*) '##DEBUG## ltest(',jt,')=false because nemis==0' + END IF + END DO + END IF + + !-- remove "false" tracers from tracnam list + DO jt = 1,listsize + IF (.NOT. ltest(jt)) tracnam(jt) = '' + END DO + +!###DEBUG### +IF (p_parallel_io) THEN +write(0,*) '---------------------------------------------------------' +write(0,*) 'validate_traclist: final tracnam list' +DO jt=1,listsize +IF (TRIM(tracnam(jt)) /= '') write(0,*) jt,': ',tracnam(jt) +END DO +write(0,*) '---------------------------------------------------------' +END IF + END SUBROUTINE validate_traclist + + + + SUBROUTINE finish_tracer_definition + + ! Description: + ! + ! Set global flags for trlist and print tracer definitions. + ! + ! *finish_tracer_definition* is called from *initialise*. + ! + ! Local scalars: + + INTEGER :: jt + + +! trlist% ntrac = ntrac ! not needed because these fields are synchronized in new_tracer + trlist% anyfixtyp = 0 + trlist% anydrydep = 0 + trlist% anywetdep = 0 + trlist% anysedi = 0 + trlist% anysemis = 0 + trlist% anyvdiff = 0 + trlist% anyconv = 0 + trlist% anyconvmassfix = 0 + trlist% nadvec = COUNT (trlist% ti(1:ntrac)% ntran /= 0) + DO jt=1,ntrac + trlist% anyfixtyp = IOR (trlist% anyfixtyp, trlist% ti(jt)% nfixtyp) + trlist% anydrydep = IOR (trlist% anydrydep, trlist% ti(jt)% ndrydep) + trlist% anywetdep = IOR (trlist% anywetdep, trlist% ti(jt)% nwetdep) + trlist% anysedi = IOR (trlist% anysedi, trlist% ti(jt)% nsedi) + trlist% anysemis = IOR (trlist% anysemis, trlist% ti(jt)% nemis) + trlist% anyvdiff = IOR (trlist% anyvdiff, trlist% ti(jt)% nvdiff) + trlist% anyconv = IOR (trlist% anyconv, trlist% ti(jt)% nconv) + trlist% anyconvmassfix = IOR (trlist% anyconvmassfix, trlist% ti(jt)% nconvmassfix) + END DO + + trlist% oldrestart = .FALSE. + + ! + ! printout + ! +#ifdef HAMMOZ + CALL printtrac +#endif + + END SUBROUTINE finish_tracer_definition + +#endif +!--- initialize burden diagnostics --------------------------------------- + + ! Description: + ! + ! Preparations for diagnostics of tracer burdens (column integrals) + ! + ! Authors: + ! + ! P. Stier, MPI, 2001, original source + ! M. Schultz, FZ Juelich - adaptation to ECHAM6 (2009-09-25) + ! + ! for more details see file AUTHORS + ! + + INTEGER FUNCTION new_diag_burden (name, itype, lclobber) + + USE mo_exception, ONLY : message, em_error, em_info + + ! Arguments + CHARACTER(len=*), INTENT(in) :: name + INTEGER, INTENT(in), OPTIONAL :: itype + LOGICAL, INTENT(in), OPTIONAL :: lclobber ! return existing index if true, error if false + + ! Local variables + INTEGER :: jtype, jn + LOGICAL :: loclob + + ! Set defaults and check arguments + new_diag_burden = -1 + jtype = 1 ! total column mass + IF (PRESENT(itype)) jtype = itype + IF (jtype > 7) CALL message('new_diag_burden', 'ITYPE > 7 presently not implemented!', level=em_error) + loclob = .false. ! return error if burden name already defined + IF (PRESENT(lclobber)) loclob = lclobber + + ! look for existing burden diag of the same name + DO jn = 1,nburden + IF (TRIM(d_burden(jn)%name) == TRIM(name)) THEN + IF (loclob) THEN + new_diag_burden = jn + ELSE + CALL message('new_diag_burden', 'Burden diagnostics with name '//name//' already defined!', & + level=em_error) + END IF + RETURN ! nothing else to be done + END IF + END DO + + ! Add new entry to the list + nburden = nburden + 1 + IF (nburden > nmaxburden) THEN + CALL message('new_diag_burden', 'Maximum number of burden diagnostics exceeded!', level=em_error) + CALL message('new_diag_burden', 'Error occured while trying to add burden diag for '//name, & + level=em_info) + RETURN + END IF + d_burden(nburden)%name = TRIM(name) + d_burden(nburden)%itype = jtype + new_diag_burden = nburden + CALL message('new_diag_burden', 'Defined burden diag for '//name, level=em_info) + + END FUNCTION new_diag_burden + +END MODULE mo_tracer diff --git a/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 new file mode 100755 index 00000000..47c68599 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_tracer_processes.F90 @@ -0,0 +1,411 @@ +!! SPDX-License-Identifier: BSD-3-Clause +!! Copyright (c) 2021 hammoz, MPI fuer Meteorologie, FZJ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +MODULE mo_tracer_processes + + USE mo_kind, ONLY: wp, THRESHOLD + IMPLICIT NONE + + + PRIVATE + + !! Interface routines ! purpose ! called by + PUBLIC :: xt_conv_massfix ! adjust tracer mass in convection + PUBLIC :: xt_borrow ! another mass fixer + +!#ifdef HAMMOZ + !--- module variables + REAL(wp), ALLOCATABLE :: zxtte_old(:,:,:) ! for xt_convmassfix + !$OMP THREADPRIVATE(zxtte_old) +!#endif + CONTAINS + + SUBROUTINE xt_conv_massfix (kproma, kbdim, klev, & + klevp1, ktrac, krow, & + papp1, paphp1, pxtte, & + loini, pxtbound) + + ! *xt_massfix* corrects the tendencies of each column to + ! conserve mass + ! + ! Author: + ! ------- + ! Philip Stier, MPI-Met, 11/2003 + ! + ! Method: + ! ------- + ! To keep the model as closely as possible to the intended physical + ! tendency changes, the correction of the tendencies is + ! imposed proportionally to the absolute values of the + ! applied tendency in each layer. + ! + ! Total mass error tendency [kg m-2 s-1]: + ! + ! dxtdt(jl)=SUM(xtte(jl,jk)*dpg(jl,jk))+xtbound(jl,jk) + ! + ! where xtbound is a boundary condition, i.e. deposition flux + ! + ! Correction proportional to tendency [kg m-2 s-1]: + ! + ! - ABS(xtte(jl,jk)*dpg(jl,jk)) + ! dxtfix(jl,jk) = --------------------------------- * dxdt(jl) + ! SUM(ABS(xtte(jl,jk)*dpg(jl,jk))) + ! + ! Resulting in a corrective tendency [kg kg-1 s-1]: + ! + ! zxttefix(jl,jk) = dxtfix(jl,jk) / dpg(jl,jk) + ! + ! + ! Arguments: + ! ---------- + ! + ! pxtte = cumulative tendency for all tracers [kg kg-1 s-1] + ! + ! Usage: + ! ------ + ! Call twice: first with loini=.TRUE. to store the old tendency + ! then to fix the mass of processes that have modified + ! pxtte meanwhile with the current pxtte and loini=.FALSE. + + USE mo_tracdef, ONLY: trlist ! tracer info variable + USE mo_physical_constants, ONLY: grav + + IMPLICIT NONE + + + !--- Arguments: + INTEGER, INTENT(IN) :: kproma, kbdim, klev, klevp1, ktrac, krow + LOGICAL, INTENT(IN) :: loini + REAL(wp), INTENT(IN) :: papp1(kbdim,klev), & + paphp1(kbdim,klevp1) + REAL(wp), INTENT(INOUT) :: pxtte(kbdim,klev,ktrac) +!>>SF + REAL(wp), INTENT(IN) :: pxtbound(kbdim,ktrac) ! boundary condition (wet deposition) [kg m-2 s-1] +!< 0) THEN + IF(trlist%ti(jt)%nconvmassfix > 0) THEN + + zdxtdt(1:kproma) =0.0_wp + zdxtdtsum(1:kproma)=0.0_wp + + !--- Accumulated tendency since initialization: + zxtte(1:kproma,:)=pxtte(1:kproma,:,jt)-zxtte_old(1:kproma,:,jt) + + !--- Calculate vertically integrated mass error tendency [kg m-2 s-1]: + DO jk=1, klev + DO jl=1, kproma + + zdxtdt(jl)=zdxtdt(jl) +zxtte(jl,jk)*zdpg(jl,jk) + + zdxtdtsum(jl)=zdxtdtsum(jl)+ABS(zxtte(jl,jk)*zdpg(jl,jk)) + + END DO + END DO + +!>>SF + zdxtdt(1:kproma)=zdxtdt(1:kproma)+pxtbound(1:kproma,jt) !SF restore boundary cond. calc. +!< zeps) THEN + + zxttefix=-((ABS(zxtte(jl,jk)*zdpg(jl,jk))/zdxtdtsum(jl))*zdxtdt(jl))/zdpg(jl,jk) + + pxtte(jl,jk,jt)=pxtte(jl,jk,jt)+zxttefix + + END IF + END DO ! kproma + END DO ! klev + + END IF ! nwetdep + END DO ! ktrac + + + END SUBROUTINE xt_conv_massfix + + SUBROUTINE xt_borrow(kproma, kbdim, klev, klevp1, ktrac, & + papp1, paphp1, & + pxtm1, pxtte ) + + ! *xt_borrow* borrowing scheme to correct for negative + ! tracer masses conserveing mass within the + ! column + ! Note by SF: actually, the scheme is also good for non-mass tracers, therefore it is + ! now applied to all transported tracers. + ! + ! Author: + ! ------- + ! Philip Stier, MPI-Met, 06/2004 + ! + ! Method: + ! ------- + ! If negative tracer values occur the scheme is iteratively + ! borrowing tracer mixing ratios from the grid-box below. + ! If the lowest layer can not compensate for accumulated remaining + ! corrections, the procedure is repeated from bottom to top. + ! + ! Restrictions: + ! ------------- + ! Columns with a negative total integrated tracer + ! content are set to zero despite the associated mass + ! error. + + USE mo_physical_constants, ONLY: grav + USE mo_time_control, ONLY: time_step_len + USE mo_tracdef, ONLY: trlist, AEROSOLMASS, GAS, AEROSOLNUMBER + USE mo_advection, ONLY: no_advection !SF #246 + USE mo_submodel, ONLY: lmoz !csld #330 + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: kproma, kbdim, klev, klevp1, ktrac + REAL(wp),INTENT(IN) :: papp1(kbdim,klev), paphp1(kbdim,klevp1) + REAL(wp),INTENT(IN) :: pxtm1(kbdim,klev,ktrac) + REAL(wp),INTENT(INOUT) :: pxtte(kbdim,klev,ktrac) + + !--- Local variables: + + INTEGER :: jl, jk, jt + + REAL(wp):: zxtp1, ztmst, zeps + + REAL(wp):: zxtbor(kbdim) + + REAL(wp):: zdpg(kbdim,klev) + + LOGICAL :: lborrtrac !csld #330 : determines if the tracer can be borrowed or not + + !--- 0) Initializations: + ztmst=time_step_len + zeps=10._wp*THRESHOLD ! Original was: 10._wp*EPSILON(1.0_wp) + + !--- 1) Calculate auxiliary variable dp/g : + + !--- Uppermost level: + + zdpg(1:kproma,1)=2._wp*(paphp1(1:kproma,2)-papp1(1:kproma,1))/grav + + !--- Other levels: + + DO jk=2, klev + + zdpg(1:kproma,jk)=(paphp1(1:kproma,jk+1)-paphp1(1:kproma,jk))/grav + + END DO + + !--- 2) Borrowing scheme: + + DO jt=1, ktrac + + !>>csld #330 + ! use xt_borrow on all aerosols species + lborrtrac = trlist%ti(jt)%nphase == AEROSOLMASS .OR. trlist%ti(jt)%nphase == AEROSOLNUMBER + + IF (.NOT. lmoz) THEN ! in case of "ham only" runs, use of xt_borrow on gaz species as well + lborrtrac = lborrtrac .OR. (trlist%ti(jt)%nphase == GAS) + END IF + + IF ( (trlist%ti(jt)%ntran /= no_advection) .AND. & !SF #246 exclude non-advected tracers + lborrtrac) THEN + !< 0.0_wp ) THEN + + !--- Subtract corrected tracer mass from current layer: + ! (zxtbor is negative) + + pxtte(jl,jk,jt)=pxtte(jl,jk,jt)+zxtbor(jl)/(zdpg(jl,jk)*ztmst) + + !--- Reset mass correction: + + zxtbor(jl)=0.0_wp + + ELSE + + !--- Adjust tendency to yield zero: + + pxtte(jl,jk,jt)=-pxtm1(jl,jk,jt)/ztmst + + !--- Add correcting mass mixing ratio and convert to [kg m-2]: + ! (implicit summation due to the inclusion + ! of zxtbor(jk-1) in zxtp1) + + zxtbor(jl)=zxtp1*zdpg(jl,jk) + + END IF + + END DO + END DO + + !--- If surface layer cannot compensate accumulated correction: + ! Iterate from bottom to top + + DO jk=klev, 1, -1 + DO jl=1, kproma + IF (zxtbor(jl) < -zeps) THEN + + !--- Check if corrected mass, including the fix of the layer below, + ! yields a negative mixing ratio: + ! (Convert mass correction converted to [kg kg-1] in current layer) + + zxtp1=pxtm1(jl,jk,jt)+pxtte(jl,jk,jt)*ztmst + zxtbor(jl)/zdpg(jl,jk) + + IF ( zxtp1 > 0.0_wp ) THEN + + !--- Subtract corrected tracer mass from current layer: + ! (zxtbor is negative) + + pxtte(jl,jk,jt)=pxtte(jl,jk,jt)+zxtbor(jl)/(zdpg(jl,jk)*ztmst) + + !--- Reset mass correction: + + zxtbor(jl)=0.0_wp + + ELSE + + !--- Adjust tendency to yield zero: + + pxtte(jl,jk,jt)=-pxtm1(jl,jk,jt)/ztmst + + !--- Add correcting mass mixing ratio and convert to [kg m-2]: + ! (implicit summation due to the inclusion + ! of zxtbor(jk-1) in zxtp1) + + zxtbor(jl)=zxtp1*zdpg(jl,jk) + + END IF + + END IF + END DO + END DO + + END IF + END DO + + END SUBROUTINE xt_borrow + + + + + + +!!mgs!! ------- obsolete code (perhaps re-use some parts of this to enhance burden diag? ------ +!!mgs!! SUBROUTINE trastat +!!mgs!! +!!mgs!! ! Description: +!!mgs!! ! +!!mgs!! ! Prints out accumulated mass budgets for tracers at +!!mgs!! ! the end of a run +!!mgs!! +!!mgs!! USE mo_control, ONLY: ngl +!!mgs!! USE mo_mpi, ONLY: p_sum, p_communicator_d, p_pe, p_io +!!mgs!! +!!mgs!! ! Local scalars: +!!mgs!! REAL(wp) :: zmglob, zmnhk, zmshk, zmstrat, zmtrop, zqcount +!!mgs!! INTEGER :: jt +!!mgs!! +!!mgs!! ! Local arrays: +!!mgs!! REAL(wp) :: zmstratn(ntrac+1), zmstrats(ntrac+1), zmtropn(ntrac+1), & +!!mgs!! zmtrops(ntrac+1) +!!mgs!! +!!mgs!! ! Intrinsic functions +!!mgs!! INTRINSIC SUM +!!mgs!! +!!mgs!! +!!mgs!! ! Executable statements +!!mgs!! +!!mgs!! zqcount = 1.0_wp/(REAL(icount,wp)) +!!mgs!! IF (p_pe == p_io) THEN +!!mgs!! CALL message('',' Tracer mass budget:') +!!mgs!! CALL message('',separator) +!!mgs!! CALL message('',' Averaged mass budgets in [kg] ') +!!mgs!! CALL message('',' global n-hem s-hem tropo strat n-tro s-tro n-str s-str ') +!!mgs!! ENDIF +!!mgs!! DO jt = 1, ntrac + 1 +!!mgs!! zmtropn(jt) = SUM(tropm(1:ngl/2,jt)) * zqcount +!!mgs!! zmstratn(jt) = SUM(stratm(1:ngl/2,jt)) * zqcount +!!mgs!! zmtrops(jt) = SUM(tropm(ngl/2+1:ngl,jt)) * zqcount +!!mgs!! zmstrats(jt) = SUM(stratm(ngl/2+1:ngl,jt)) * zqcount +!!mgs!! END DO +!!mgs!! zmtropn = p_sum (zmtropn, p_communicator_d) +!!mgs!! zmstratn = p_sum (zmstratn, p_communicator_d) +!!mgs!! zmtrops = p_sum (zmtrops, p_communicator_d) +!!mgs!! zmstrats = p_sum (zmstrats, p_communicator_d) +!!mgs!! +!!mgs!! IF (p_pe == p_io) THEN +!!mgs!! DO jt = 1, ntrac + 1 +!!mgs!! zmnhk = zmtropn(jt) + zmstratn(jt) +!!mgs!! zmshk = zmtrops(jt) + zmstrats(jt) +!!mgs!! zmtrop = zmtropn(jt) + zmtrops(jt) +!!mgs!! zmstrat = zmstratn(jt) + zmstrats(jt) +!!mgs!! zmglob = zmnhk + zmshk +!!mgs!! +!!mgs!! IF (jt <= ntrac) THEN +!!mgs!! WRITE (message_text,'(a,i2,9e9.2)') & +!!mgs!! ' Tracer: ', jt, zmglob, zmnhk, & +!!mgs!! zmshk, zmtrop, zmstrat, zmtropn(jt), zmtrops(jt), & +!!mgs!! zmstratn(jt), zmstrats(jt) +!!mgs!! CALL message('',message_text) +!!mgs!! ELSE +!!mgs!! WRITE (message_text,'(a ,9e9.2)') & +!!mgs!! ' Air mass: ', zmglob, zmnhk, & +!!mgs!! zmshk, zmtrop, zmstrat, zmtropn(jt), zmtrops(jt), & +!!mgs!! zmstratn(jt), zmstrats(jt) +!!mgs!! CALL message('',message_text) +!!mgs!! END IF +!!mgs!! END DO +!!mgs!! END IF +!!mgs!! +!!mgs!! END SUBROUTINE trastat +!!mgs!! + +END MODULE mo_tracer_processes + diff --git a/ifs-source/arpifs/m7/module/mo_util_string.F90 b/ifs-source/arpifs/m7/module/mo_util_string.F90 new file mode 100644 index 00000000..4cb505a6 --- /dev/null +++ b/ifs-source/arpifs/m7/module/mo_util_string.F90 @@ -0,0 +1,126 @@ +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + +MODULE mo_util_string + !---------------------------------------------- + ! This module holds string conversion utilities + !---------------------------------------------- + USE mo_kind, ONLY: dp + IMPLICIT NONE + PRIVATE + PUBLIC :: tolower ! Conversion : 'ABCXYZ' -> 'abcxyz' + PUBLIC :: toupper ! Conversion : 'abcxyz' -> 'ABCXYZ' + PUBLIC :: char2 ! Conversion : INTEGER -> CHAR (LEN=2) + PUBLIC :: separator ! Format string: (/"-----...-----"/) + PUBLIC :: int2string ! returns integer n as a string + PUBLIC :: real2string ! returns real n as a string + PUBLIC :: logical2string ! returns logical n as a string + !----------------- + ! module variables + !----------------- + CHARACTER(len=*), PARAMETER :: separator = REPEAT('-',78) +!============================================================================== +CONTAINS +!============================================================================== + FUNCTION tolower (upper) + !----------------------------------- + ! Conversion: Uppercase -> Lowercase + !----------------------------------- + CHARACTER(LEN=*) ,INTENT(in) :: upper + CHARACTER(LEN=LEN_TRIM(upper)) :: tolower + + INTEGER :: i + INTEGER ,PARAMETER :: idel = ICHAR('a')-ICHAR('A') + + DO i=1,LEN_TRIM(upper) + IF (ICHAR(upper(i:i)) >= ICHAR('A') .AND. & + ICHAR(upper(i:i)) <= ICHAR('Z')) THEN + tolower(i:i) = CHAR( ICHAR(upper(i:i)) + idel ) + ELSE + tolower(i:i) = upper(i:i) + END IF + END DO + + END FUNCTION tolower +!------------------------------------------------------------------------------ + FUNCTION toupper (lower) + !----------------------------------- + ! Conversion: Lowercase -> Uppercase + !----------------------------------- + CHARACTER(LEN=*) ,INTENT(in) :: lower + CHARACTER(LEN=LEN_TRIM(lower)) :: toupper + + INTEGER :: i + INTEGER ,PARAMETER :: idel = ICHAR('A')-ICHAR('a') + + DO i=1,LEN_TRIM(lower) + IF (ICHAR(lower(i:i)) >= ICHAR('a') .AND. & + ICHAR(lower(i:i)) <= ICHAR('z')) THEN + toupper(i:i) = CHAR( ICHAR(lower(i:i)) + idel ) + ELSE + toupper(i:i) = lower(i:i) + END IF + END DO + + END FUNCTION toupper +!------------------------------------------------------------------------------ + FUNCTION char2 (i, zero) + !---------------------------------------- + ! Conversion: INTEGER -> CHARACTER(LEN=2) + !---------------------------------------- + CHARACTER(LEN=2) :: char2 ! result + INTEGER ,INTENT(in) :: i ! argument + CHARACTER ,INTENT(in) ,OPTIONAL :: zero ! padding instead of '0' + + INTEGER ,PARAMETER :: i0 = ICHAR ('0') + + IF (i>99 .OR. i<0) THEN + char2 = '**' + ELSE + char2(1:1) = CHAR( i/10 + i0) + char2(2:2) = CHAR(MOD(i,10) + i0) + ENDIF + + IF(PRESENT(zero)) THEN + IF(char2(1:1) == '0') char2(1:1) = zero + IF(char2(2:2) == '0') char2(2:2) = zero + ENDIF + END FUNCTION char2 +!------------------------------------------------------------------------------ + FUNCTION int2string(n) ! returns integer n as a string (often needed in printing messages) + + INTEGER :: n + CHARACTER(len=10) :: int2string + + WRITE(int2string,'(I10)') n + int2string = ADJUSTL(int2string) + + END FUNCTION int2string +!------------------------------------------------------------------------------ + CHARACTER(len=32) FUNCTION real2string(n) ! returns real n as a string (often needed in printing messages) + + REAL(dp), INTENT(in) :: n + + WRITE(real2string,'(G32.5)') n + real2string = ADJUSTL(real2string) + + END FUNCTION real2string +!------------------------------------------------------------------------------ + CHARACTER(len=10) FUNCTION logical2string(n) ! returns integer n as a string (often needed in printing messages) + + LOGICAL, INTENT(in) :: n + + WRITE(logical2string,'(L10)') n + logical2string = ADJUSTL(logical2string) + + END FUNCTION logical2string + +END MODULE mo_util_string diff --git a/ifs-source/arpifs/m7/module/nd_param.F90 b/ifs-source/arpifs/m7/module/nd_param.F90 new file mode 100644 index 00000000..9af97b44 --- /dev/null +++ b/ifs-source/arpifs/m7/module/nd_param.F90 @@ -0,0 +1,810 @@ +MODULE ND_PARAM + !======================================================================= + ! This is a F90 version of a F77 code + ! *** WRITTEN BY ATHANASIOS NENES + ! *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES + ! *** MODIFIED FOR EC-EARTH3 BY TWAN VAN NOIJE AND ATHANASIOS NENES + ! *** MODIFIED FOR OpenIFS 48R1 BY PHILIPPE LE SAGER (KNMI) + !======================================================================= + + !---Inherited functions, types, variables and constants + USE PARKIND1, ONLY: JPIM, JPRB + USE MO_KIND, ONLY: THRESHOLD + + IMPLICIT NONE + PRIVATE + + !---public member functions + PUBLIC ND_PARAM_SETUP + PUBLIC CCNSPEC + PUBLIC PDFACTIV + + ! Three points is enough for PDF integration using Gauss-Legendre quadrature + INTEGER(KIND=JPIM), PARAMETER :: NPGAUSS=3 + REAL(KIND=JPRB) :: XGS(NPGAUSS), WGS(NPGAUSS) ! Points and weights for GAUSS integration + + ! Maximum number of lognormal modes, set to three for M7 (but basically should be .GE. "NSOL-1 = 3" from TM5M7_DATA) + INTEGER(KIND=JPIM), PARAMETER :: NSMX = 3 + + TYPE, PUBLIC :: NDPARAM + REAL(KIND=JPRB) :: A ! Default FHH adsorption parameters (in the case of FHH-AT) [READ] + REAL(KIND=JPRB) :: B ! See Kumar et al., (2011) ACP [READ] + REAL(KIND=JPRB) :: ACCOM ! Accommodation coefficient [READ] + ! Parcel props + REAL(KIND=JPRB) :: TEMP ! Temperture (K) [READ] + REAL(KIND=JPRB) :: PRES ! Pressure (Pa) [READ] + REAL(KIND=JPRB) :: ALFA ! [COMPUTED] + REAL(KIND=JPRB) :: AKOH ! Kelvin parameter [COMPUTED] + REAL(KIND=JPRB) :: SURT ! Surface Tension for water (J m-2) [COMPUTED] + ! Aerosol params + INTEGER(KIND=JPIM) :: NMD ! Number of lognormal modes effectively used in calculations [READ]. Ideally should be used to allocate DPG/SIG/DPC/TP, for now just be sure that NMD .LE. NSMX + REAL(KIND=JPRB) :: DPG(NSMX) ! Modal diameter (m) [READ for 1:NMD] + REAL(KIND=JPRB) :: SIG(NSMX) ! Geometric dispersion (sigma_g) [READ for 1:NMD] + REAL(KIND=JPRB) :: TP(NSMX) ! Number concentration (#/m3) [READ for 1:NMD] + INTEGER(KIND=JPIM) :: MODE(NSMX) ! Kohler mode [READ for 1:NMD] + REAL(KIND=JPRB) :: DPC(NSMX) ! Critical particle diameter [COMPUTED for 1:NMD] + REAL(KIND=JPRB) :: SG(NSMX) ! [COMPUTED for 1:NMD] + END TYPE NDPARAM + + ! Physical constants + REAL(KIND=JPRB), PARAMETER :: AMA = 29.E-3_JPRB ! Air molecular weight + REAL(KIND=JPRB), PARAMETER :: GRAV = 9.81_JPRB ! g constant + REAL(KIND=JPRB), PARAMETER :: RGAS = 8.31_JPRB ! Universal gas constant + REAL(KIND=JPRB), PARAMETER :: Dw = 2.75E-10_JPRB ! Water Molecule Diameter + REAL(KIND=JPRB), PARAMETER :: AMW = 18.E-3_JPRB ! Water molecular weight + REAL(KIND=JPRB), PARAMETER :: DENW = 1E+3_JPRB ! Water density + REAL(KIND=JPRB), PARAMETER :: DHV = 2.25E+6_JPRB ! Water enthalpy of vaporization + REAL(KIND=JPRB), PARAMETER :: CPAIR= 1.0061E+3_JPRB ! Air Cp + + ! Data for FHH exponent calculation + ! for C1 + REAL(KIND=JPRB), PARAMETER :: D11 = -0.1907_JPRB + REAL(KIND=JPRB), PARAMETER :: D12 = -1.6929_JPRB + REAL(KIND=JPRB), PARAMETER :: D13 = 1.4963_JPRB + REAL(KIND=JPRB), PARAMETER :: D14 = -0.5644_JPRB + REAL(KIND=JPRB), PARAMETER :: D15 = 0.0711_JPRB + ! for C2 + REAL(KIND=JPRB), PARAMETER :: D21 = -3.9310_JPRB + REAL(KIND=JPRB), PARAMETER :: D22 = 7.0906_JPRB + REAL(KIND=JPRB), PARAMETER :: D23 = -5.3436_JPRB + REAL(KIND=JPRB), PARAMETER :: D24 = 1.8025_JPRB + REAL(KIND=JPRB), PARAMETER :: D25 = -0.2131_JPRB + ! for C3 + REAL(KIND=JPRB), PARAMETER :: D31 = 8.4825_JPRB + REAL(KIND=JPRB), PARAMETER :: D32 = -14.9297_JPRB + REAL(KIND=JPRB), PARAMETER :: D33 = 11.4552_JPRB + REAL(KIND=JPRB), PARAMETER :: D34 = -3.9115_JPRB + REAL(KIND=JPRB), PARAMETER :: D35 = 0.4647_JPRB + ! for C4 + REAL(KIND=JPRB), PARAMETER :: D41 = -5.1774_JPRB + REAL(KIND=JPRB), PARAMETER :: D42 = 8.8725_JPRB + REAL(KIND=JPRB), PARAMETER :: D43 = -6.8527_JPRB + REAL(KIND=JPRB), PARAMETER :: D44 = 2.3514_JPRB + REAL(KIND=JPRB), PARAMETER :: D45 = -0.2799_JPRB + ! + INTEGER(KIND=JPIM), PARAMETER :: MAXIT = 30 ! Max iterations for solution + REAL(KIND=JPRB), PARAMETER :: EPS = 1.E-5_JPRB ! Convergence criterion + ! + REAL(KIND=JPRB), PARAMETER :: PI = 3.1415927_JPRB ! Some constants + REAL(KIND=JPRB), PARAMETER :: ZERO = 0.0_JPRB + REAL(KIND=JPRB), PARAMETER :: GREAT = 1.E+30_JPRB + REAL(KIND=JPRB), PARAMETER :: SQ2PI = 2.5066282746_JPRB + +CONTAINS + + SUBROUTINE ND_PARAM_SETUP + ! + ! ** CALCULATE GAUSS QUADRATURE POINTS + ! + CALL GAULEG (XGS, WGS, NPGAUSS) + + END SUBROUTINE ND_PARAM_SETUP + +!======================================================================= +! +! *** SUBROUTINE CCNSPEC +! *** THIS SUBROUTINE CALCULATES THE CCN SPECTRUM OF THE AEROSOL USING +! THE APPROPRIATE FORM OF KOHLER THEORY +! +! *** ORIGINALLY WRITTEN BY ATHANASIOS NENES FOR ONLY KOHLER PARTICLES +! *** MODIFIED BY PRASHANT KUMAR AND ATHANSIOS NENES TO INCLUDE +! *** ACTIVATION BY FHH PARTICLES +! +!======================================================================= + + SUBROUTINE CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NMODES, & + AKKI,A,B,ACCOM,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: TPI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: DPGI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: SIGI(NMODES) + INTEGER(KIND=JPIM), INTENT(IN) :: MODEI(NMODES) + REAL(KIND=JPRB), INTENT(IN) :: TPARC + REAL(KIND=JPRB), INTENT(IN) :: PPARC + INTEGER(KIND=JPIM), INTENT(IN) :: NMODES + REAL(KIND=JPRB), INTENT(IN) :: AKKI(NMODES), A, B, ACCOM + + TYPE(NDPARAM), INTENT(OUT) :: BOX + + REAL(KIND=JPRB), PARAMETER :: ZEPS = 1E-9_JPRB !eehol: small value for diameter (1e-8 = 0.01 um) + REAL(KIND=JPRB) :: Dpcm, PAR1, PAR2 + INTEGER(KIND=JPIM) :: I,K + +#include "abor1.intfb.h" + + ! Check + IF (NMODES > NSMX ) THEN + CALL ABOR1('CCNSPEC: NMODES must be .LE. NSMX. Increase NSMX') + ENDIF + + ! Store aerosol params, parcel properties, etc. + ! + BOX%A = A ! Default FHH adsorption parameters (in the case of FHH-AT) + BOX%B = B ! See Kumar et al., (2011) ACP + BOX%ACCOM = ACCOM ! Accommodation coefficient + BOX%NMD = NMODES + DO I=1,BOX%NMD + BOX%MODE(I)= MODEI(I) + BOX%DPG(I) = DPGI(I) + BOX%SIG(I) = SIGI(I) + BOX%TP(I) = TPI(I) + ENDDO + + BOX%TEMP = TPARC ! Temperature (K) + BOX%PRES = PPARC ! Pressure (Pa) + + ! Thermophysical properties + BOX%SURT = SFT(TPARC) ! Surface Tension for water (J m-2) + BOX%AKOH = 4._JPRB*AMW*BOX%SURT/RGAS/BOX%TEMP/DENW ! Kelvin parameter + BOX%ALFA = GRAV*AMW*DHV/CPAIR/RGAS/TPARC/TPARC - GRAV*AMA/RGAS/TPARC ! Need to store this intermediate variable, because it is used in SINTEGRAL + + DO K=1,BOX%NMD + IF (MODEI(K).EQ.1) THEN ! Kohler modes + IF (DPGI(K).GE.ZEPS) THEN !eehol: add treshold if median diam is low + PAR1 = 4._JPRB/27._JPRB/AKKI(K)/DPGI(K)**3 + PAR2 = SQRT(PAR1*BOX%AKOH**3) + BOX%SG(K) = EXP(PAR2) - 1._JPRB + ELSE + BOX%SG(K) = ZERO + END IF + ELSEIF (MODEI(K).EQ.2) THEN ! FHH modes + CALL DpcFHH(DPGI(K),BOX,Dpcm) + BOX%DPC(K) = Dpcm + BOX%SG(K) = (BOX%AKOH/Dpcm)+(-A*(((Dpcm-DPGI(K))/(2*Dw))**(-B))) + ENDIF + ENDDO + + !open(unit=667, file='stuffxxx', access='append', status='unknown') + !write(667,*) TEMP, PRES, AKOH, AMW, SURT, RGAS, DENW, SG + !close(667) + + END SUBROUTINE CCNSPEC + +!C======================================================================= +!C +!C *** SUBROUTINE DpcFHH +!C *** THIS SUBROUTINE CALCULATES THE CRITICAL PARTICLE DIAMETER +!C ACCORDING TO THE FHH ADSOSPRTION ISOTHERM THEORY. +!C +!C *** WRITTEN BY PRASHANT KUMAR AND ATHANASIOS NENES +!C +!C======================================================================= + + SUBROUTINE DPCFHH(DDRY,BOX,DC) + + REAL(KIND=JPRB), INTENT(IN) :: DDRY + TYPE(NDPARAM), INTENT(IN) :: BOX + REAL(KIND=JPRB), INTENT(OUT) :: DC + + REAL(KIND=JPRB) :: mu,mu1,mu2,mu3,X1,X2l,Dpcm,Dpcl,Dpcu,TEMP,SURT, A, B + REAL(KIND=JPRB) :: X3l,X2u,X3u,FDpcl,FDpcu,FDpcm,X2m,X3m + + ! inputs + SURT = BOX%SURT + TEMP = BOX%TEMP + A = BOX%A + B = BOX%B + + mu=(4._JPRB*SURT*AMW)/(RGAS*TEMP*DENW) + mu1=(mu*2._JPRB*Dw)/((A*B)*((2._JPRB*Dw)**(B+1._JPRB))) + mu2=1._JPRB/mu1 + mu3=1._JPRB-(mu2**(1._JPRB/(1._JPRB+B))) + + Dpcl = 0._JPRB !Lower Limit + Dpcu = 10.E-4_JPRB !Upper Limit + + DO + + X1 = mu2**(1._JPRB/(1._JPRB+B)) + X2l = Dpcl**(2._JPRB/(1._JPRB+B)) + X3l = X1*X2l + FDpcl=((Dpcl-X3l)/Ddry)-1._JPRB + + X1 = mu2**(1._JPRB/(1._JPRB+B)) + X2u = Dpcu**(2._JPRB/(1._JPRB+B)) + X3u = X1*X2u + FDpcu=((Dpcu-X3u)/Ddry)-1._JPRB + + Dpcm = (Dpcu+Dpcl)/2._JPRB + + X1= mu2**(1._JPRB/(1._JPRB+B)) + X2m= Dpcm**(2._JPRB/(1._JPRB+B)) + X3m= X1*X2m + FDpcm=((Dpcm-X3m)/Ddry)-1._JPRB + + IF ((FDPCL*FDPCM).LE.0._JPRB) THEN + + IF (ABS(FDPCM).LE.10.E-8_JPRB) THEN + EXIT + ELSE + DPCL = DPCL + DPCU = DPCM + END IF + + ELSE IF ((FDPCL*FDPCM).GE.0._JPRB) THEN + + IF (ABS(FDPCM).LE.10.E-8_JPRB) THEN + EXIT + ELSE + DPCL = DPCM + DPCU = DPCU + END IF + +! ELSE IF ((FDPCL*FDPCM).EQ.0) THEN + ELSE + EXIT + END IF + + END DO + + DC = DPCM + + END SUBROUTINE DPCFHH + +!C======================================================================= +!C +!C *** SUBROUTINE PDFACTIV +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (2004). THIS ROUTINE CALCULATES FOR A PDF OF +!C UPDRAFT VELOCITIES. +!C +!C *** WRITTEN BY ATHANASIOS NENES +!C +!C======================================================================= + + SUBROUTINE PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: WPARC, SIGW + REAL(KIND=JPRB), INTENT(OUT) :: NACT, SMAX + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: NACTI, SMAXI, DENOM, WPI + REAL(KIND=JPRB) :: A, B, ACCOM, PDF, WHI, WLO, SCAL, PROBI + INTEGER(KIND=JPIM) :: I + + REAL(KIND=JPRB), PARAMETER :: PLIMT = 1.0E-3_JPRB + ! + ! *** Single updraft case + ! + IF (SIGW.LT.1.e-10_JPRB) THEN + ! + ! *** Case where updraft is very small + ! + IF (WPARC.LE.1.0E-6_JPRB) THEN + SMAX = 0.0_JPRB + NACT = 0.0_JPRB + RETURN + ENDIF + + CALL ACTIVATE (WPARC,NACT,SMAX,BOX) + ! + ! *** PDF of updrafts + ! + ELSE + NACT = ZERO + SMAX = ZERO + DENOM = ZERO + PROBI = SQRT(-2.0_JPRB*LOG(PLIMT*SIGW*SQ2PI)) ! Probability of High Updraft limit + WHI = WPARC + SIGW*PROBI ! Upper updrft limit + ! No need to cut off the PDF at 0.05 m/s. + ! Using a lower value will change the normalization. + ! WLO = 0.05 ! Low updrft limit + WLO = 0.0_JPRB + SCAL = 0.5_JPRB*(WHI-WLO) ! Scaling for updrafts + !open(unit=667,file='pgaussxx',access='append',status='unknown') + DO I=1,NPGAUSS + ! Points are symmetric around zero, + ! so the sign of the XGS term is irrelevant. + ! As the convention is to use a plus sign, + ! we change the minus from the original code into a plus: + !WPI = WLO + SCAL*(1.0-XGS(i)) ! Updraft + WPI = WLO + SCAL*(1.0_JPRB+XGS(i)) ! Updraft + + ! Catch very small velocities using the same cutoff as above + IF (WPI.LE.1.0E-6_JPRB) THEN + SMAXI = 0.0_JPRB + NACTI = 0.0_JPRB + ELSE + CALL ACTIVATE (WPI,NACTI,SMAXI,BOX) ! # of drops + ENDIF + PDF = (1.0_JPRB/SQ2PI/SIGW)*EXP(-0.5_JPRB*((WPI-WPARC)/SIGW)**2) ! Prob. of updrafts + NACT = NACT + WGS(i)*(PDF*NACTI) ! Integral for drops + SMAX = SMAX + WGS(i)*(PDF*SMAXI) ! Integral for Smax + DENOM = DENOM + WGS(i)*PDF + IF (PDF.LT.PLIMT) EXIT + !write(667,*) NpGauss, i, nacti, smaxi + ENDDO + NACT = NACT/DENOM + SMAX = SMAX/DENOM + !close(667) + ENDIF + + END SUBROUTINE PDFACTIV + +!C======================================================================= +!C +!C *** SUBROUTINE ACTIVATE +!C *** THIS SUBROUTINE CALCULATES THE CCN ACTIVATION FRACTION ACCORDING +!C TO THE Nenes and Seinfeld (2003) PARAMETERIZATION, WITH +!C MODIFICATION FOR NON-CONTUNUUM EFFECTS AS PROPOSED BY Fountoukis +!C and Nenes (in preparation). +!C +!C *** WRITTEN BY ATHANASIOS NENES FOR KOHLER PARTICLES +!C *** MODIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= + + + SUBROUTINE ACTIVATE (WPARC,NDRPL,SMAX,BOX) + + REAL(KIND=JPRB), INTENT(IN) :: WPARC + REAL(KIND=JPRB), INTENT(OUT) :: NDRPL, SMAX + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: TEMP, PRES, AKOH, A, B, ACCOM + REAL(KIND=JPRB) :: PRESA, AKA, DAIR, PSAT, DV, DBIG, DLOW, COEF, ALFA, BET1 + REAL(KIND=JPRB) :: WPARCEL, BET2, BETA, CF1, CF2 + REAL(KIND=JPRB) :: C1, C2, C3, C4, X_FHH + REAL(KIND=JPRB) :: X1, X2, X3, Y1, Y2, Y3, SINTEG1, SINTEG2, SINTEG3 + INTEGER(KIND=JPIM) :: I + + ! Inputs + TEMP = BOX%TEMP + PRES = BOX%PRES + AKOH = BOX%AKOH + ALFA = BOX%ALFA + A = BOX%A + B = BOX%B + ACCOM = BOX%ACCOM + ! + ! *** Setup common block variables + ! + PRESA = PRES/1.013E+5_JPRB ! Pressure (Pa) + AKA = (4.39_JPRB+0.071_JPRB*TEMP)*1.E-3_JPRB ! Air thermal conductivity + DAIR = PRES*AMA/RGAS/TEMP ! Air density + PSAT = VPRES(TEMP)*(1.E+5_JPRB/1.0E+3_JPRB) ! Saturation vapor pressure + DV = (0.211_JPRB/PRESA)*(TEMP/273._JPRB)**1.94 + DV = DV*1.E-4_JPRB ! Water vapor diffusivity in air + DBIG = 5.0E-6_JPRB + DLOW = 0.207683_JPRB*((ACCOM)**(-0.33048_JPRB)) + DLOW = DLOW*1.E-6_JPRB + ! + ! *** Compute an average diffusivity Dv as a function of ACCOM + ! + COEF = ((2._JPRB*PI*AMW/(RGAS*TEMP))**0.5_JPRB) + DV = (DV/(DBIG-DLOW))*((DBIG-DLOW)-(2._JPRB*DV/ACCOM)*COEF* & + (LOG((DBIG+(2._JPRB*DV/ACCOM)*COEF)/(DLOW+(2._JPRB*DV/ACCOM)* & + COEF)))) ! Non-continuum effects + + WPARCEL = WPARC + ! + ! *** Setup constants + ! + BET1 = PRES*AMA/PSAT/AMW + AMW*DHV*DHV/CPAIR/RGAS/TEMP/TEMP + BET2 = RGAS*TEMP*DENW/PSAT/DV/AMW/4._JPRB + & + DHV*DENW/4._JPRB/AKA/TEMP*(DHV*AMW/RGAS/TEMP - 1._JPRB) + BETA = 0.5_JPRB*PI*BET1*DENW/BET2/ALFA/WPARC/DAIR + CF1 = 0.5_JPRB*(((1._JPRB/BET2)/(ALFA*WPARC))**0.5_JPRB) + CF2 = AKOH/3._JPRB + ! + ! DETERMINATION OF EXPONENT FOR FHH PARTICLES + ! + C1 = (D11)+(D12/A)+(D13/(A*A))+(D14/(A*A*A))+(D15/(A*A*A*A)) + C2 = (D21)+(D22/A)+(D23/(A*A))+(D24/(A*A*A))+(D25/(A*A*A*A)) + C3 = (D31)+(D32/A)+(D33/(A*A))+(D34/(A*A*A))+(D35/(A*A*A*A)) + C4 = (D41)+(D42/A)+(D43/(A*A))+(D44/(A*A*A))+(D45/(A*A*A*A)) + X_FHH = (C1) + (C2/B) + (C3/(B*B)) + (C4/(B*B*B)) + ! + ! *** INITIAL VALUES FOR BISECTION ************************************* + ! + X1 = 1.0E-5_JPRB ! Min cloud supersaturation -> 0 + CALL SINTEGRAL (X1,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y1 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X1 - 1._JPRB + ! + X2 = 0.1_JPRB ! MAX cloud supersaturation = 10% + CALL SINTEGRAL (X2,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y2 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X2 - 1._JPRB + ! + ! *** PERFORM BISECTION ************************************************ + ! + DO I=1,MAXIT + X3 = 0.5_JPRB*(X1+X2) + CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB + ! + IF (SIGN(1._JPRB,Y1)*SIGN(1._JPRB,Y3) .LE. ZERO) THEN ! (Y1*Y3 .LE. ZERO) + Y2 = Y3 + X2 = X3 + ELSE + Y1 = Y3 + X1 = X3 + ENDIF + ! + IF (ABS(X2-X1) .LE. EPS*X1) EXIT + + ENDDO + + ! *** CONVERGED ; RETURN *********************************************** + X3 = 0.5_JPRB*(X1+X2) + + CALL SINTEGRAL (X3,NDRPL,WPARCEL,X_FHH,BET2, & + SINTEG1,SINTEG2,SINTEG3,BOX) + Y3 = (SINTEG1*CF1+SINTEG2*CF2+SINTEG3*CF1)*BETA*X3 - 1._JPRB + + SMAX = X3 + + END SUBROUTINE ACTIVATE + +!C======================================================================= +!C +!C *** SUBROUTINE SINTEGRAL +!C *** THIS SUBROUTINE CALCULATES THE CONDENSATION INTEGRALS, ACCORDING +!C TO THE POPULATION SPLITTING ALGORITHM AND THE SUBSEQUENT VERSIONS: +!C +!C - Nenes and Seinfeld (2003) Population Splitting +!C - Fountoukis and Nenes (2004) Modal formulation +!C - Barahona and Nenes (2010) Approach for large CCN +!C - Morales and Nenes (2014) Population Splitting revised +!C +!C *** WRITTEN BY ATHANASIOS NENES for Kohler Particles +!C *** MODFIFIED BY PRASHANT KUMAR AND ATHANASIOS NENES TO INCLUDE FHH +!C PARTICLES +!C======================================================================= + + SUBROUTINE SINTEGRAL (SPAR, SUMMA, WPARCEL, XFHH, BET2, & + SUM, SUMMAT, SUMFHH, BOX) + + REAL(KIND=JPRB), INTENT(IN) :: SPAR + REAL(KIND=JPRB), INTENT(IN) :: WPARCEL + REAL(KIND=JPRB), INTENT(IN) :: XFHH + REAL(KIND=JPRB), INTENT(IN) :: BET2 + + REAL(KIND=JPRB), INTENT(OUT) :: SUMMA, SUM, SUMMAT, SUMFHH + + TYPE(NDPARAM), INTENT(IN) :: BOX + + REAL(KIND=JPRB) :: ND(NSMX), NDF(NSMX) + REAL(KIND=JPRB) :: INTEG1(NSMX), INTEG2(NSMX), INTEG1F(NSMX) + REAL(KIND=JPRB) :: ALFA, AKOH, TP(NSMX), SG(NSMX), SIG(NSMX) + + REAL(KIND=JPRB) :: ERF1C,ERF2,ERF3,ERF4C,ERF5C,ERF6C,ERF4FC,ERF5F + REAL(KIND=JPRB) :: ORISM1, ORISM2, ORISM3, ORISM4, ORISM5,ORISM6 + REAL(KIND=JPRB) :: INTAUX1P1, INTAUX1P2, DLGSP, DLGSP1, DLGSP2, DLGSPF, DLGSGF, DLGSG + REAL(KIND=JPRB) :: RATIO, SCRIT, DW3, SSPLT1, SSPLT2, DESCR, DEQ, EKTH, SQTWO + + REAL(KIND=JPRB) :: ORISM1F, ORISM2F, ORISM3F, ORISM4F, ORISM5F + REAL(KIND=JPRB) :: ORISM6F, ORISM7F, ORISM8F, ORISM9F + LOGICAL :: CRIT2 + INTEGER(KIND=JPIM) :: I,J + + SQTWO = SQRT(2._JPRB) + + ! input + ALFA = BOX%ALFA + AKOH = BOX%AKOH + DO I=1,BOX%NMD + TP(I) = BOX%TP(I) + SG(I) = BOX%SG(I) + SIG(I) = BOX%SIG(I) + ENDDO + + ! ** Population Splitting -- Modified by Ricardo Morales 2014 + + DESCR = 1._JPRB - (16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH/SPAR**2)**2 + + IF (DESCR.LT.THRESHOLD) THEN + CRIT2 = .TRUE. + scrit = ((16._JPRB/9._JPRB)*ALFA*WPARCEL*BET2*(AKOH**2))**(0.25_JPRB) ! Scrit - (only for DELTA < 0 ) + RATIO = (2.0E+7_JPRB/3.0_JPRB)*AKOH*(SPAR**(-0.3824_JPRB)-scrit**(-0.3824_JPRB)) ! Computing sp1 and sp2 (sp1 = sp2) + RATIO = 1._JPRB/SQTWO + RATIO + IF (RATIO.GT.1.0_JPRB) RATIO = 1.0_JPRB + SSPLT2 = SPAR*RATIO + ELSE + CRIT2 = .FALSE. + SSPLT1 = 0.5_JPRB*(1._JPRB-SQRT(DESCR)) ! min root --> sp1 + SSPLT2 = 0.5_JPRB*(1._JPRB+SQRT(DESCR)) ! max root --> sp2 + SSPLT1 = SQRT(SSPLT1)*SPAR ! Multiply ratios with Smax + SSPLT2 = SQRT(SSPLT2)*SPAR + ENDIF + + ! + ! *** Computing the condensation integrals I1 and I2 + ! + SUM = 0.0_JPRB !Contribution of integral 1 for Kohler + SUMMAT = 0.0_JPRB !Contribution of integral 2 for kohler + SUMMA = 0.0_JPRB !Variable that stores all droplets + SUMFHH = 0.0_JPRB !Contribution of FHH integral + + DO J = 1, BOX%NMD + IF (SG(J).GT.(0.0_JPRB)) THEN !eehol: do not calculate if SG=0 or less + + IF (BOX%MODE(J).EQ.1) THEN ! Kohler modes + + DLGSG = LOG(SIG(J)) !ln(sigmai) + DLGSP = LOG(SG(J)/SPAR) !ln(sg/smax) + DLGSP2 = LOG(SG(J)/SSPLT2) !ln(sg/sp2) + + ORISM1 = 2._JPRB*DLGSP2/(3._JPRB*SQTWO*DLGSG) ! u(sp2) + ORISM2 = ORISM1 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(sp2)-3ln(sigmai)/(2sqrt(2) + ORISM5 = 2._JPRB*DLGSP/(3._JPRB*SQTWO*DLGSG) ! u(smax) + ORISM3 = ORISM5 - 3._JPRB*DLGSG/(2._JPRB*SQTWO) ! u(smax)-3ln(sigmai)/(2sqrt(2) + DEQ = AKOH*2._JPRB/SG(j)/3._JPRB/SQRT(3._JPRB) ! Dp0 = Dpc/sqrt(3) - Equilibrium diameter + + ERF2 = erf(ORISM2) + ERF3 = erf(ORISM3) + + INTEG2(J) = (EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)*TP(J)/SG(J))* & + (ERF2 - ERF3) ! I2(sp2,smax) + + IF (CRIT2) THEN + + ORISM6 = (SQTWO*DLGSP2/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) + ERF6C = erfc(ORISM6) + + INTEG1(J) = 0.0_JPRB + DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles + ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) + + ELSE + + EKTH = EXP(9._JPRB/2._JPRB*DLGSG*DLGSG) + ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp2) + 3ln(sigmai)/sqrt(2) + ERF1C = erfc(ORISM1) + ERF4C = erfc(ORISM4) + + intaux1p2 = TP(J)*SPAR*(ERF1C - & + 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp2) + + + IF (SSPLT1.LT.TINY(SSPLT1)) THEN + + INTEG1(J) = intaux1p2 + DW3 = 0.0_JPRB + ELSE + + DLGSP1 = LOG(SG(J)/SSPLT1) ! ln(sg/sp1) + ORISM1 = 2._JPRB*DLGSP1/(3._JPRB*SQTWO*DLGSG) ! u(sp1) + ORISM4 = ORISM1 + 3._JPRB*DLGSG/SQTWO ! u(sp1) + 3ln(sigmai)/sqrt(2) + ORISM6 = (SQTWO*DLGSP1/3._JPRB/DLGSG)-(1.5_JPRB*DLGSG/SQTWO) + + ERF1C = erfc(ORISM1) + ERF4C = erfc(ORISM4) + ERF6C = erfc(ORISM6) + + intaux1p1 = TP(J)*SPAR*(ERF1C - & + 0.5_JPRB*((SG(J)/SPAR)**2)*EKTH*ERF4C) ! I1(0,sp1) + + INTEG1(J) = (intaux1p2-intaux1p1) ! I1(sp1,sp2) = I1(0,sp2) - I1(0,sp1) + + DW3 = TP(j)*DEQ*EXP(9._JPRB/8._JPRB*DLGSG*DLGSG)* & ! 'inertially' limited particles. + ERF6C*((BET2*ALFA*WPARCEL)**0.5_JPRB) + ENDIF + + ENDIF + + ! *** Calculate number of Drops + + ERF5C = erfc(ORISM5) + ! + Nd(J) = (TP(J)/2.0_JPRB)*ERF5C + SUM = SUM + INTEG1(J) + DW3 !SUM OF INTEGRAL 1 FOR KOHLER + SUMMAT = SUMMAT + INTEG2(J) !SUM OF INTEGRAL 2 FOR KOHLER + SUMMA = SUMMA + Nd(J) !SUM OF ACTIVATED KOHLER PARTICLES + + ELSEIF (BOX%MODE(J).EQ.2) THEN ! FHH modes + + DLGSGF = LOG(SIG(J)) ! ln(sigma,i) + DLGSPF = LOG(SG(J)/SPAR) ! ln(sg/smax) + ORISM1F = (SG(J)*SG(J))/(SPAR*SPAR) ! (sg/smax)^2 + ORISM2F = EXP(2._JPRB*XFHH*XFHH*DLGSGF*DLGSGF) ! exp(term) + ORISM3F = SQTWO*XFHH*DLGSGF ! sqrt(2).x.ln(sigma,i) + ORISM4F = DLGSPF/(-1._JPRB*ORISM3F) ! Umax + ORISM5F = ORISM3F - ORISM4F + ERF5F = erf(ORISM5F) + ORISM6F = ERF5F + ORISM7F = ORISM6F + 1._JPRB + ORISM8F = 0.5_JPRB*ORISM1F*ORISM2F*ORISM7F + ERF4FC = erfc(ORISM4F) + ORISM9F = ORISM8F - ERF4FC + + INTEG1F(J) =-1._JPRB*TP(J)*SPAR*ORISM9F + + ! *** Calculate number of drops activated by FHH theory + ERF4FC = erfc(ORISM4F) + + NdF(J) = (TP(J)/2.0_JPRB)*ERF4FC + SUMFHH = SUMFHH + INTEG1F(J) !Sum of Integral 1 for FHH + SUMMA = SUMMA + NdF(J) !Sum of ACTIVATED Kohler + FHH particles + + ENDIF + ENDIF !eehol: if SG.GT.ZERO + ENDDO + + END SUBROUTINE SINTEGRAL + + !C======================================================================= + !C + !C *** SUBROUTINE PROPS + !C *** THIS SUBROUTINE CALCULATES THE THERMOPHYSICAL PROPERTIES + !C + !C *** WRITTEN BY ATHANASIOS NENES + !C + !C======================================================================= + +! SUBROUTINE PROPS +! +! !REAL(KIND=JPRB) :: VPRES, SFT +! +! !PRESA = PRES/1.013d5 ! Pressure (Pa) +! !DAIR = PRES*AMA/RGAS/TEMP ! Air density +! !AKA = (4.39+0.071*TEMP)*1d-3 ! Air thermal conductivity +! !PSAT = VPRES(SNGL(TEMP))*(1e5/1.0d3) ! Saturation vapor pressure +! !SURT = SFT(SNGL(TEMP)) ! Surface Tension for water (J m-2) +! +! END SUBROUTINE PROPS + + !C======================================================================= + !C + !C *** FUNCTION VPRES + !C *** THIS FUNCTION CALCULATES SATURATED WATER VAPOUR PRESSURE AS A + !C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -50 AND + !C 50 C. + !C + !C========================= ARGUMENTS / USAGE =========================== + !C + !C INPUT: + !C [T] + !C REAL variable. + !C Ambient temperature expressed in Kelvin. + !C OUTPUT: + !C [VPRES] + !C REAL variable. + !C Saturated vapor pressure expressed in mbar. + !C + !C======================================================================= + + REAL(KIND=JPRB) PURE FUNCTION VPRES (T) + + REAL(KIND=JPRB), INTENT(IN) :: T + REAL(KIND=JPRB) :: A(0:6), TTEMP + INTEGER(KIND=JPIM) :: I + + A=(/ 6.107799610E+0_JPRB, 4.436518521E-1_JPRB, 1.428945805E-2_JPRB, & + 2.650648471E-4_JPRB, 3.031240396E-6_JPRB, 2.034080948E-8_JPRB, & + 6.136820929E-11_JPRB /) + + TTEMP = T-273._JPRB + VPRES = A(6)*TTEMP + DO I=5,1,-1 + VPRES = (VPRES + A(I))*TTEMP + ENDDO + VPRES = VPRES + A(0) + RETURN + END FUNCTION VPRES + +!C======================================================================= +!C +!C *** FUNCTION SFT +!C *** THIS FUNCTION CALCULATES WATER SURFACE TENSION AS A +!C FUNCTION OF TEMPERATURE. VALID FOR TEMPERATURES BETWEEN -40 AND +!C 40 C. +!C +!C ======================== ARGUMENTS / USAGE =========================== +!C +!C INPUT: +!C [T] +!C REAL variable. +!C Ambient temperature expressed in Kelvin. +!C +!C OUTPUT: +!C [SFT] +!C REAL variable. +!C Surface Tension expressed in J m-2. +!C +!C======================================================================= + + REAL(KIND=JPRB) PURE FUNCTION SFT (T) + REAL(KIND=JPRB), INTENT(IN) :: T + REAL(KIND=JPRB) :: TPARS + + TPARS = T-273._JPRB + SFT = 0.0761_JPRB - 1.55E-4_JPRB*TPARS + + RETURN + END FUNCTION SFT + + !C *********************************************************************** + !C Calculation of points and weights for N point GAUSS integration + !C *********************************************************************** + SUBROUTINE GAULEG (X,W,N) + + INTEGER(KIND=JPIM), INTENT(IN) :: N + REAL(KIND=JPRB), INTENT(OUT) :: X(N), W(N) + + REAL(KIND=JPRB), PARAMETER :: EPS=1.E-6_JPRB + REAL(KIND=JPRB), PARAMETER :: X1=-1.0_JPRB, X2=1.0_JPRB + + REAL(KIND=JPRB) :: XM, XL, Z, Z1, P1, P2, P3, PP + INTEGER(KIND=JPIM) :: I,J,M + ! + ! Calculation + ! + M=(N+1)/2 + XM=0.5_JPRB*(X2+X1) + XL=0.5_JPRB*(X2-X1) + DO I=1,M + Z=COS(3.141592654_JPRB*(I-.25_JPRB)/(N+.5_JPRB)) + DO + P1=1._JPRB + P2=0._JPRB + DO J=1,N + P3=P2 + P2=P1 + P1=((2._JPRB*J-1._JPRB)*Z*P2-(J-1._JPRB)*P3)/J + ENDDO + PP=N*(Z*P1-P2)/(Z*Z-1._JPRB) + Z1=Z + Z=Z1-P1/PP + IF (ABS(Z-Z1).LE.EPS) EXIT + END DO + + X(I)=XM-XL*Z + X(N+1-I)=XM+XL*Z + W(I)=2._JPRB*XL/((1._JPRB-Z*Z)*PP*PP) + W(N+1-I)=W(I) + ENDDO + RETURN + END SUBROUTINE GAULEG + +!C======================================================================= +!C +!C *** REAL FUNCTION erfp +!C *** THIS SUBROUTINE CALCULATES THE ERROR FUNCTION USING A +!C *** POLYNOMIAL APPROXIMATION +!C +!C======================================================================= + +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) PURE FUNCTION ERFP(X) +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), INTENT(IN) :: X +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB) :: AXX, Y +!USE-ERF/ERFC-BUILTINS REAL(KIND=JPRB), DIMENSION(4), PARAMETER :: AA = (/0.278393_JPRB, 0.230389_JPRB, 0.000972_JPRB, 0.078108_JPRB/) +!USE-ERF/ERFC-BUILTINS +!USE-ERF/ERFC-BUILTINS Y = ABS(X) +!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB + Y*(AA(1)+Y*(AA(2)+Y*(AA(3)+Y*AA(4)))) +!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX +!USE-ERF/ERFC-BUILTINS AXX = AXX*AXX +!USE-ERF/ERFC-BUILTINS AXX = 1._JPRB - (1._JPRB/AXX) +!USE-ERF/ERFC-BUILTINS IF(X.LE.0._JPRB) THEN +!USE-ERF/ERFC-BUILTINS ERFP = -AXX +!USE-ERF/ERFC-BUILTINS ELSE +!USE-ERF/ERFC-BUILTINS ERFP = AXX +!USE-ERF/ERFC-BUILTINS ENDIF +!USE-ERF/ERFC-BUILTINS RETURN +!USE-ERF/ERFC-BUILTINS END FUNCTION ERFP + +END MODULE ND_PARAM diff --git a/ifs-source/arpifs/m7/module/oifs_to_ham.F90 b/ifs-source/arpifs/m7/module/oifs_to_ham.F90 new file mode 100644 index 00000000..fed3d100 --- /dev/null +++ b/ifs-source/arpifs/m7/module/oifs_to_ham.F90 @@ -0,0 +1,82 @@ +MODULE OIFS_to_HAM + + USE mo_ham, ONLY: nclass, naerocomp, subm_ngasspec + + IMPLICIT NONE + + PUBLIC :: init_ind_oifs_ham + +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE OFS_to_HAM (updated 22-MAY-2024) │ +! │ │ +! │ Contains all the variables for needed to make HAM compatible with OIFS. │ +! │ │ +! │ TYPES: │ +! │ - TYPE_GFL_COMP -> ind_oifs_ham_type │ +! │ │ +! │ │ +! │ Author : Eemeli Holopainen (FMI) eemeli.holopainen@fmi.fi │ +! │ ------- │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ │ +! ╘════════════════════════════════════════════════════════════════════════════╛ + + ! Index list for HAM and OIFS tracers + type ind_oifs_ham_type + INTEGER, PUBLIC, ALLOCATABLE :: ind_class_OIFS(:) ! indices of sizeclass OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_OIFS(:) ! indices of mass OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_OIFS(:) ! indices of gas OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_OIFS(:) ! indices of cloud OIFS tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_class_HAM(:) ! indices of sizeclass HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_mass_HAM(:) ! indices of mass HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_gas_HAM(:) ! indices of gas HAM tracers + INTEGER, PUBLIC, ALLOCATABLE :: ind_cloud_HAM(:) ! indices of cloud HAM tracers + end type ind_oifs_ham_type + !<--eehol + + TYPE(ind_oifs_ham_type) :: ind_oifs_ham + !!$OMP THREADPRIVATE(ind_oifs_ham) + +CONTAINS + + SUBROUTINE init_ind_oifs_ham(knclass, knaerocomp, ksubm_ngasspec, kcloudind) + + ! *ind_oif_ham* allocates and initializes the index list for OIFS tracers and HAM tracers + ! Authors: + ! ------- + ! Eemeli Holopainen, FMI 4/2022 + + INTEGER, INTENT(IN) :: knclass, knaerocomp, ksubm_ngasspec, kcloudind + + IF (ALLOCATED(ind_oifs_ham%ind_class_OIFS)) DEALLOCATE(ind_oifs_ham%ind_class_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_class_HAM)) DEALLOCATE(ind_oifs_ham%ind_class_HAM) + IF (ALLOCATED(ind_oifs_ham%ind_mass_OIFS)) DEALLOCATE(ind_oifs_ham%ind_mass_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_mass_HAM)) DEALLOCATE(ind_oifs_ham%ind_mass_HAM) + IF (ALLOCATED(ind_oifs_ham%ind_gas_OIFS)) DEALLOCATE(ind_oifs_ham%ind_gas_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_gas_HAM)) DEALLOCATE(ind_oifs_ham%ind_gas_HAM) + IF (ALLOCATED(ind_oifs_ham%ind_cloud_OIFS)) DEALLOCATE(ind_oifs_ham%ind_cloud_OIFS) + IF (ALLOCATED(ind_oifs_ham%ind_cloud_HAM)) DEALLOCATE(ind_oifs_ham%ind_cloud_HAM) + + ALLOCATE(ind_oifs_ham%ind_class_OIFS(knclass)) + ALLOCATE(ind_oifs_ham%ind_class_HAM(knclass)) + ALLOCATE(ind_oifs_ham%ind_mass_OIFS(knaerocomp)) + ALLOCATE(ind_oifs_ham%ind_mass_HAM(knaerocomp)) + ALLOCATE(ind_oifs_ham%ind_gas_OIFS(ksubm_ngasspec)) + ALLOCATE(ind_oifs_ham%ind_gas_HAM(ksubm_ngasspec)) + ALLOCATE(ind_oifs_ham%ind_cloud_OIFS(kcloudind)) + ALLOCATE(ind_oifs_ham%ind_cloud_HAM(kcloudind)) + + ind_oifs_ham%ind_class_OIFS(:) = 0 + ind_oifs_ham%ind_mass_OIFS(:) = 0 + ind_oifs_ham%ind_gas_OIFS(:) = 0 + ind_oifs_ham%ind_cloud_OIFS(:) = 0 + ind_oifs_ham%ind_class_HAM(:) = 0 + ind_oifs_ham%ind_mass_HAM(:) = 0 + ind_oifs_ham%ind_gas_HAM(:) = 0 + ind_oifs_ham%ind_cloud_HAM(:) = 0 + + END SUBROUTINE init_ind_oifs_ham + +END MODULE OIFS_to_HAM diff --git a/ifs-source/arpifs/m7/module/tm5m7_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_data.F90 new file mode 100644 index 00000000..e9cc21c0 --- /dev/null +++ b/ifs-source/arpifs/m7/module/tm5m7_data.F90 @@ -0,0 +1,534 @@ +MODULE TM5M7_DATA + + ! *TM5M7_DATA* Contains parameters, switches and initialization + ! routines for the tm5m7 aerosol scheme. + ! + ! Authors: + ! -------- + ! E. Vignati (JRC/IES) 2005 + ! P. Stier (MPI) 2001/2002 + ! E. Vignati and J. Wilson (JRC / EI) 2000 + ! V. Huijnen (KNMI): copied from TM5 to IFS code 2020 + + + + +USE PARKIND1, ONLY : JPIM, JPRB + +IMPLICIT NONE + +SAVE + +! Location of lookup tables and refractive indices = directory of the executable +CHARACTER(LEN=256) :: TM5M7_DATADIR='./' + +TYPE MODAL_DATA + REAL(KIND=JPRB), DIMENSION(:,:), POINTER :: d2 ! KLON, KLEV + REAL(KIND=JPRB), DIMENSION(:) , POINTER :: surf ! KLON +END TYPE MODAL_DATA + + !--- 1) Define and pre-set switches for the processes of M7: ----------------------- + + !--- Physical: + + LOGICAL :: lsnucl = .TRUE., & ! nucleation + & lscoag = .TRUE., & ! coagulation + & lscond = .TRUE. ! condensation of H2SO4 + + INTEGER(KIND=JPIM) :: nnucl = 1 ! Choice of the nucleation scheme: + ! nnucl = 1 Vehkamaeki (2002) + ! = 2 Kulmala (1998) -NOT RECOMMENDED- + !--- Technical: + + LOGICAL :: lmass_diag = .FALSE. ! mass balance check in m7_interface + + !--- 2) Numbers of compounds and modes of m7: -------------------------------------- + + INTEGER(KIND=JPIM), PARAMETER :: naermod=23, & !number of all compounds + & nmod=7, & !number of modes + & nss=2, & !number of sea salt compounds + & nsol=4, & !number of soluble compounds + & ngas=3, & !number of gaseous compounds + & nsulf=4, & !number of sulfate compounds + & ncomp=5 !number of compounds + + !--- 3) List of indexes corresponding to the compound masses and mode numbers:------ + + !--- 3.1) Mass index (in array aerml and ttn): + ! + ! Attention: + ! The mass of sulfate compounds is always given in [molec. cm-3] + ! whilst the mass of other compounds is given in [ug cm-3]. + ! + ! Compounds: + ! + ! so4 = sulphate + ! bc = black carbon + ! oc = organic carbon, + ! ss = sea salt + ! du = dust + ! + ! Modes: + ! + ! n = nucleation mode + ! k = aitken mode + ! a = accumulation mode + ! c = coarse mode + ! + ! Type: + ! + ! s = soluble mode + ! i = insoluble mode + ! COMPOUND: + INTEGER(KIND=JPIM), PARAMETER :: & + & iso4ns=1, iso4ks=2, iso4as=3, iso4cs=4, & !- Sulfate + & ibcks =5, ibcas =6, ibccs =7, ibcki =8, & !- Black Carbon + & iocks =9, iocas=10, ioccs=11, iocki=12, & !- Organic Carbon + & issas=13, isscs=14, & !- Sea Salt + & iduas=15, iducs=16, iduai=17, iduci=18,& !- Dust + & isoans=19,isoaks=20,isoaas=21,isoacs=22,isoaki=23 !- SOA + ! MODE: | | | | | + ! nucl . | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! solub le | soluble | soluble | soluble | insol. | insol. | insol. | + + + !--- 3.2) Number index (in array aernl): + ! + + INTEGER(KIND=JPIM), PARAMETER :: & + & inucs=1, iaits=2, iaccs=3, icoas=4, iaiti=5, iacci=6, icoai=7 + ! MODE: | | | | | + ! nucl. | aitk. | acc. | coar. | aitk. | acc. | coar. | + ! soluble | soluble | soluble | soluble | insol. | insol. | insol. | + + + !--- 4) Definition of the modes of M7: ------------------------------------------------------ + + !--- 4.1) Threshold radii between the different modes [cm]: + ! Used for the repartititioning in m7_dconc. + ! crdiv(jmod) is the lower bound and crdiv(jmod+1) is + ! the upper bound of the respective geometric mode + ! Default value for nucleation mode is modified by the + ! choice of the nuclation scheme. + + REAL(KIND=JPRB) :: crdiv(4)=(/ 0.0005E-4, 0.005E-4, 0.05E-4, 0.5E-4 /) + ! | | | + ! | | | + ! nucleation -- aitken - accum -- coarse mode + + !--- 4.2) Standard deviation for the modes: + + REAL(KIND=JPRB), PARAMETER :: sigma(nmod)=(/ 1.59, 1.59, 1.59, 2.00, 1.59, 1.59, 2.00 /) + + !--- Natural logarithm of the standard deviation of each mode: + ! Calulated in m7_initialize. + + REAL(KIND=JPRB) :: sigmaln(nmod) + + !--- 5) Conversion factors for lognormal particle size distributions: ------------- + ! Calulated in m7_initialize. + + REAL(KIND=JPRB) :: cmr2ras(nmod) ! Conversion factor: count median radius to radius of average surface + + REAL(KIND=JPRB) :: cmr2mmr(nmod) ! Conversion factor: count median radius to mass mean radius + + REAL(KIND=JPRB) :: cmedr2mmedr(nmod) ! Conversion factor: count median radius to mass median radius + + REAL(KIND=JPRB) :: cmr2ram(nmod) ! Conversion factor: count median radius to radius of average mass + + REAL(KIND=JPRB) :: ram2cmr(nmod) ! Conversion factor: radius of average mass to count median radius + + + !--- 6) Assumed thresholds for occurence of specific quantities: ------------- + !@@@ To be done! + + ! REAL, PARAMETER :: cmin_aerml = 1.E-15 , ! Aerosol mass + ! cmin_aernl = 1.E-10 , ! Aerosol number + ! + + !--- 7) Chemical constants: ---------------------------------------------------- + ! + !--- Accomodation coefficient of H2SO4 on aerosols: + ! (reduced for insoluble modes) + + REAL(KIND=JPRB), PARAMETER :: caccso4(nmod) = (/ 1.0, 1.0, 1.0, 1.0, 0.3, 0.3, 0.3 /) + + !--- Critical relative humidity: + + REAL(KIND=JPRB), PARAMETER :: crh = 0.45 ! Assumed relative humidity for the + ! Na2SO4 / NaCl system below which + ! crystalization occurs. + ! (estimated from Tang, I.N.; JGR 102, D2 1883-1893) + + !--- 8) Physical constants: ---------------------------------------------------- + ! + !--- 8.1) General physical constants: + + REAL(KIND=JPRB), PARAMETER :: & + & bk = 1.38e-16, & ! Bolzman constant [] + & avo = 6.02217E+23,& ! Avogadro number [mol-1] + & rerg = 8.314E+7, & ! Ideal gas constant [erg.K-1.mole-1] + & r_kcal = 1.986E-3 ! Ideal gas constant [kcal K-1.mole-1] + + !--- 8.2) Type specific physical constants: + ! + REAL(KIND=JPRB), PARAMETER :: & + & dh2so4 = 1.841, & ! Density H2SO4 [g cm-3] + & ddust = 2.650, & ! Density du [g cm-3] + !>>> TvN + ! The density of BC is in the range 1.7 to 1.9 g/cm3. + ! (Bond and Bergstrom, Aerosol Sci. Technol., 2006). + ! We therefore adopt a value of 1.8 g/cm3. + ! Details can be found in Bond et al. (JGR, 2013), + ! and references therein: + ! Park et al. (J. Nanoparticle Research, 2004) measured + ! 1.77 +- 0.07 g/cm3 for the non-volatile components of diesel soot, + ! and give a range 1.7-1.8 g/cm3 in their conclusions. + ! Kondo et al. (Aerosol Sci. Techn., 2011) measured + ! 1.718 +- 0.004 g/cm3 for fullerene soot. + ! Schmid et al. (Environ. Sci. Technol., 2009) + ! derive a value 1.8 +- 0.2 g/cm3 + ! for elemental carbon from biomass burning. + ! For comparison, in GLOMAP a value of 1.5 g/cm3 is used. + ! Note that these density estimates measure the mass per volume + ! occupied by the spherules, as should be the case: + ! "If the radiative forcing of BC particles is to be + ! calculated from their mass concentrations, + ! as it is usually the case, density should represent + ! the material density of the spherules, and not that + ! of their ramiform (branched) or aciniform (packed) aggregates." + ! (A. Gelencser, Carbonaceous Aerosol, Springer, 2004, p. 228). + ! This is explained in more detail by Bond and Bergstrom + ! (Aerosol Sci. Technol., 2005). + ! + !dbc = 2., & ! Density bc [g cm-3] + & dbc = 1.8, & ! Density bc [g cm-3] + ! The density of OA is highly variable, + ! but in any case substantially lower than 2 g/cm3. + ! We adopt an average value of 1.3 g/cm3, + ! based on a number of studies: + ! Turpin and Lim (Aerosol Sci. Technol., 2001) + ! suggest that 1.2 g/cm3 is a reasonable estimate. + ! Lee et al. (ACP, 2010) measured 1.26 +- 0.24 g/cm3 + ! at during FAME-2009 at Finokalia after evaporation + ! Cross et al. (Aerosol Sci. Technol., 2007) assume an + ! average bulk density of 1.27 g/cm3 + ! Nakao et al. (Atmos. Environ., 2013) measure average densities + ! for SOA between 1.22 and 1.42 g/cm3, depending of species. + ! This is in line with predictions from the OA density model + ! by Kuwata et al. (Environ. Sci. Technol., 2012), + ! who find a range between 1.23 and 1.46 g/cm3 for SOA. + ! This model can be used to estimate OA density + ! as function of O:C and H:C elemental ratios, + ! with an accuracy of 12% or more. + ! As a further simplication, it is often assumed that + ! H:C = 2 - O:C (e.g. Murphy et al., ACP, 2011). + ! The model, however, is restricted to particle components + ! having negligible quantities of additional elements, + ! most notably nitrogen. + ! Schmid et al. (Environ. Sci. Technol., 2009) + ! derive a value of 1.39 +- 0.13 for OA from biomass burning. + ! + !doc = 2., & ! Density oc [g cm-3] + & doc = 1.3, & ! Density POM [g cm-3] + !<<< TvN + & dnh4no3 = 1.73, & ! Density NH4NO3 [g cm-3] + & dmsa = 1.48, & ! Density MSA [g cm-3] + & dnacl = 2.165, & ! Density NaCl [g cm-3] + & dna2so4 = 2.68, & ! Density Na2SO4 [g cm-3] + & dnahso4 = 2.435, & ! Density NaHSO4 [g cm-3] + & dh2o = 1.0, & ! Density H2O [g cm-3] + + & wh2so4 = 98.0734, & ! Molecular weight H2SO4 [g mol-1] + & wh2o = 18.0, & ! Molecular weight H2O [g mol-1] + & wso4 = 96.0576, & ! Molecular weight SO4 [g mol-1] + & wso2 = 64.0, & ! Molecular weight SO2 [g mol-1] + & wna = 22.99, & ! Atomic weight Na [g mol-1] + & wcl = 35.453, & ! Atomic weight Cl [g mol-1] + & wnacl = 58.443, & ! Molecular weight NaCl [g mol-1] + & wna2so4 = 142.0376, & ! Molecular weight Na2SO4 [g mol-1] + & wnahso4 = 120.0555, & ! Molecular weight NaHSO4 [g mol-1] + & wdair = 28.970 ! Molecular weight dry air[g mol-1] + + + + !--- 9) Assumed parameters: ------------------------------------------------------ + + REAL(KIND=JPRB), PARAMETER :: critn=100.,& ! Assumed mass of an nucleated sulfate + ! particle for the Kulmala scheme [molecules] + & fmax=0.95, & ! Factor that limits the condensation + ! of sulfate to fmax times the available + ! sulfate in the gas phase [1]. + ! (m7_dgas) + & cLayerThickness = 1.0 ! Assumed required layer thickness of + ! sulfate to transfer an insoluble + ! particle to a soluble mode. It is + ! given in units of layers of + ! monomolecular sulfate. Determines the + ! transfer rate from insoluble to + ! soluble modes. + + !--- 10) Computational constants: ------------------------------------------------ + + REAL(KIND=JPRB), PARAMETER :: sqrt2=1.4142136, pi=3.141592654 + + !--- 11) Data used for the calculation of the aerosol properties ----------------- + ! under ambient conditions: + ! (Included the conversion from Pa to hPa in the first parameter.) + + REAL(KIND=JPRB), PARAMETER :: wvb(17)= & + & (/ 95.80188, -28.5257, -1.082153, 0.1466501, & + & -20627.51, 0.0461242, -0.003935, -3.36115, & + & -0.00024137, 0.067938345, 0.00000649899, 8616124.373, & + & 1.168155578, -0.021317481, 0.000270358, -1353332314.0, & + & -0.002403805 /) + + REAL(KIND=JPRB), PARAMETER :: gmb(9)= & + & (/ 1.036391467, 0.00728531, -0.011013887, -0.068887407, & + & 0.001047842, 0.001049607, 0.000740534, -1.081202685, & + & -0.0000029113 /) + + !--- 4) Logical mask for coagulation kernel: ------------------------------------- + ! (The coagulation kernel mask is symmetric and not all + ! values are used for physical considerations. As its + ! calculation is very expensive, a mask is used to + ! calculate only the necessarey elements.) + + LOGICAL :: locoagmask(nmod,nmod) + + DATA locoagmask(1:nmod,1) / .TRUE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE. / + + DATA locoagmask(1:nmod,2) / .FALSE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE., .TRUE. / + + DATA locoagmask(1:nmod,3) / .FALSE., .FALSE., .TRUE., .FALSE., .TRUE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,4) / .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,5) / .FALSE., .FALSE., .FALSE., .FALSE., .TRUE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,6) / .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE. / + + DATA locoagmask(1:nmod,7) / .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE., .FALSE. / + + + + + + + + ! TM5M7-aerosol-specific elements, taken from chem_param.F90 + + ! + ! component indices and families, to identify tracer + ! + ! RCHG -> Should be each of these identifers numbers equal to + ! the "i" of YAERO_NL(i) in the namelist? + INTEGER(KIND=JPIM), PARAMETER :: ISO4 = 1 + INTEGER(KIND=JPIM), PARAMETER :: INH4 = 2 ! Note: these are tracer fields in the scope of aerosol module. + INTEGER(KIND=JPIM), PARAMETER :: INO3_A = 3 ! Check how to treat when running with chemistry. + INTEGER(KIND=JPIM), PARAMETER :: IACS_N = 4 + INTEGER(KIND=JPIM), PARAMETER :: ISO4ACS = 5 + INTEGER(KIND=JPIM), PARAMETER :: IBCACS = 6 + INTEGER(KIND=JPIM), PARAMETER :: IPOMACS = 7 + INTEGER(KIND=JPIM), PARAMETER :: ISSACS = 8 + INTEGER(KIND=JPIM), PARAMETER :: IDUACS = 9 + INTEGER(KIND=JPIM), PARAMETER :: ISOANUS= 10 + INTEGER(KIND=JPIM), PARAMETER :: ISOAAIS = 11 + INTEGER(KIND=JPIM), PARAMETER :: ISOAACS = 12 + INTEGER(KIND=JPIM), PARAMETER :: ISOACOS = 13 + INTEGER(KIND=JPIM), PARAMETER :: ISOAAII = 14 + INTEGER(KIND=JPIM), PARAMETER :: IH2OPART = 15 + INTEGER(KIND=JPIM), PARAMETER :: IAII_N = 16 + INTEGER(KIND=JPIM), PARAMETER :: IBCAII = 17 + INTEGER(KIND=JPIM), PARAMETER :: IPOMAII = 18 + INTEGER(KIND=JPIM), PARAMETER :: IACI_N = 19 + INTEGER(KIND=JPIM), PARAMETER :: IDUACI = 20 + INTEGER(KIND=JPIM), PARAMETER :: IAIS_N = 21 + INTEGER(KIND=JPIM), PARAMETER :: ISO4AIS = 22 + INTEGER(KIND=JPIM), PARAMETER :: IBCAIS = 23 + INTEGER(KIND=JPIM), PARAMETER :: IPOMAIS = 24 + INTEGER(KIND=JPIM), PARAMETER :: ICOI_N = 25 + INTEGER(KIND=JPIM), PARAMETER :: IDUCOI = 26 + INTEGER(KIND=JPIM), PARAMETER :: ICOS_N= 27 + INTEGER(KIND=JPIM), PARAMETER :: ISO4COS = 28 + INTEGER(KIND=JPIM), PARAMETER :: IBCCOS= 29 + INTEGER(KIND=JPIM), PARAMETER :: IPOMCOS = 30 + INTEGER(KIND=JPIM), PARAMETER :: ISSCOS = 31 + INTEGER(KIND=JPIM), PARAMETER :: IDUCOS = 32 + INTEGER(KIND=JPIM), PARAMETER :: INUS_N = 33 + INTEGER(KIND=JPIM), PARAMETER :: ISO4NUS = 34 + INTEGER(KIND=JPIM), PARAMETER :: IELVOC = 35 + INTEGER(KIND=JPIM), PARAMETER :: IISVOC = 36 + INTEGER(KIND=JPIM), PARAMETER :: IMSA = 37 + + + ! + ! molar weights of selected components. + ! + REAL(KIND=JPRB), PARAMETER :: xmair=28.94 ! mass of air, g/mol + REAL(KIND=JPRB), PARAMETER :: xmh=1.0079 + REAL(KIND=JPRB), PARAMETER :: xmn=14.0067 + REAL(KIND=JPRB), PARAMETER :: xmc=12.01115 + REAL(KIND=JPRB), PARAMETER :: xms=32.064 + REAL(KIND=JPRB), PARAMETER :: xmo=15.9994 + REAL(KIND=JPRB), PARAMETER :: xmna=22.990 + REAL(KIND=JPRB), PARAMETER :: xmcl=35.453 + + + REAL(KIND=JPRB), PARAMETER :: xmno3=xmn+3.*xmo + REAL(KIND=JPRB), PARAMETER :: xmh2so4=2.*xmh+xms+4.*xmo + REAL(KIND=JPRB), PARAMETER :: xmdust=xmair + REAL(KIND=JPRB), PARAMETER :: xmnumb=xmair + ! attention xmso2: conversion emissions done when added... + REAL(KIND=JPRB), PARAMETER :: xmso2=xms+2.*xmo + REAL(KIND=JPRB), PARAMETER :: xmdms=xms+2*xmc+6*xmh + ! attention xmnh3: conversion emissions when added... + REAL(KIND=JPRB), PARAMETER :: xmnh3=xmn+3.*xmh + ! attention: conversion emissions when added... + REAL(KIND=JPRB), PARAMETER :: xmnh4=xmn+4.*xmh + REAL(KIND=JPRB), PARAMETER :: xmmsa=xms+xmc+3*xmo+4*xmh + REAL(KIND=JPRB), PARAMETER :: xmnh2=xmn+xmh*2. + REAL(KIND=JPRB), PARAMETER :: xmnh2o2=xmnh2+2.*xmo + REAL(KIND=JPRB), PARAMETER :: xmso4=xms+4.*xmo + + + + ! densities (kg/m3) used in emission and/or optics routines + REAL(KIND=JPRB), PARAMETER :: density_ref = 1800.0 ! for 'reference' density calculations + REAL(KIND=JPRB), PARAMETER :: ss_density = dnacl * 1.e3 + REAL(KIND=JPRB), PARAMETER :: dust_density = ddust * 1.e3 + REAL(KIND=JPRB), PARAMETER :: carbon_density = dbc * 1.e3 + REAL(KIND=JPRB), PARAMETER :: pom_density = doc * 1.e3 ! Note that doc actually is the density of POM not OC + REAL(KIND=JPRB), PARAMETER :: soa_density = pom_density ! TB first order approx. same as pom + ! H2-SO4 particle density: + REAL(KIND=JPRB), PARAMETER :: so4_density = dh2so4 * 1.e3 + REAL(KIND=JPRB), PARAMETER :: h2so4_factor = xmh2so4 / xmso4 + ! Ammonium-nitrate particle density used in the optics routine: + ! Value based on Lowenthal et al. (Atmos. Environ., 2000) (see also De Meij et al., ACP, 2006). + !REAL(KIND=JPRB), PARAMETER :: nh4no3_density = 1700. + REAL(KIND=JPRB), PARAMETER :: nh4no3_density = 1.73 * 1.e3 + REAL(KIND=JPRB), PARAMETER :: nh4no3_factor = (xmnh4+xmno3)/xmno3 + REAL(KIND=JPRB), PARAMETER :: msa_density = 1.48 * 1.e3 + + ! Kappa values + REAL(KIND=JPRB), PARAMETER :: Kap_su = 0.6 + REAL(KIND=JPRB), PARAMETER :: Kap_pom = 0.1 + REAL(KIND=JPRB), PARAMETER :: Kap_soa = 0.1 + REAL(KIND=JPRB), PARAMETER :: Kap_bc = 0. + REAL(KIND=JPRB), PARAMETER :: Kap_ss = 1.0 + REAL(KIND=JPRB), PARAMETER :: Kap_du = 0. + REAL(KIND=JPRB), PARAMETER :: Kap_na2so4 = 0.95 + REAL(KIND=JPRB), PARAMETER :: Kap_msa = 0.6 + REAL(KIND=JPRB), PARAMETER :: Kap_no3 = 0.6 + + REAL(KIND=JPRB), DIMENSION(NMOD), PARAMETER :: sigma_lognormal = (/ 1.59, 1.59, 1.59, 2.00, 1.59, 1.59, 2.00 /) + ! + ! mode numbers + ! + INTEGER(KIND=JPIM), PARAMETER :: mode_nuc = 1 + INTEGER(KIND=JPIM), PARAMETER :: mode_ais = 2 + INTEGER(KIND=JPIM), PARAMETER :: mode_acs = 3 + INTEGER(KIND=JPIM), PARAMETER :: mode_cos = 4 + INTEGER(KIND=JPIM), PARAMETER :: mode_aii = 5 + INTEGER(KIND=JPIM), PARAMETER :: mode_aci = 6 + INTEGER(KIND=JPIM), PARAMETER :: mode_coi = 7 + + ! mode_number => mode_start + INTEGER(KIND=JPIM), PARAMETER :: mode_start (nmod) = (/ inus_n, iais_n, iacs_n, icos_n, iaii_n, iaci_n, icoi_n /) ! first tracer in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_end_so4 (nmod) = (/ iso4nus, iso4ais, iso4acs, iso4cos, 0, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_bc (nmod) = (/ 0, ibcais, ibcacs, ibccos, ibcaii, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_pom (nmod) = (/ 0, ipomais, ipomacs, ipomcos, ipomaii, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_ss (nmod) = (/ 0, 0, issacs, isscos, 0, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_dust(nmod) = (/ 0, 0, iduacs, iducos, 0, iduaci, iducoi /) + INTEGER(KIND=JPIM), PARAMETER :: mode_end_soa (nmod) = (/ isoanus, isoaais, isoaacs, isoacos, isoaaii, 0, 0 /) + INTEGER(KIND=JPIM), PARAMETER :: mode_nm (nmod) = (/ 2, 4, 6, 6, 3, 1, 1 /) ! # tracers in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_nm_sed (nmod) = (/ 2, 4, 9, 6, 3, 1, 1 /) ! # tracers in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_end (nmod) = mode_start + mode_nm ! last tracer in mode + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers(0:6,nmod) = & + & RESHAPE( (/ inus_n, iso4nus, isoanus, 0, 0, 0, 0, & + & iais_n, iso4ais, ibcais, ipomais,isoaais, 0, 0, & + & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, & + & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, & + & iaii_n, ibcaii, ipomaii,isoaaii, 0, 0, 0, & + & iaci_n, iduaci, 0, 0, 0, 0, 0, & + & icoi_n, iducoi, 0, 0, 0, 0, 0 /), (/ 7, nmod/) ) + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers_by_mods(0:6,nmod) = & + & RESHAPE( (/ inus_n, iso4nus, 0 , 0 , isoanus, 0 , 0 , & + & iais_n, iso4ais, ibcais, ipomais, isoaais, 0 , 0 , & + & iacs_n, iso4acs, ibcacs, ipomacs, isoaacs, issacs , iduacs, & + & icos_n, iso4cos, ibccos, ipomcos, isoacos, isscos , iducos, & + & iaii_n, 0 , ibcaii, ipomaii, isoaaii, 0 , 0 , & + & iaci_n, 0 , 0 , 0 , 0 , 0 , iduaci , & + & icoi_n, 0 , 0 , 0 , 0 , 0 , iducoi /), (/ 7, nmod/) ) + INTEGER(KIND=JPIM), PARAMETER :: mode_tracers_sed(0:9,nmod) = RESHAPE( (/& + & inus_n, iso4nus, isoanus, 0, 0, 0, 0, 0, 0, 0, & + & iais_n, iso4ais, ibcais, ipomais, isoaais, 0, 0, 0, 0, 0, & + & iacs_n, iso4acs, ibcacs, ipomacs, issacs, iduacs, isoaacs, inh4, ino3_a, imsa, & + & icos_n, iso4cos, ibccos, ipomcos, isscos, iducos, isoacos, 0, 0, 0, & + & iaii_n, ibcaii, ipomaii, isoaaii, 0, 0, 0, 0, 0, 0, & + & iaci_n, iduaci, 0, 0, 0, 0, 0, 0, 0, 0, & + & icoi_n, iducoi, 0, 0, 0, 0, 0, 0, 0, 0/), (/ 10, nmod/) ) + + + + ! number of aerosol bins used for deposition: + integer, parameter :: nrdep = 23 + + ! aerosol radii used for each bin: + real, parameter :: lur(nrdep) = & + (/ 0.001, 0.01, 0.05, 0.1, 0.3, & + 0.5 , 0.7 , 0.8 , 0.9, 1.0, & + 1.2 , 1.5 , 2.0 , 3.0, 4.0, & + 5.0 , 6.0 , 8.0 , 10.0, 15.0, & + 20.0 , 50.0 , 100.0 /) + + + + ! ******************************************************************** + ! wet deposition + ! ******************************************************************** + + ! nscav : selected species for scavenging + ! nscav_index : index for scavenging: + ! nscav_type : type of scavenging: + ! 0 no scavenging + ! 1 scavenging 100 % solubility assumed + ! 2 scavenging henry solubility assumed + ! 3 scavenging, aerosol removal assumed + ! 4 scavenging, special case for SO2 with aq phase diss. + ! + integer,parameter :: nscav=30 + + integer,parameter,dimension(nscav) :: nscav_index = (/ & + inus_n, iais_n, iacs_n, icos_n, iaii_n, iaci_n, icoi_n, & + iso4nus, iso4ais, iso4acs, iso4cos, & + ibcais, ibcacs, ibccos, ibcaii, & + ipomais, ipomacs, ipomcos, ipomaii, & + issacs, isscos, & + iduacs, iducos, iduaci, iducoi, & + isoanus, isoaais, isoaacs, isoacos, isoaaii & + /) + + ! nscav_type = 5 : nu mode soluble aerosol + ! nscav_type = 6 : ai mode soluble aerosol + ! nscav_type = 7 : ac mode soluble aerosol + ! nscav_type = 8 : co mode soluble aerosol + ! nscav_type = 9 : ai mode insoluble aerosol + ! nscav_type = 10 : ac mode insoluble aerosol + ! nscav_type = 11 : co mode insoluble aerosol + +! in m7-version so4 is treated as gas-phase sulphuric acid (H2SO4) (scav-type 2) +! Since ammonium-nitrate and MSA are assumed to be in the soluble accumulation mode, +! their scavenging efficiency has been changed to the value for that mode. +! For consistency, the same value is used for Pb210. + integer, dimension(nscav),parameter :: & + nscav_type = (/ & + 5, 6, 7, 8, 9, 10, 11, & ! particle number + 5, 6, 7, 8, & ! sulphate mass + 6, 7, 8, 9, & ! BC mass + 6, 7, 8, 9, & ! POM mass + 7, 8, & ! SS mass + 7, 8, 10, 11, & ! DUST mass + 5, 6, 7, 8, 9 /) ! SOA mass + +END MODULE TM5M7_DATA diff --git a/ifs-source/arpifs/m7/module/tm5m7_emis_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_emis_data.F90 new file mode 100644 index 00000000..9fa08fe6 --- /dev/null +++ b/ifs-source/arpifs/m7/module/tm5m7_emis_data.F90 @@ -0,0 +1,660 @@ +MODULE TM5M7_EMIS_DATA + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE M7_DATA, ONLY : zbb_wsoc_perc, zbge_wsoc_perc, cmr_ff,cmr_bb, facso2, & + & cmr_sk, cmr_sa, cmr_sc +USE TM5M7_DATA, ONLY : XMAIR + +IMPLICIT NONE + +SAVE + +! Array to collect emissions. Note that this is a 3D array, and not 4D as in TM5. +TYPE MODAL_EMISSIONS + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER :: d3 ! KLON, BB_LM, mode_nm(mode) +END TYPE MODAL_EMISSIONS + + + ! Count median / geometric mean radii of + ! primary carbonaceous and sulfate emissions + ! based on AeroCom-I recommendations (Dentener et al., ACP, 2006). + ! The corresponding values for the M7 modes are given by Stier et al. (ACP, 2005). + ! The same values have also been adopted in GLOMAP (Mann et al., 2010). + ! + ! Count median radii for carbonaceous aerosol emissions from Dentener et al., + ! corresponding to sigma = 1.8: + !REAL(KIND=JPRB), PARAMETER :: rad_emi_ff = 0.015e-6 + !REAL(KIND=JPRB), PARAMETER :: rad_emi_bb = 0.04e-6 + ! The corresponding values for sigma = 1.59 used in M7 + ! are cmr_ff and cmr_bb, specified in m7_data.F90. + + ! For comparison, Bond et al. (JGR, 2013) give number median radii + ! between 25 and 40 nm for fresh BC in the urban areas + ! of Tokyo, Nagoya, and Seoul, + ! of 60 nm in plumes associated with wildfires, + ! and about 15 nm from aircraft jet engines. + ! These values are volume-equivalent radii (see their Fig. 4). + ! + ! According to the original paper by Schwarz et al. (GRL, 2008) + ! the corresponding geometric standard deviation + ! is sigma = 1.71 for the urban BC + ! and 1.43 for the biomass burning aerosol. + ! + ! For BC in biomass burning plumes, + ! Kondo et al (JGR, 2011) estimated + ! number median radii in the range 68-70.5 nm (+- 6-8 nm) + ! and geometric standard deviation between 1.32 and 1.36 (+- 0.01-0.04), + ! for particles thickly coated by organics. + ! + ! Janhaell et al. (ACP, 2010) have compiled measurements of + ! particle size in fresh biomass burning smoke from vegetation fires. + ! They mention that particles from biomass burning are dominated + ! by an accumulation mode. + ! They also present a relation between the geometric mean diameter Dg + ! and geometric standard deviation sigma for fresh smoke: + ! Dg (um) = (584 +- 5) - (269 +-1) sigma + ! This gives a geometric mean radius of 78 um for sigma = 1.59, + ! in close agreement with the value used by Stier et al. + ! + ! Another way to account for differences in sigma + ! is to modify the number median radius rg + ! such that the number of particles (N) + ! emitted for a certain mass (M) is the same. + ! N is proportional to M/rv^3, + ! where rv is the volume mean radius, + ! which is related to rg by + ! rv = rg * exp(1.5*(ln(sigma))^2). + ! According to Janhall, fresh smoke has an average + ! Dg of 117 +- 13 nm and sigma of 1.7 +- 0.1. + ! At sigma=1.59, this would translate into Dg of about 129 nm, + ! or rg of about 65 nm. + ! For the estimates from Kondo et al. and Schwarz et al., + ! this would give somewhat smaller rg values + ! of about 58 and 53 nm, resp. + ! + ! Particles emitted by grass and savannah fires are generally + ! somewhat smaller than those from wood burning. + ! Janhaell et al. estimate that the mean emission radii + ! for grass and savannah fires, resp., are 12.5 and 10 nm smaller. + ! These differences is not accounted for in the model. + ! + ! In a later version of ECHAM-HAM particles the emission radius + ! for biomass burning was reduced to the value for fossil fuel + ! (Zhang et al., ACP, 2012). + ! However, such as a small value seems inconsistent with measurements. + ! + ! In the CMIP6 emission data set, + ! the contributions from solid biofuel combustion + ! are included in the 2-D anthropogenic sectors, + ! and provided separately in a supplementary data set. + ! In CMIP6, biofuel is only non-zero + ! for the energy, industry and residential and + ! transportation sectors. + ! Most of the residential emissions are due + ! to solid biofuel combustion. + ! The contribution to the industrial sector + ! is only substantial in developing countries, + ! while the contributions to the energy + ! and transportation sectors are generally very small. + ! + ! For inventories other than CMIP6, + ! no distinction between fossil and biofuel emissions + ! is made in the model. + ! + ! Winijkul et al. (Atm. Env., 2015) have measured + ! size distributions from energy-related combustion + ! sources for the residential, industrial, power and + ! transportation sectors. + ! They give regional and global estimates of + ! mass median diameters. + ! In their supplementary material they give + ! an overview of results from other studies. + ! These results indicate that the size distribution + ! for both biofuel and fossil fuel combustion sources + ! are strongly dependent on the technique. + ! Count median radii for the residential sector, + ! presented in their Table S1, vary between about + ! 15 nm for modern (improved) wood-fueled stoves, + ! and 25-30 for fireplaces, + ! to 160 nm for (regular) wood-fueled heating stoves, + ! to 270 nm for traditional cookstoves. + + ! General fossil fuel (2-d sectors) + ! emitted in the Aitken mode + REAL(KIND=JPRB), PARAMETER :: rad_emi_ff_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_ff_insol = cmr_ff + + ! Energy sector + ! emitted in the Aitken mode. + REAL(KIND=JPRB), PARAMETER :: rad_emi_ene_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_ene_insol = cmr_ff + + ! Industry sector + ! emitted in the Aitken mode. + REAL(KIND=JPRB), PARAMETER :: rad_emi_ind_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_ind_insol = cmr_ff + + ! Transportation sector + ! emitted in the Aitken mode. + REAL(KIND=JPRB), PARAMETER :: rad_emi_tra_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_tra_insol = cmr_ff + + ! Shipping sector + ! emitted in the Aitken mode. + ! Currently set to cmr_ff, + ! but could be changed. + REAL(KIND=JPRB), PARAMETER :: rad_emi_shp_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_shp_insol = cmr_ff + + ! Aircraft sector + ! emitted in the Aitken mode. + ! Currently set to cmr_ff, + ! but a smaller value could be used, + ! e.g. 10 or 15 nm. + REAL(KIND=JPRB), PARAMETER :: rad_emi_air_sol = cmr_ff + REAL(KIND=JPRB), PARAMETER :: rad_emi_air_insol = cmr_ff + + ! Open biomass burning + ! Soluble part emitted in the accumulation mode, + ! insoluble part in the Aitken mode. + ! Stier et al. apply cmr_ff to the insoluble part, + ! but a slightly larger value seems more realistic, + ! e.g. 40 nm. + REAL(KIND=JPRB), PARAMETER :: rad_emi_bb_sol = cmr_bb + REAL(KIND=JPRB), PARAMETER :: rad_emi_bb_insol = cmr_ff + + ! Solid biofuel combustion + ! Currently treated as biomass burning, + ! but could be changed (see comments above). + ! The value cmr_bb = 75 nm corresponds + ! with the value of 50 nm at sigma=2 + ! assumed by Kondros et al. (ACP, 2015) + ! for emissions from biofuel combusion + ! in their baseline run. + ! In one of their sensitivity runs, + ! they increase it by a factor of 2. + REAL(KIND=JPRB), PARAMETER :: rad_emi_bf_sol = cmr_bb + REAL(KIND=JPRB), PARAMETER :: rad_emi_bf_insol = cmr_ff + + ! not used anymore: + !REAL(KIND=JPRB), PARAMETER :: rad_soa = 0.01e-6 ! soa average radius + ! assuming 3nm particle formation and growth to + ! that size in half an hour + + ! Count median radii for sulfate aerosol emissions adapted to the M7 modes: + REAL(KIND=JPRB), PARAMETER :: rad_so4_ait = cmr_sk ! aitken mode radius + REAL(KIND=JPRB), PARAMETER :: rad_so4_acc = cmr_sa ! accumulation mode radius + REAL(KIND=JPRB), PARAMETER :: rad_so4_coa = cmr_sc ! coarse mode radius + + ! Count median dry radii for sea salt emissions. + ! These values have been updated + ! following Vignati et al. (Atmos. Environ., 2010) + ! For further explanations, see emission_ss.F90. + !REAL(KIND=JPRB), PARAMETER :: radius_ssa = 0.0794e-6 + !REAL(KIND=JPRB), PARAMETER :: radius_ssc = 0.63e-6 + REAL(KIND=JPRB), PARAMETER :: radius_ssa = 0.09e-6 ! accumulation mode + REAL(KIND=JPRB), PARAMETER :: radius_ssc = 0.794e-6 ! coarse mode + + ! Soluble fraction of POM mass + ! According to Janhall et al. (ACP, 2010) + ! 40 to 80% of the organic matter from + ! vegetation fires is water soluble. + ! Kondros et al. (ACP, 2015) use 80% + ! for POM from biofuel combustion + ! in their base run. + ! For the moment, emisions from + ! biofuel combustion and open biomass burning + ! are treated in the same way. + ! + ! open biomass burning + REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_bb = zbb_wsoc_perc + ! solid biofuel combustion + REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_bf = zbb_wsoc_perc + !REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_bf = 0.8 ! alternative value + ! fossil fuel combustion + !REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_ff = 0.65 ! original value + REAL(KIND=JPRB), PARAMETER :: frac_pom_sol_ff = 0.0 ! value since 2015 revision + + ! Soluble fraction of BC mass + ! In the original code, + ! fresh BC was assumed 100% insoluble, + ! and therefore emitted into the Aitken mode. + ! The new code allows to use a non-zero fraction, + ! to account for non-resolved ageing close to the source. + ! See e.g. Kondros et al., + ! who use 50% for biofuel combustion + ! in their base run. + ! In the standard EMEP MSC-W model, + ! 20% of the elemental carbon (EC) from + ! anthropogenic sources + ! (representative of fossil fuel combustion) + ! and all EC from open biomass fires + ! is assumed hygroscopic. + ! + ! open biomass burning + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bb = 0.0 ! original value + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bb = 0.5 + REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bb = 0.95 ! To reduce the AOD over china and outflow region of + ! Africa the water soluble fraction was increasde to 95% + ! in preparation for CMIP6. + ! solid biofuel combustion + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bf = 0.0 ! original value + !REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bf = 0.5 ! Aerocom + REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_bf = 0.95 ! TB: + ! To reduce the AOD over china and outflow region of + ! Africa the water soluble fraction was increasde to 95% + ! in preparation for CMIP6. + ! + ! Some basiss for the choice can be found here: + ! (e.g. Janhall et al., 2010; + ! https://doi.org/10.5194/acp-10-1427-2010 ; Winijkul et al., 2015; + ! https://doi.org/10.1016/j.atmosenv.2015.02.037; Li et al., 2009; + ! https://pubs.acs.org/doi/abs/10.1021/es803330j). + + ! fossil fuel combustion + REAL(KIND=JPRB), PARAMETER :: frac_bc_sol_ff = 0.0 + + ! Soluble fraction of surrogate SOA emissions + ! POM from SOA is considered 65% soluble, + ! as recommended by AeroCom. + ! The paper by Kanakidou et al. (ACP, 2004) + ! (mentioned in emission_pom.F90) + ! does not seem to support 100% solubility, + ! as was previously assumed. + !REAL(KIND=JPRB), PARAMETER :: frac_soa_sol = 1.0 ! original value + REAL(KIND=JPRB), PARAMETER :: frac_soa_sol = zbge_wsoc_perc ! value since 2015 revision + + ! Fraction of SOx mass emitted directly as sulfate + REAL(KIND=JPRB), PARAMETER :: frac_so4=1.-facso2 + + + ! The value of 1.4 for the POM to OC mass ratio, + ! set in m7_data.F90, is an outdated estimate, + ! see e.g. Turpin and Lim (Aerosol Sci. Technol., 2001) and + ! Aiken et al. (Environ. Sci. Technol., 2008). + ! Turpin and Lim estimate a ratio of 1.6 +- 0.2 for urban aerosol, + ! and 2.1 +- 0.2 for aged (nonurban) aerosol; + ! They also note that aerosols heavily impacted by woodsmoke can + ! have an even higher ratio (2.2 to 2.6). + ! According to Reid et al. (ACP, 2005), + ! the POM to OC ratio in fresh biomass burning smoke is very uncertain, + ! somewhere in between 1.4 and ~2. + ! Aiken et al. measure ambient aerosol values + ! between 1.25 for O/C = 0 to 2.44 for O/C = 1.0. + ! For OA from biomass burning, they measure 1.56-1.70, + ! lower than the estimates from Turpin and Lim (~2.0). + ! They find the highest ratios for + ! aged and freshly formed SOA (~2.4 and ~1.9, respectively) + ! and lowest values for primary OA from urban combustion. + ! Based on these studies, we apply different values + ! for emissions from biomass burning versus other emissions, + ! as is also done in some other models + ! (see Table 1 in Tsigaridis et al., ACP, 2014), + ! For SOA (seem emission_pom.F90) + ! we apply a relatively high value valid for aged SOA. + ! This compensates for the lack of SOA formation from isoprene, + ! and improves the agreement with aerosol optical depth (AOD) + ! derived from satellite observations (MODIS). + ! + ! We could go even further and apply different values for the + ! water soluble and insoluble fractions (Turpin and Lim). + ! + ! It should be acknowledged that the representation of OA + ! with a single tracer is very simplistic. + ! In particular, increase in OA mass due to ageing + ! is not properly accounted for. + ! + !REAL(KIND=JPRB), PARAMETER :: oc2pom = zom2oc !factor for conversion of OC mass to POM + REAL(KIND=JPRB), PARAMETER :: oc2pom_ff = 1.6 ! fossil fuel + REAL(KIND=JPRB), PARAMETER :: oc2pom_bf = 1.6 ! solid biofuel combustion + REAL(KIND=JPRB), PARAMETER :: oc2pom_bb = 1.6 ! open biomass burning + REAL(KIND=JPRB), PARAMETER :: oc2pom_soa = 2.4 ! SOA + + + ! ----------- + ! Dust data + ! ----------- + + + ! parameters for online dust calculations + INTEGER(KIND=JPIM), PARAMETER :: ntraced=8 ! number of coarse-grained bins + ! in the original emission model + INTEGER(KIND=JPIM), PARAMETER :: nbin=24 ! number of discretization points per bin + INTEGER(KIND=JPIM), PARAMETER :: nclass=ntraced*nbin ! total number of discretization points + INTEGER(KIND=JPIM), PARAMETER :: nats=12 ! number of soil types + INTEGER(KIND=JPIM), PARAMETER :: nmode=4 ! number of particle size distributions in soils, + ! which distinguishes between clay, silt, + ! medium/fine sand, and coarse sand + INTEGER(KIND=JPIM), PARAMETER :: nspe=nmode*3+2 ! for explanation, see below + + + ! parameters for online emission input file ("onlinedust.nc") + ! fields on 1x1 deg grid + INTEGER(KIND=JPIM), PARAMETER :: nsoilph = 5, & + nfpar = 12, & + nz0 = 13 ! number of {soilph, par, z0} fields + ! entry nz0 indicates the annual mean. + + ! von Karman constant + REAL(KIND=JPRB), PARAMETER :: VKARMAN=0.4 + + ! Constants used in the parameterization of the efficient friction velocity ratio, + ! see Eqs. (17-20) in MB95: + REAL(KIND=JPRB), PARAMETER :: aeff=0.35 + REAL(KIND=JPRB), PARAMETER :: xeff=10. + ! + ! -- scaling factor for threshold friction velocity + ! u1fac is a tuning parameter necessary to obtain a reasonable global annual + ! emission amount. u1fac < 1 is used to reduce the threshold friction + ! velocity. In ECHAM-HAM simulations at T63 values of 0.86 and 0.56 were + ! used by Cheng et al. (ACP, 2008). The lower value was introduced to + ! increase emissions when surface roughness lengths were increased from a + ! constant value of 0.001 cm to values based on satellite measurements from + ! Prigent et al. (JGR, 2005). It is unclear where the value 0.66 specified + ! below is based on. In ECHAM-HAM2 (Zhang et al., ACP, 2012) the satellite + ! based surface roughness values were abandoned again. + REAL(KIND=JPRB), PARAMETER :: u1fac=0.6 ! 0.7 in EC-Earth 3.2.3 + + REAL(KIND=JPRB), PARAMETER :: cd=1.2507E-06 ! flux dimensioning parameter [g s^2/cm^4] + + !<<< TvN ! (=roa/(grav*1.e2)) + ! ustar_min is not used: + !REAL(KIND=JPRB), PARAMETER :: ustar_min=5. ! min. fricton velocity (cm/s) + ! minimum surface roughness length z0 (cm) + ! The minimum value in the data set + ! from Prigent et al. is 1e-3 cm. + ! but that seems very low. + ! For instance, the minimum value in the + ! measurements used in the regression + ! in that study is 2.3e-3 cm. + ! Also, at very low z0, volume scattering + ! of the microwave radiation will take place + ! that can significantly decrease the radar + ! backscatter coefficient (p. 8). + ! Furthermore, using 1e-3 cm leads to + ! an overestimation of AOD (compared to MODIS) + ! in the areas concerned, + ! in particular around the dust hot spots + ! of the Sahara (using current u1fac value). + ! For these reasons the minimum value + ! has been increased. + !REAL(KIND=JPRB), PARAMETER :: z0_min=1.e-3 + !REAL(KIND=JPRB), PARAMETER :: z0_min=5.e-3 + REAL(KIND=JPRB), PARAMETER :: z0_min=1.e-2 + !REAL(KIND=JPRB), PARAMETER :: z0_min=2.e-2 + !<<< TvN + + REAL(KIND=JPRB), PARAMETER :: lai_lim=0.25 + REAL(KIND=JPRB), PARAMETER :: lai_lim2=0.5 + + ! d_thrsld [cm^2.5] = 0.006/(ddust * grav*1.e2) with ddust = 2.65 g/cm^3, + ! see Eq. (4) in MB95: + REAL(KIND=JPRB), PARAMETER :: d_thrsld=2.31e-6 ! threshold value + !>>> TvN + ! There are eight coarse-grained size bins, + ! of which only the first four are used here. + ! According to Tegen et al., Heinold et al., + ! the radius boundaries of the first seven bins are + ! at 0.1, 0.3, 0.9, 2.6, 8.0, 24, 72, and 220 um. + ! However, these number don't seem to be exact. + ! Since there is a constant ratio between the right + ! and low boundaries, it seems this ratio is 3.0. + ! Indeed, in Laurent et al. (JGR, 2010), + ! 2.6 is corrected to 2.7, which would be consistent + ! with 8.0/3.0 = 2.67. + ! This would imply that the radius boundaries are at + ! 0.0987654 = 72./(3.^6), 0.296296, 0.889, 2.67, 8.0, 24, 72, 216, + ! and 648 um. + + ! Next, each bin is discretized with 24 size points, + ! where d(n+1) = d(n) * exp(Dstep). + ! Thus, Dstep = ln(3.)/24 = 0.04577551202. + ! Dmin is the diameter of the first size point, + ! given by 2* 72./(3.^6)) * exp(0.5*Dstep) = 0.20210403762 um. + ! Similarly, the last size point is at a diameter + ! 2* 648. * exp(-0.5*Dstep) = 1266.67434757 um. + ! + ! With the original bin settings, + ! the number of size points is 191 not 192 (=8*24). + ! + !REAL(KIND=JPRB), PARAMETER :: Dmin=0.00002 ! minimum partic. diameter (cm) + !REAL(KIND=JPRB), PARAMETER :: Dmax=0.130 ! maximum partic. diameter (cm) + !REAL(KIND=JPRB), PARAMETER :: Dstep=0.0460517018598807 ! diameter increment + REAL(KIND=JPRB), PARAMETER :: Dmin=2.0210403762e-5 ! diameter (cm) at first discretization point + REAL(KIND=JPRB), PARAMETER :: Dmax=0.126667434757 ! diameter (cm) at last discretization point + REAL(KIND=JPRB), PARAMETER :: Dstep=0.04577551202 ! diameter increment in log-space + !<<< TvN + + ! Constants in the parameterization of the Reynolds number, + ! see Eq. (5) in MB95: + REAL(KIND=JPRB), PARAMETER :: a_rnolds=1331.647 ! Reynolds constant + REAL(KIND=JPRB), PARAMETER :: b_rnolds=0.38194 ! Reynolds constant + REAL(KIND=JPRB), PARAMETER :: x_rnolds=1.561228 ! Reynolds constant + ! + ! Air density has been made variable, + ! to account for orographic effects. + ! Previously, a global value for the + ! threshold friction velocity Uth was calculated. + ! To keep its unit the same, + ! roa is kept as a reference value, + ! but its exact value is not important anymore. + REAL(KIND=JPRB), PARAMETER :: roa=0.001227 ! reference air density (g/cm^3) + REAL(KIND=JPRB), PARAMETER :: airfac=1./8.3144*xmair*1.e-6 ! factor for rho_air + !<<< TvN + REAL(KIND=JPRB), PARAMETER :: umin=13.75 ! minimum threshold friction velocity (cm/s) + REAL(KIND=JPRB), PARAMETER :: ZZ=1000. ! wind measurement height (cm) + + ! parameters for the grouping in 2 modes + ! The code follows the ECHAM-HAM implementation + ! of Stier et al. (JGR, 2005), + ! where the emission distribution is + ! fitted onto three log-normal modes + ! corresponding to the accumulation, coarse and super-coarse mode. + ! (see presentation E. Vignati, TM meeting, 6 June 2008). + ! + ! According to Heinold et al., + ! the three largest dust bins + ! are less important for long-range transport, + ! so particles with radius larger than 24 um + ! can safely be neglected. + ! However, a substantial part of the emitted mass + ! is carried by particles with a radius larger than 10 um + ! (see Tegen et al., Table 5). + ! + ! The amounts of mass emitted in the accumulation and coarse modes + ! are calculated from the masses emitted in the bin model, + ! using two size ranges: + ! r1 from 0.0987654 to 0.296296 um, and + ! r2 from 0.296296 to 8.0 um. + ! + ! Boundaries for Acc. mode + INTEGER(KIND=JPIM), PARAMETER :: min_ai=1 + INTEGER(KIND=JPIM), PARAMETER :: max_ai=1 + ! Boundaries for Coa. mode + INTEGER(KIND=JPIM), PARAMETER :: min_ci=2 + INTEGER(KIND=JPIM), PARAMETER :: max_ci=4 + ! + ! These size ranges include only part of + ! the mass in the accumulation and coarse modes. + ! The corresponding mass fractions are given by + ! mf(rmin,rmax) = 0.5*( + ! erf(ln(rmax/mmr)/(sqrt(2)*ln(sigma)))- + ! erf(ln(rmin/mmr)/(sqrt(2)*ln(sigma))) ), + ! where mmr is the mass median radius. + ! Applying this formula, + ! we find the following numbers: + ! mf_acc(0,0.0987654)=0.00219913 + ! mf_acc_r1=mf_acc(0.0987654,0.296296)=0.313758 + ! mf_acc_r2=mf_acc(0.296296,8.0)=0.684043 + ! mf_acc(0.296296,inf)=0.684043 + ! + ! mf_coa(0,0.296296)=0.00519991 + ! mf_coa_r1=mf_coa(0.0987654,0.296296)=0.00518309 + ! mf_coa_r2=mf_coa(0.296296,8.0)=0.980634 + ! mf_coa(8.0,inf)=0.0141665 + ! + REAL(KIND=JPRB), PARAMETER :: mf_acc_r1 = 0.313758 + REAL(KIND=JPRB), PARAMETER :: mf_acc_r2 = 0.684043 + REAL(KIND=JPRB), PARAMETER :: mf_coa_r1 = 0.00518309 + REAL(KIND=JPRB), PARAMETER :: mf_coa_r2 = 0.980634 + ! + ! Most importantly, r1 contains only about 31.4% + ! of the mass in the accumulation mode! + ! This implies that we cannot just put the emissions + ! from r1 to the accumulation mode, + ! and those from r2 to the coarse mode! + ! + ! Instead, the modal emissions are determined + ! by the following system of linear equations: + ! mf_acc_r1 * flux_ai + mf_coa_r1 * flux_ci = flux_r1 + ! mf_acc_r2 * flux_ai + mf_coa_r2 * flux_ci = flux_r2, + ! which relates the mass emitted in the ranges r1 and r2 + ! to the mass emitted in the accumulation and coarse modes. + ! The solution is expressed using + ! the following parameters: + ! + REAL(KIND=JPRB), PARAMETER :: ratio_coa = mf_coa_r1/mf_coa_r2 + REAL(KIND=JPRB), PARAMETER :: ratio_acc = mf_acc_r2/mf_acc_r1 + REAL(KIND=JPRB), PARAMETER :: denom_acc_inv = 1./(mf_acc_r1-ratio_coa*mf_acc_r2) + REAL(KIND=JPRB), PARAMETER :: denom_coa_inv = 1./(mf_coa_r2-ratio_acc*mf_coa_r1) + REAL(KIND=JPRB), PARAMETER :: mf_acc_r12_inv = 1./(mf_acc_r1+mf_acc_r2) + REAL(KIND=JPRB), PARAMETER :: mf_coa_r12_inv = 1./(mf_coa_r1+mf_coa_r2) + ! + ! Source mass median radius (cm) + ! Stier et al. (2005) uses very similar numbers + ! for mass median radii, + ! but uses 0.37 um for the accumulation mode. + ! Thus, it seems these numbers are not mass mean, + ! but mass median radii. + ! + ! The super-coarse mode has + ! a mass median radius of 15.0 and sigma=2.0, + ! but is not included. + ! + ! The AeroCom recommendation of Dentener et al. (ACP, 2006) + ! is to use a number median radius + ! of 0.65 um for the coarse mode, + ! which corresponds to mass median radius of 2.75 um + ! (the conversion factor is exp(3.0*ln(sigma)^2), + ! see Zender, Particle Size Distributions: + ! Theory and Application to Aerosols, Clouds, and Soils, 2002). + ! + !REAL(KIND=JPRB), PARAMETER :: mmr_ai=0.35E-4 + REAL(KIND=JPRB), PARAMETER :: mmr_ai=0.37E-4 + REAL(KIND=JPRB), PARAMETER :: mmr_ci=1.75E-4 + !<<< TvN + + !---------------------------------------------------------------- + ! SOIL CARACTERISTICS: + ! ZOBLER texture classes + !---------------------------------------------------------------- + + ! solspe includes for each soil type (first dimension) + ! the mass median diameter (cm) and standard deviation (see Table 1, MB95) + ! and the relative contribution (Table 2, MP95) for the four size populations. + ! The two additional entries describe the saltation efficiency alpha (cm^-1), + ! and the residual moisture, which is currently not used. + ! Efficiencies are calculated as averages over the four populations + ! (as in Eq. (8) in Marticorena et al. (JGR, 1997), + ! where 1e-7, 1e-6 and 1e-5 cm^-1 is used for coarse sand, + ! medium/fine sand and silt, respectively, + ! and 1e-6 for clay for soils with clay fractions below 45% + ! and 1e-7 for clay for soils with clay fractions above 45%. + ! (Tegen et al.). + REAL(KIND=JPRB), PARAMETER, DIMENSION(nats,nspe) :: solspe=RESHAPE( (/ & + !-- soil type 1 : Coarse + 0.0707, 2., 0.43 , & + 0.0158, 2., 0.4 , & + 0.0015, 2., 0.17 , & + 0.0002 ,2., 0. , & + 2.1E-06, 0.2, & + !-- soil type 2 : Medium + 0.0707, 2., 0. , & + 0.0158, 2., 0.37 , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.3 , & + 4.0e-6, 0.25, & + !-- soil type 3 : Fine + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.67 , & + !>>> TvN + ! 33% x 1e-5 + 67% x 1e-7 = 3.367e-6 cm^-1 + !1.E-07, 0.5, & + 3.4e-6, 0.5, & + !<<< TvN + !-- soil type 4 : Coarse Medium + 0.0707, 2., 0.1 , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.2 , & + 0.0002, 2., 0.2 , & + 2.7E-06, 0.23, & + !-- soil type 5 : Coarse Fine + 0.0707, 2., 0. , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.12 , & + 0.0002, 2., 0.38 , & + !>>> TvN + ! 50% x 1e-6 + 12% x 1e-5 + 38% x 1e-6 = 2.08e-6 cm^-1 + !2.8E-06, 0.25, & + 2.1e-6, 0.25, & + !<<< TvN + !-- soil type 6 : Medium Fine + 0.0707, 2., 0. , & + 0.0158, 2., 0.27 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.48 , & + !>>> TvN + ! 27% x 1e-6 + 25% x 1e-5 + 48% x 1e-7 = 2.818e-6 cm^-1 + !1e-07, 0.36, & + 2.8e-6, 0.36, & + !<<< TvN + !-- soil type 7 : Coarse, Medium, Fine + 0.0707, 2., 0.23 , & + 0.0158, 2., 0.23 , & + 0.0015, 2., 0.19 , & + 0.0002, 2., 0.35 , & + 2.5E-06, 0.25, & + !-- soil type 8 : Organic + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5, & + !-- soil type 9 : Ice + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5, & + !-- soil type 10 : Potential Lakes (additional) + ! GENERAL CASE + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25, & + !-- soil type 11 : Potential Lakes (clay) + ! GENERAL CASE + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0. , & + 0.0002, 2., 1. , & + 1.E-05, 0.25, & + !-- soil type 12 : Potential Lakes Australia + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0027, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25 /),(/nats,nspe/),order=(/2,1/) ) + + REAL(KIND=JPRB) :: UTH ( NCLASS) + REAL(KIND=JPRB) :: SREL (NATS,NCLASS) + REAL(KIND=JPRB) :: SRELV(NATS,NCLASS) + REAL(KIND=JPRB) :: SU_SRELV(NATS,NCLASS) + + + + +END MODULE TM5M7_EMIS_DATA diff --git a/ifs-source/arpifs/m7/module/tm5m7_optics_data.F90 b/ifs-source/arpifs/m7/module/tm5m7_optics_data.F90 new file mode 100644 index 00000000..705f3497 --- /dev/null +++ b/ifs-source/arpifs/m7/module/tm5m7_optics_data.F90 @@ -0,0 +1,56 @@ +MODULE TM5M7_OPTICS_DATA + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE TM5M7_DATA, ONLY: NMOD + +IMPLICIT NONE + +SAVE + + ! wavelength type (to be used by methods using the optics) + type, public :: WAVELENDEP + real :: wl ! user requested wavelength unit = um (e.g. 0.550) + real, dimension(7) :: n ! SO4, BC, OC, SOA, SS, DU, WATER + real, dimension(7) :: k ! SO4, BC, OC, SOA, SS, DU, WATER + logical :: split, insitu + end type WAVELENDEP + + ! AOP input type and field + type aopi + REAL(KIND=JPRB), dimension(nmod) :: SO4, NO3, BC, OC, SOA, SS, DU, H2O, numdens, rg, rgd + end type aopi + + + + ! Characteristics of the lookup-table + INTEGER(KIND=JPIM), PARAMETER :: N_RII=15 + INTEGER(KIND=JPIM), PARAMETER :: N_RIR=40 + INTEGER(KIND=JPIM), PARAMETER :: N_X=100 + + REAL(KIND=JPRB),DIMENSION(N_RII) :: lkval ! -log img part refr. index + REAL(KIND=JPRB),DIMENSION(N_RII) :: kval ! img part refr. index, 10^(-lkval) + REAL(KIND=JPRB),DIMENSION(N_RIR) :: n1r ! real part refr. index + + REAL(KIND=JPRB),DIMENSION(N_X) :: XS + REAL(KIND=JPRB),DIMENSION(N_X,N_RIR,N_RII),TARGET :: CEXT_159,A_159,G_159 + REAL(KIND=JPRB),DIMENSION(N_X,N_RIR,N_RII),TARGET :: CEXT_200,A_200,G_200 + + INTEGER(KIND=JPIM), PARAMETER :: OPACDIM = 61 + INTEGER(KIND=JPIM), PARAMETER :: ECHAMHAMDIM=49 + INTEGER(KIND=JPIM), PARAMETER :: SEGELSTEINDIM=1261 + REAL(KIND=JPRB),DIMENSION(:,:), ALLOCATABLE:: OPAC,ECHAMHAM,SEGELSTEIN + + INTEGER(KIND=JPIM) :: NWDEP + TYPE(WAVELENDEP),DIMENSION(:),ALLOCATABLE :: WDEP + + + INTEGER(KIND=JPIM) :: NASWBAND + TYPE(WAVELENDEP),DIMENSION(:),ALLOCATABLE :: ASWBAND + + INTEGER(KIND=JPIM), PARAMETER :: NALWBAND =16 + REAL(KIND=JPRB),DIMENSION(NALWBAND) :: ALWWN1 + REAL(KIND=JPRB),DIMENSION(NALWBAND) :: ALWWN2 + ! dimension for array AOP_OUT_ADD + INTEGER(KIND=JPIM), PARAMETER :: NADD = 5 + +END MODULE TM5M7_OPTICS_DATA diff --git a/ifs-source/arpifs/m7/module/yomm7ctl.F90 b/ifs-source/arpifs/m7/module/yomm7ctl.F90 new file mode 100644 index 00000000..2393c187 --- /dev/null +++ b/ifs-source/arpifs/m7/module/yomm7ctl.F90 @@ -0,0 +1,51 @@ +!**** YOMM7CTL +! +! PURPOSE. +! -------- +! MODULE CONTAINING VARIABLES FOR HAM-M7's M7CTL +! +! PARAMETER DESCRIPTION +! --------- ----------- ! +! +! REFERENCE. +! ---------- +! +! AUTHOR. +! ------- +! 2020-11-17 Tero Mielonen (TeMi) + + +! RCHG -> A natural place for this module is arpifs/module +! we moved to arpifs/m7/modules for the developing +! process (easier track of files for m7) +MODULE YOMM7CTL + +USE PARKIND1 ,ONLY : JPIM + +IMPLICIT NONE +SAVE + +TYPE :: TM7CTL + +!Aerosol water uptake scheme: +!NWATER = 0 Jacobson et al., JGR 1996 +! = 1 Kappa-Koehler theory based approach (Petters and Kreidenweis, ACP 2007) + INTEGER(KIND=JPIM) :: NWATER + +!Choice of the sulfate aerosol nucleation scheme: +! NSNUCL = 0 off +! = 1 Vehkamaeki et al., JGR 2002 +! = 2 Kazil and Lovejoy, ACP 2007 + INTEGER(KIND=JPIM) :: NSNUCL + +!Choice of the organic aerosol nucleation scheme: +!NONUCL = 0 off +! = 1 Activation nucleation, Kulmala et al., ACP 2006 +! = 2 Kinetic nucleation, Laakso et al., ACP 2004 + INTEGER(KIND=JPIM) :: NONUCL + +END TYPE TM7CTL + +TYPE(TM7CTL), TARGET :: YRM7CTL + +END MODULE YOMM7CTL diff --git a/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 new file mode 100755 index 00000000..5948dd0c --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/hamm7_interface.F90 @@ -0,0 +1,2143 @@ +SUBROUTINE HAMM7_INTERFACE( & + & YDMODEL, KIDIA, KFDIA, KLON, KTDIA, KLEV, KTILES, & + & KFLDX, KLEVX, KTRAC, KAERO, KCHEM, KSTGLO, PGEOH, & + & PRS1, PRSF1, PAEROP, PCAERO, PCEN, PAPHIF, & + & PFPLCL, PFPLCN, PFPLSL, PFPLSN, PGELAT, PGELAM, & + & PAP, PIP, PLP, PRP, PSP, PCOVPTOT, & + & PLU, PMFU, PO3P, PQP, PTP, PTHP, PTENC, PCFLX, & + & PAERDDP, PAERSDM, PAERSRC, PAERWS, PAERGUST, PAERUST, PAERMAP, & + & PCLAERS, PPRAERS, PCHEM2AER, & + & PFRTI, PLSM, PSNS, PWND, PWS1, PAERFLX, PAERLIF, & + & PAERODDF, PTSPHY, PGFL, & + & PODTO, PAERO_WVL_DIAG, & + & PAER_TAU, PAER_SSA, PAER_ASYM, PAER_TAU_LW, & + & PTAUS_AER, PTAUA_AER, PPMAER, & + & PEXTRA, PVERVEL, PCCNL, PCCNO, PAHFSTI, PCI, PZ0M, & + & PAHFLEV, PUP, PVP, PCVL, PCVH, PSO2DD, PGEMU, & + & PBLH, PSNOWACL, KCTOP, KCBOT, & + & PAEPM1, PAEPM25, PAEPM10) + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 30-APR-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *hamm7_interface* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *HAMM7_INTERFACE* is called from AER_PHY3_LAYER │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ Vicent Huijen (KNMI), Tommi Bergman (FMI), Thomas Kuehn (FMI/UEF) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May. 2020 - V. Huijnen : Modifications for TM5M7 │ +! │ Sep. 2020 - T. Bergman : TM5M7 work │ +! │ Apr. 2024 - Lianghai Wu : revision for CY48r1 │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactoring │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ + +! RCHG: (TODO) +! This subroutine assumes YAEROUT() has a number of elements, we may have +! to introduce something that test that the number is consistent with what +! is needed. Also the namelist with YAEROUT specification may need to be +! consistent with how we fill things here (not sure about it). +! +! RCHG: (TODO) +! For this subroutine the description of the steps is not very uniform +! For so long subroutines we may need a table of contents to any reader +! can understand what is doing or better per section headers or split +! with CONTAINS into different parts. The advantage of the last approach +! is to indentify and isolate what are the input/outputs of each step. +! The problem are the associate environments. + + +! PARAMETER DESCRIPTION UNITS +! --------- ----------- ----- +! INPUT PARAMETERS (INTEGER): + +! *KIDIA* START POINT +! *KFDIA* END POINT +! *KLEV* NUMBER OF LEVELS +! *KLON* NUMBER OF GRID POINTS PER PACKET +! *KLEVS* NUMBER OF SOIL LAYERS +! *KTILES* NUMBER OF TILES (I.E. SUBGRID AREAS WITH DIFFERENT +! OF SURFACE BOUNDARY CONDITION) +! *KVTYPES* NUMBER OF biomes for land carbon +! *KTRAC* Number of tracers +! KLEVXG : number of levels to compute +! KAERO : Number of aerosol fields +! KCHEM : Number of chemistry tracers +! KFLDX - number of the last field. of what??? TB +! PRS1(KLON,0:KLEV) : HALF-LEVEL PRESSURE (Pa) +! PRSF1(KLON,KLEV) : FULL-LEVEL PRESSURE (Pa) +! PAEROP(KLON,KLEV,KAERO) : Aerosol concentrations (kg/kg) - Note that fields are only non-zero if NACTAERO > 0 +! PCAERO is the aerosol density kg cm-3 (KWHAT=0) +! PCAERO is the optical thickness ND (KWHAT=2) +! PCEN(KLON,KLEV,KCHEM) : CONCENTRATION OF TRACERS (kg/kg) TB:Chemistry +! PAPHIF : geopotential height "gz" at full levels. +! PFPLCL (KLON,KLEV+1) : CONVECTIVE PRECIPITATION AS RAIN (kg/m2s) +! PFPLCN : convective precipitation as snow. +! *PFPLSL* LARGE SCALE RAIN FLUX KG/(M2*S) +! *PFPLSN* LARGE SCALE SNOW FLUX KG/(M2*S) +! PGELAT(KLON) : LATITUDE (RADIANS) +! *PGELAM* LONGITUDE RADIANS +! PAP : (KLON,KLEV) ; CLOUD FRACTION +! PIP (KLON,KLEV) : ICWC (kg/kg) +! PLP (KLON,KLEV) : LWC (kg/kg) +! *PSP* (KLON,KLEV) : Snow water content (kg/kg) +! PRP (KLON,KLEV) : Rain water content (kg/kg) +! PCOVPTOT(KLON,KLEV) : PRECIP FRACTION 0..1 +! *PLU* LIQUID WATER CONTENT IN UPDRAFTS KG/KG +! PQP(KLON,KLEV) : FULL-LEVEL HUMIDITY (W. DYN.TEND.) (kg kg-1) +! PTP (KLON,KLEV) : TEMPERATURE (K)! +! pthp ? ZPPTHPW(KPROMA,KOPLEV) ! theta'w??? +! PTENC (KLON,KLEV,KTRAC) : TENDENCY OF CONCENTRATION OF TRACERS including chemistry(kg/kg s-1) +! PCFLX(KLON,KTRAC) : SURFACE FLUX OF TRACERS (xx m-2) +! PAERDDP(KLON,NACTAERO) : aerosol dry deposition +! PAERSDM(KLON,NACTAERO) : aerosol sedimentation +! PAERSRC(KLON,NACTAERO) : SOURCE FLUX (xx m-2) +! PAERWS : Wind speed (average of horizontal wind speed) (m/s) +! PAERGUST : Wind gust (maximum 3 second gust in the hour) (m/s) +! PAERMAP(KLON,5) : DUST MASK-RELATED QUANTITIES +! ??? PCLAERS(KLON) ! aerosol +! PPRAERS(KLON) ! radvis.f90 +! PALBD : (KPROMA,NTSW) ; DIFFUSE ALBEDO IN THE NSW SW INTERVALS +! *PFRTI* TILE FRACTIONS (0-1) +! PLSM (KLON) : land-sea mask [0-1] +! PSNS : MASS OF SNOW PER UNIT SURFACE +! PWND(KLON) : Surface wind +! PWS1 : REAL : TOP LAYER SOIL MOISTURE CONTENT +! PAERFLX(KLON,12,9) : DIAGNOSTIC DUST SOURCE FLUXES +! PAERLIF(KLON,9) : DIAGNOSTIC LIFTING THRESHOLD SPEED +! PAERODDF ! Diagnostic array with aerosol fluxes (sources and sinks) +! PTSPHY : TIMESTEP (s) +! PGFL : GFL fields +! PVERVEL : Vertical velocity [Pa s-1] +! PCCNL : CCN over land +! PCCNO : CCN over ocean +! *PAHFSTI* SURFACE SENSIBLE HEAT FLUX W/M2 +! PCI(KLON) : FRACTION OF SEA-ICE +! PZ0M : roughness length for momentum (m) +! PAHFLEV : latent heat flux (W/m2) +! PUP : u-wind (m/s) +! PVP : v-wind (m/s) +! PCVL : low vegetation cover +! PCVH : high vegetation cover +! PGEMU : sine of latitude +! PGEOH : geopotential at half levels (M2/S2) +!------------ + +!----------------------------------------------------------------------- + +USE PARKIND1, ONLY: JPIM, JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE TYPE_MODEL, ONLY: MODEL +USE YOMCST, ONLY: RD, RG, RPI +USE YOMCT0, ONLY: LIFSMIN, LIFSTRAJ +USE YOMCT3, ONLY: NSTEP +USE TM5M7_DATA, ONLY: MODAL_DATA, MODE_TRACERS, MODE_START, & + & MODE_TRACERS_BY_MODS, MODE_END_SO4, NAERMOD, NMOD, NSOL,& + & IISVOC, IELVOC, IACS_N, ISO4, ISO4ACS,ISO4COS +USE YOMCHEM, ONLY: IEXTR_WD, IEXTR_CH, IEXTR_NG, IEXTR_DD, IEXTR_CHTR + +USE YOE_AERODIAG, ONLY: JPAERO_WVL_AOD, JPAERO_WVL_AODABS, JPAERO_WVL_AODFM, & + & JPAERO_WVL_SSA, JPAERO_WVL_ASSIMETRY +USE YOMLUN, ONLY: NULOUT + +! HAM-M7 +USE MO_HAM, ONLY: nclass, naerocomp, sizeclass, nccndiag, subm_ngasspec +USE OIFS_TO_HAM, ONLY: ind_oifs_ham +USE MO_HAM_SUBM, ONLY: HAM_SUBM_INTERFACE ! replaced HAM-M7 call with submodel interface +USE MO_ACTIV, ONLY: activ_updraft,nw, idt_cdnc, idt_icnc ! HAM-M7 activation updraft calculation, effective radii +USE MO_HAM_ACTIV, ONLY: ham_activ_abdulrazzak_ghan, ham_activ_koehler_ab ! HAM-M7 activation +USE MO_PARAM_SWITCHES, ONLY: ncd_activ ! for activation +USE MO_TRACDEF, ONLY: ntrac, trlist ! number of tracer for mass/number mixing ratio conversion, trlist for wet deposition flags +USE MO_TRACER_PROCESSES, ONLY: xt_borrow, xt_conv_massfix ! conserving the negative tracer values from tendency, and convective case +USE MO_TIME_CONTROL, ONLY: time_step_len ! time step length for tendency +USE MO_HAMMOZ_WETDEP, ONLY: wetdep_interface ! wet deposition interface call +USE MO_HAM_WETDEP, ONLY: ham_conv_lfraq_so2 +USE MO_HAMMOZ_SEDIMENTATION, ONLY: sedi_interface ! sedimentation interface call +USE MO_HAMMOZ_DRYDEP, ONLY: drydep_interface ! dry deposition interface call +USE MO_HAM_RAD, ONLY: ham_rad,ham_rad_cache_cleanup,ham_rad_cache + +USE YOE_AER_ACTIV, ONLY: AER_ACTIV ! M&N activation scheme + +USE TM5M7_OPTICS_DATA, ONLY : NWDEP, NASWBAND, ASWBAND !,WDEP, AER_TAU, AER_SSA,AER_ASYM,AER_TAU_LW +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP, WAV_GRID, WAV_GRIDA +USE TM5M7_EMIS_DATA, ONLY : VKARMAN ! von karman constant for dry deposition +USE TM5_CHEM_MODULE, ONLY : NCHEM2AER +!----------------------------------------------------------------------- + +IMPLICIT NONE + +TYPE(MODEL), INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA, KFDIA, KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA, KLEV, KFLDX, KLEVX +INTEGER(KIND=JPIM), INTENT(IN) :: KTILES +INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM), INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) +INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) +INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO +INTEGER(KIND=JPIM), INTENT(IN) :: KCTOP(KLON) ! cloud top level index +INTEGER(KIND=JPIM), INTENT(IN) :: KCBOT(KLON) ! cloud bottom level index + +REAL(KIND=JPRB),INTENT(IN) :: PGEOH(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRSF1(KLON,KLEV), PRS1(KLON,0:KLEV), PAPHIF(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PAP(KLON,KLEV), PIP(KLON,KLEV), PLP(KLON,KLEV), PLU(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRP(KLON,KLEV), PSP(KLON,KLEV), PCOVPTOT(KLON,KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PAEROP(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PCAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PCEN(KLON,KLEV,KTRAC), PCFLX(KLON,KTRAC) +REAL(KIND=JPRB),INTENT(IN) :: PO3P(KLON,KLEV), PQP(KLON,KLEV), PTP(KLON,KLEV), PTHP(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PFPLCL(KLON,0:KLEV),PFPLCN(KLON,0:KLEV),PFPLSL(KLON,0:KLEV),PFPLSN(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PGELAT(KLON) , PGELAM(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PFRTI(KLON,KTILES) +REAL(KIND=JPRB),INTENT(IN) :: PAERWS(KLON), PAERGUST(KLON), PAERUST(KLON), PAERMAP(KLON,5) +REAL(KIND=JPRB),INTENT(IN) :: PAERSRC(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(IN) :: PCHEM2AER(KLON,KLEV,NCHEM2AER) +REAL(KIND=JPRB),INTENT(IN) :: PAERFLX(KLON,12,9), PAERLIF(KLON,9), PCLAERS(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PLSM(KLON) , PSNS(KLON) , PWND(KLON) , PWS1(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PTSPHY +REAL(KIND=JPRB),INTENT(IN) :: PVERVEL(KLON,KLEV) ! vertical velocity (needed in HAM-M7 activation) +REAL(KIND=JPRB),INTENT(IN) :: PCCNL(KLON) ! CCN over land (needed in liquid effective radius calc.) +REAL(KIND=JPRB),INTENT(IN) :: PCCNO(KLON) ! CCN over ocean (needed in liquid effective radius calc.) +REAL(KIND=JPRB),INTENT(IN) :: PAHFSTI(KLON,KTILES) ! surface sensible heat flux for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PCI(KLON) ! fraction of sea-ice for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PZ0M(KLON) ! roughness length for momentum for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PAHFLEV(KLON) ! latent heat flux for dry deposition +REAL(KIND=JPRB),INTENT(IN) :: PUP(KLON,KLEV) ! u component of wind +REAL(KIND=JPRB),INTENT(IN) :: PVP(KLON,KLEV) ! v component of wind +REAL(KIND=JPRB),INTENT(IN) :: PCVL(KLON) ! low vegetation cover +REAL(KIND=JPRB),INTENT(IN) :: PCVH(KLON) ! high vegetation cover +REAL(KIND=JPRB),INTENT(IN) :: PGEMU(KLON) ! sine of latitude +REAL(KIND=JPRB),INTENT(IN) :: PMFU(KLON,KLEV) ! Conv. mass flux up +REAL(KIND=JPRB),INTENT(IN) :: PSNOWACL(KLON,KLEV) ! accretion rate of snow with cloud droplets +REAL(KIND=JPRB),INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERDDP(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB),INTENT(INOUT) :: PAERSDM(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +! Total optical depth at various wavelenghts. +! NOTE!! These wavelength definitions are not necessarily consistent +! with what is used in IFS-AER +REAL(KIND=JPRB),INTENT(OUT) :: PODTO(KLON) + +!REAL(KIND=JPRB),INTENT(OUT) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) +!REAL(KIND=JPRB),INTENT(IN) :: PALBD(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW), PFRTI(KLON,KTILES) + +REAL(KIND=JPRB),INTENT(INOUT) :: PAERO_WVL_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) +REAL(KIND=JPRB),INTENT(OUT) :: PAERODDF(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO,8) +REAL(KIND=JPRB),INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) +REAL(KIND=JPRB),INTENT(INOUT) :: PAER_TAU(KLON,KLEV,14), PAER_SSA(KLON,KLEV,14),PAER_ASYM(KLON,KLEV,14) +REAL(KIND=JPRB),INTENT(INOUT) :: PAER_TAU_LW(KLON,KLEV,16) +REAL(KIND=JPRB),INTENT(OUT) :: PTAUS_AER(KLON,KLEV,NBANDS_TROP,2),PTAUA_AER(KLON,KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB),INTENT(OUT) :: PPMAER(KLON,KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB),INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM), PPRAERS(KLON) +! Simple sulfur scheme variables: +REAL(KIND=JPRB),INTENT(INOUT) :: PSO2DD(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PBLH(KLON) ! Boundary layer height +! PM output +REAL(KIND=JPRB),INTENT(OUT) :: PAEPM1(KLON) +REAL(KIND=JPRB),INTENT(OUT) :: PAEPM25(KLON) +REAL(KIND=JPRB),INTENT(OUT) :: PAEPM10(KLON) + +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JAER, JK, JL, JWAVL, JT, JB, JN +INTEGER(KIND=JPIM) :: JEXT, ITRC, IKLEVTROP(KLON), IW +INTEGER(KIND=JPIM) :: JO, JH, JY ! inside loop index for OIFS contex, HAM context and YAEROUT +INTEGER(KIND=JPIM) :: JCLASS, JTILE, JMASS, JGAS, JCLOUD ! local loop indice for activation and dry deposition and tracer indexing +INTEGER(KIND=JPIM) :: ISSO2, ISSO4, ISSO4_ACS +INTEGER(KIND=JPIM) :: IMODE +INTEGER(KIND=JPIM) :: IFLAG +INTEGER(KIND=JPIM) :: KTOP ! cloud top index + +REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAERO0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZFAERO(KLON,ntrac)!YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZAER(KLON,KLEV), ZAERNEG(KLON,KLEV) +REAL(KIND=JPRB) :: ZAP(KLON,KLEV), ZAP_COV(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) +REAL(KIND=JPRB) :: ZITSO2(KLON,KLEV) +REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON) +REAL(KIND=JPRB) :: ZTSO2(KLON, KLEV) , ZTSO4(KLON, KLEV,1), ZTSO4_AQ(KLON, KLEV) +REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHO(KLON,KLEV) +REAL(KIND=JPRB) :: ZTAER(KLON,KLEV) +REAL(KIND=JPRB) :: ZTAERO(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZRH(KLON,KLEV),ZTENC0(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NCHEM)!,ZTSO4(KLON,KLEV) +REAL(KIND=JPRB) :: ZM6RP(KLON,KLEV,NMOD)! NMOD=7 +REAL(KIND=JPRB) :: ZM6DRY(KLON,KLEV,NSOL) +REAL(KIND=JPRB) :: ZWW(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZRHOP(KLON,KLEV,NMOD) +REAL(KIND=JPRB) :: ZSVOC(KLON,KLEV) +REAL(KIND=JPRB) :: ZELVOC(KLON,KLEV) +!THIS-IS-NEVER-USED REAL(KIND=JPRB) :: ZSO4G(KLON,KLEV) +REAL(KIND=JPRB) :: ZCEN(KLON,KLEV,KTRAC) ! local tracer number and mixing ratios and gas concentrations for not tendency updated values +REAL(KIND=JPRB) :: PODTO469(KLON), PODTO670(KLON), PODTO865(KLON), PODTO1240(KLON) +REAL(KIND=JPRB) :: ZAER_TAU(KLON,KLEV,14,1), ZAER_SSA(KLON,KLEV,14),ZAER_ASYM(KLON,KLEV,14),ZAER_TAU_LW(KLON,KLEV,16) + +! Optics output fields (to be used and allocated by methods using the optics) +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZTAUS_AER, ZTAUA_AER, ZPMAER ! extinctions +REAL(KIND=JPRB), DIMENSION(:,:,:,:), ALLOCATABLE :: ZAOP_OUT_EXT ! extinctions +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAOP_OUT_A ! single scattering albedo +REAL(KIND=JPRB), DIMENSION(:,:,:), ALLOCATABLE :: ZAOP_OUT_G ! assymetry factor + +!Defined here, but should be passed in Call really: +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: RW_MODE +TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: RWD_MODE +TYPE(MODAL_DATA), DIMENSION(NSOL), TARGET :: H2O_MODE +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: DENS_MODE + +REAL(KIND=JPRB), ALLOCATABLE :: ZAERNGT(:,:) + +REAL(KIND=JPRB) :: ZDEGRAD, ZEPSCOV, ZEPSWAT, ZRWSAT, ZRWPWP +REAL(KIND=JPRB) :: ZQLWP(KLON,KLEV), ZQIWP(KLON,KLEV) +REAL(KIND=JPRB) :: ZTMPA + +LOGICAL :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud +LOGICAL :: LICECLD(KLON,KLEV) ! logical for ice cloud + +REAL(KIND=JPRB), PARAMETER :: ZEPSEC=1e-14_JPRB +REAL(KIND=JPRB), PARAMETER :: ZMIN_CDNC=10.0_JPRB !eehol: minimum CDNC (can be changed but for now 10 cm-3) +REAL(KIND=JPRB), PARAMETER :: ZDEF_CDNC=125.0_JPRB !eehol: default CDNC (can be changed but for now 125 cm-3) +REAL(KIND=JPRB), PARAMETER :: ZDEF_RE_LIQ=4.0_JPRB !eehol: default liq eff radius (can be changed but for now 4 mu m comes from liquid effective radius routine (PP_MIN_RE_UM)) +REAL(KIND=JPRB), PARAMETER :: ZDEF_RE_ICE=80._JPRB*0.64952_JPRB !eehol: default ice eff radius (comes from ice effective radius routine (ZDEFAULT_RE_UM)) +REAL(KIND=JPRB), PARAMETER :: ZTUNPAR=0.8164965_JPRB !eehol: tuning parameter for sigma_w derived from TKE (square root of 2/3 (isotropy assumption)) + +REAL(KIND=JPRB),PARAMETER :: INFINITY=HUGE(1._JPRB) + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +! variables for the M7 call +REAL(KIND=JPRB) :: ZGRVOL(KLON,KLEV) !grid box volume for diagnostics +REAL(KIND=JPRB) :: ZPBL(KLON) !planetary boundary layer top level (in vdfmain.F90 ITOP=1) +REAL(KIND=JPRB) :: ZTMP(KLON) !temporary array to accumulate diagnostics +REAL(KIND=JPRB) :: ZXTM0(KLON,KLEV,ntrac) !tracer mixing ratios for HAM +REAL(KIND=JPRB) :: ZXTM1(KLON,KLEV,ntrac) !tracer mixing ratios for HAM +REAL(KIND=JPRB) :: ZXTTE(KLON,KLEV,ntrac) !tracer tendency for HAM +REAL(KIND=JPRB) :: ZXTTE_CLD(KLON,KLEV,ntrac) !tracer tendency for cloud vars for HAM +REAL(KIND=JPRB) :: ZXTTEM1(KLON,KLEV,ntrac) !tracer tendency for HAM +! added here variables for HAM-M7 activation +REAL(KIND=JPRB), ALLOCATABLE :: ZW(:,:,:) !mean or bins of updraft velocity [m s-1] +REAL(KIND=JPRB), ALLOCATABLE :: ZWPDF(:,:,:) !updraft velocity PDF over bins +REAL(KIND=JPRB), ALLOCATABLE :: ZRC(:,:,:,:) !critical radius of activation per mode [m] +REAL(KIND=JPRB), ALLOCATABLE :: ZSMAX(:,:,:) !maximum supersaturation +REAL(KIND=JPRB) :: ZTKEM1(KLON,KLEV) !turbulent kinetic energy as zero as it is not used for now +REAL(KIND=JPRB) :: ZSIGMA_W(KLON,KLEV) !standard deviation of updraft pdf +REAL(KIND=JPRB) :: ZSMAXMN(KLON,KLEV) !maximum supersaturation for M&N scheme +REAL(KIND=JPRB) :: ZWCAPE(KLON) !CAPE as zero as it is not used +REAL(KIND=JPRB) :: ZRDRY(KLON,KLEV,nclass) !dry radius for each class +REAL(KIND=JPRB) :: ZESW(KLON,KLEV) !saturation water vapor pressure +REAL(KIND=JPRB) :: ZA(KLON,KLEV,nclass) !curvature parameter A of the Koehler equation +REAL(KIND=JPRB) :: ZB(KLON,KLEV,nclass) !hygroscopicity parameter B of the Koehler equation +REAL(KIND=JPRB) :: ZSC(KLON,KLEV,nclass) !critical supersaturation [% 0-1] +REAL(KIND=JPRB) :: ZNACT(KLON,KLEV,nclass) !number of activated particles per mode [m-3] +REAL(KIND=JPRB) :: ZFRACN(KLON,KLEV,nclass) !fraction of activated particles per mode +REAL(KIND=JPRB) :: ZCDNCACT(KLON,KLEV) !number of activated particles [m-3] +REAL(KIND=JPRB) :: ZCDNC_temp(KLON,KLEV) !eehol: temporary for tendency of CDNC +REAL(KIND=JPRB) :: ZICNC_temp(KLON,KLEV) !eehol: temporary for tendency of ICNC +REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV)! liquid effective radius +REAL(KIND=JPRB) :: ZNACT_AS(KLON,KLEV),ZNACT_CS(KLON,KLEV),ZNACT_KS(KLON,KLEV) ! variables for modewise activated fraction calculations +REAL(KIND=JPRB) :: ZFRAC_KS,ZFRAC_AS,ZFRAC_CS ! variables for modewise activated fraction calculation +REAL(KIND=JPRB) :: ZNACT_TOT ! variables for modewise activated fraction calculation +! variables for HAM-M7 wet deposition +REAL(KIND=JPRB) :: ZXTP1(KLON,KLEV,ntrac) !updated tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZXTP1C(KLON,KLEV,ntrac) !in-cloud tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZXTP10(KLON,KLEV,ntrac) !ambient tracer mass/number mixing ratio +REAL(KIND=JPRB) :: ZDUMMY(KLON,ntrac) !placeholder for pxtbound which is only necessary in the conv. case (conv. massfix boundary condition) +REAL(KIND=JPRB) :: ZDUM3D(KLON,KLEV,ntrac) !updraft mass flux (for conv case only) + +REAL(KIND=JPRB) :: ZWDEP_SCAV_IC(KLON,ntrac) !in-cloud scavenged mr +REAL(KIND=JPRB) :: ZWDEP_SCAV_BC(KLON,ntrac) !below cloud scavenged mr +REAL(KIND=JPRB) :: ZFUXT3D(KLON,KLEV,ntrac) !updraft mass flux (for conv case only) + +REAL(KIND=JPRB) :: ZDUM2D(KLON,KLEV) !convective flux needed only for conv. case (see cuflx) +REAL(KIND=JPRB) :: ZLFRAC_SO2(KLON,KLEV) !liquid tracer fraction (SO2) -ham specific- +REAL(KIND=JPRB) :: ZDPG(KLON,KLEV) !dp/g +REAL(KIND=JPRB) :: ZQP(KLON,KLEV) !full level humidity with threshold + +LOGICAL :: LSTRAT !logical switch for stratiform or convective case (TRUE for strat., FALSE for conv.) +REAL(KIND=JPRB) :: ZFEVAPR_cov(KLON,KLEV) !evaporation of rain, convective case [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS_cov(KLON,KLEV) !sublimation of snow, convective case [kg/m2/s] +REAL(KIND=JPRB) :: ZFEVAPR_str(KLON,KLEV) !evaporation of rain, stratiform case [kg/m2/s] +REAL(KIND=JPRB) :: ZFSUBLS_str(KLON,KLEV) !sublimation of snow, stratiform case [kg/m2/s] +REAL(KIND=JPRB) :: ZMRATEPR_cov(KLON,KLEV) !rain formation rate in cloudy part, convective case +REAL(KIND=JPRB) :: ZMRATEPS_cov(KLON,KLEV) ! ice formation rate in cloudy part, convective case +REAL(KIND=JPRB) :: ZMRATEPR_str(KLON,KLEV) !rain formation rate in cloudy part, stratiform case +REAL(KIND=JPRB) :: ZMRATEPS_str(KLON,KLEV) ! ice formation rate in cloudy part, stratiform case + +REAL(KIND=JPRB) :: ZMSNOWACL_str(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part strat +REAL(KIND=JPRB) :: ZMSNOWACL_cov(KLON,KLEV) !accretion rate of snow with cloud droplets in cloudy part conv +REAL(KIND=JPRB) :: ZFLXR, ZFLXS, ZFLXRB, ZFLXSB !variables to calculate rain and snow evap/formation + +REAL(KIND=JPRB) :: ZFPLCL(KLON,KLEV),ZFPLCN(KLON,KLEV),ZFPLSL(KLON,KLEV),ZFPLSN(KLON,KLEV) +REAL(KIND=JPRB) :: ZLP(KLON,KLEV) !temporary variable for cloud water content +REAL(KIND=JPRB) :: ZIP(KLON,KLEV) !temporary variable for cloud ice water content +REAL(KIND=JPRB) :: ZLPU(KLON,KLEV) !temporary variable for cloud water content +REAL(KIND=JPRB) :: ZIPDUM(KLON,KLEV) !temporary variable for cloud ice water content +REAL(KIND=JPRB) :: ZMFU(KLON,KLEV) ! temporary variable for constraing Conv. mass flux up +! variables for ICNC calculations +REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm3] +! added here variables for dry deposition and sedimentation +REAL(KIND=JPRB) :: ZTENCIH(KLON,KLEV,ntrac) !for HAM tendencies +REAL(KIND=JPRB) :: ZAHFSM(KLON) +REAL(KIND=JPRB) :: ZWND(KLON) +! variables not needed for HAM aerosol dry deposition (if gas deposition and different surfaces are taken into account these need to be revised!) +REAL(KIND=JPRB) :: ZCFML(KLON), ZCFMW(KLON), ZCFMI(KLON), ZCFNCL(KLON), ZCFNCW(KLON), ZCFNCI(KLON), ZEPDU2, ZKAP +REAL(KIND=JPRB) :: ZGEOM1(KLON,KLEV), ZRIL(KLON), ZRIW(KLON), ZRII(KLON), ZTVIR1(KLON,KLEV), ZTVL(KLON), ZTVW(KLON) +REAL(KIND=JPRB) :: ZTVI(KLON), ZAZ0(KLON), ZFRL(KLON), ZSRFL(KLON), ZFOREST(KLON), ZTSI(KLON), ZAZ0L(KLON) +REAL(KIND=JPRB) :: ZAZ0I(KLON), ZCDNI(KLON) +! variables needed for HAM aerosol dry deposition +LOGICAL :: ZLOLAND(KLON) !logical land mask +REAL(KIND=JPRB) :: ZXTEMS(KLON,ntrac) !surface emissions modified by dry deposition +REAL(KIND=JPRB) :: ZAZ0W(KLON), ZFRW(KLON), ZCVS(KLON), ZCVW(KLON), ZVGRAT(KLON) !rough. len. wat., wat. frac., snow cov. frac., wet skin frac., veg. ratio +REAL(KIND=JPRB) :: ZCDNL(KLON), ZCDNW(KLON) !ustar (in not used variable), aerodynamic resis. on surface (in not used variable) +REAL(KIND=JPRB) :: ZXTMD1(KLON,KLEV,NTRAC) !tracer mixing ratios for HAM drydep (updated with tend) +! output diagnostics +INTEGER, PARAMETER :: N_NUC_DIAG=5 +REAL(KIND=JPRB) :: ZOUT3(KLON,KLEV,2*(NAEROCOMP+NCLASS)), ZOUT_DNUC(KLON,KLEV,N_NUC_DIAG) +REAL(KIND=JPRB) :: SEDOUT(KLON,KLEV,KTRAC) ! changed ntrack to ktrac (RCHG) +REAL(KIND=JPRB) :: DDEPOUT(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) :: SEDOUT_2D(KLON,KTRAC) + +REAL(KIND=JPRB) :: WDEPOUT_2D(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_IC_2D(KLON,KTRAC) +REAL(KIND=JPRB) :: WDEPOUT_BC_2D(KLON,KTRAC) + +REAL(KIND=JPRB) :: ZSEDIFLUX(KLON,KLEV,NTRAC) +REAL(KIND=JPRB) :: ZSEDIFLUXSURF(KLON,NTRAC) +REAL(KIND=JPRB) :: ZDDEPFLUX(KLON,NTRAC) +REAL(KIND=JPRB) :: ZDDEPFLUX_SO2(KLON) +REAL(KIND=JPRB) :: ZVDEP(KLON,NTRAC) !ddep velocity for diagnostics from ham +INTEGER(KIND=JPIM), parameter::ZKROW=1 ! KROW only used in ECHAM but needed inside HAM-codes so set as 1. +INTEGER(KIND=JPIM) :: IBLK +REAL(KIND=JPRB) :: REFFI(KLON,KLEV,ZKROW), REFFL(KLON,KLEV,ZKROW) +INTEGER(KIND=JPIM) :: LWBANDS ! number of LW bands +REAL(KIND=JPRB) :: PRS1D(KLON,KLEV) +INTEGER(KIND=JPIM) :: ISO4_C, ISSO4_C ! temporary tracer index of gas-phase SO4 (retrieved from chemistry module) + +REAL(KIND=JPRB) :: PAOD(KLON,NASWBAND), PSSA(KLON,NASWBAND), PABS(KLON,NASWBAND), PASY(KLON,NASWBAND),PFAOD(KLON,NASWBAND) +REAL(KIND=JPRB) :: PAOD_LW(KLON,16) + +! Boundary layer height index calculation +REAL(KIND=JPRB) :: ZBLHIDX(KLON) ! index +LOGICAL :: LBLHFOUND(KLON) ! logical if boundary layer height is found +REAL(KIND=JPRB) :: ZRG ! 1/RG + +!!! parameters needed for diagnostic aerosol optical properties +LOGICAL, PARAMETER :: LSAFETY=.FALSE. ! If true, impose limits on computed optical properties +LOGICAL :: LDIAG_AEROPT ! logical for aerosol optics +REAL(KIND=JPRB) :: ZAER_TAU_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: ZAER_SSA_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: ZAER_ASYM_DIAG(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: LAMBDA_DIAG(YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) + +REAL(KIND=JPRB) :: ZAOD_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG), ZSSA_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +REAL(KIND=JPRB) :: ZABS_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG), ZASY_DIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG) +!----------------------------------------------------------------------- + +#include "abor1.intfb.h" +#include "surf_inq.h" +#include "satur.intfb.h" +#include "aer_negat.intfb.h" +#include "tm5m7_optics_aop_get.intfb.h" +#include "troplev.intfb.h" +#include "chem_inext.intfb.h" +#include "ice_effective_radius.intfb.h" + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('HAMM7_INTERFACE',0,ZHOOK_HANDLE) +ASSOCIATE( & + & YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDPHYRAD => YDMODEL%YRML_PHY_RAD, & + & YDPHYAER => YDMODEL%YRML_PHY_AER, & + & YREAERSRC => YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YREAERATM => YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YREAERLID => YDMODEL%YRML_PHY_AER%YREAERLID, & + & YREAERSNK => YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YRERAD => YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDRIP => YDMODEL%YRML_GCONF%YRRIP, & + & YDCHEM => YDMODEL%YRML_CHEM%YRCHEM, & + & YRCOMPO => YDMODEL%YRML_CHEM%YRCOMPO, & + & YREPHY => YDMODEL%YRML_PHY_EC%YREPHY, & + & YRECLDP => YDMODEL%YRML_PHY_EC%YRECLDP, & + & YDSPP_CONFIG => YDMODEL%YRML_GCONF%YRSPP_CONFIG) + + ASSOCIATE( & + ! --- YGFL ------------------------------------------------ + & NACTAERO => YGFL%NACTAERO, NAERO => YGFL%NAERO, & + & NGHG => YGFL%NGHG, NCHEM => YGFL%NCHEM, & + & NDIM => YGFL%NDIM, & + & YAEROUT => YGFL%YAEROUT, YR => YGFL%YR, & + & YS => YGFL%YS, YCHEM => YGFL%YCHEM, & + & YAERO => YGFL%YAERO, YGHG => YGFL%YGHG, & + & YAEROCLIM => YGFL%YAEROCLIM, & + & YCDNC => YGFL%YCDNC, YICNC => YGFL%YICNC, & + & YRE_LIQ => YGFL%YRE_LIQ, YRE_ICE => YGFL%YRE_ICE, & + !included CDNC, ICNC, liq and ice eff rad + & NAERO_WVL_DIAG => YGFL%NAERO_WVL_DIAG, & + & LAERCHEM => YGFL%LAERCHEM, & + ! --- YRCOMPO --------------------------------------------- + & LCHEM_DIA => YRCOMPO%LCHEM_DIA, & + & AERO_SCHEME => YRCOMPO%AERO_SCHEME, & + & CHEM_SCHEME => YDCHEM%CHEM_SCHEME, & + & LAERNITRATE => YRCOMPO%LAERNITRATE, & + & NSO4SCHEME => YREAERSRC%NSO4SCHEME, & + ! --- YREAERATM ------------------------------------------- + & LAERDRYDP => YREAERATM%LAERDRYDP, & + & LAERSEDIM => YREAERATM%LAERSEDIM, & + & LAERSURF => YREAERATM%LAERSURF, & !add logicals for dry dep and sedi + & LAER6SDIA => YREAERATM%LAER6SDIA, & + & LAERCLIMG => YREAERATM%LAERCLIMG, & + & LAERCLIMZ => YREAERATM%LAERCLIMZ, & + & LAERGTOP => YREAERATM%LAERGTOP, & + & LAERHYGRO => YREAERATM%LAERHYGRO, & + & LAERLISI => YREAERATM%LAERLISI, & + & LAERNGAT => YREAERATM%LAERNGAT, & + & LAERSCAV => YREAERATM%LAERSCAV, & + & LAERSCAV_CHEM => YREAERATM%LAERSCAV_CHEM, & + & LAERVOL => YREAERATM%LAERVOL, & + & NXT3DAER => YREAERATM%NXT3DAER, & + & LAERRRTM => YREAERATM%LAERRRTM, & + & REPSCAER => YREAERATM%REPSCAER, & + ! --- YRERAD ---------------------------------------------- + & LAERVISI => YRERAD%LAERVISI, & + & NTSW => YRERAD%NTSW, & + & RNS => YRERAD%RNS, & + & RSIGAIR => YRERAD%RSIGAIR, & + & NRADFR => YRERAD%NRADFR, & !FREQUENCY OF FULL RADIATION COMPUTATIONS + & NAEROOPT => YRERAD%NAEROOPT, & + & NCLOUDACT => YRERAD%NCLOUDACT, & ! integer to switch activation scheme (0=default,1=Morales&Nenes, 2=Abdul-Razzak&Ghan) + & RCCNSEA => YRERAD%RCCNSEA, & ! default ccn value over sea + & RCCNLND => YRERAD%RCCNLND, & ! default ccn value over land + ! --- OTHERS ---------------------------------------------- + & YDAERM7 => YDPHYAER%YREAEROPT, & ! use this to transfer AOD, SSA and ASY to rad scheme + & NWLID => YREAERLID%NWLID, & + & YSURF => YREPHY%YSURF, & + & RRHTAB => YREAERSNK%RRHTAB, & + & RNICE => YRECLDP%RNICE, & !default for ICNC + & RCLDMAX => YRECLDP%RCLDMAX, & !max cloud value + & LAERICESED => YRECLDP%LAERICESED, & + & LAERICEAUTO => YRECLDP%LAERICEAUTO, & + & NSTART => YDRIP%NSTART ) + +! & NINDSCAV=>YREAERATM%NINDSCAV, NTSCAV=>YREAERATM%NTSCAV, & +! & NDDUST=>YREAERSRC%NDDUST, NTYPAER=>YREAERSRC%NTYPAER, & +! ------------------------------------------------------------------ + +!* 0. PROGNOSTIC AEROSOLS - FINAL COMPUTATIONS +! ---------------------------------------- + + +LBLHFOUND(:) = .FALSE. + +ZAHFSM = 0._JPRB +ZEPSCOV = 1.E-03_JPRB +ZEPSWAT = 1.E-18_JPRB +ZDEGRAD = 180._JPRB/RPI + +CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) +CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) + +!* 0.1 SWITCHING ON POSSIBLE DEBUG PRINTS AND ALLOCATING MEMORY +! -------------------------------------------------------- + +ALLOCATE( ZAERNGT(KLON,NACTAERO) ) +ZAERNGT(KIDIA:KFDIA,1:NACTAERO) = 0._JPRB + +ZOUT3(KIDIA:KFDIA,:,:) = 0._JPRB +ZOUT_dnuc(KIDIA:KFDIA,:,:) = 0._JPRB +! Need to initialize those 3 arrays early in case LAERDRYDP=F (GNU, Lianghai Wu) +ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero +ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input +ZXTMD1(KIDIA:KFDIA,:,:) = 0._JPRB + +SEDOUT(KIDIA:KFDIA,:,:) = 0._JPRB +DDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB +WDEPOUT(KIDIA:KFDIA,:,:) = 0._JPRB +ZSEDIFLUX(KIDIA:KFDIA,:,:) = 0._JPRB +ZSEDIFLUXSURF(KIDIA:KFDIA,:) = 0._JPRB +ZDDEPFLUX(KIDIA:KFDIA,:) = 0._JPRB +ZDDEPFLUX_SO2(KIDIA:KFDIA) = 0._JPRB +SEDOUT_2D(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_2D(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_IC_2D(KIDIA:KFDIA,:) = 0._JPRB +WDEPOUT_BC_2D(KIDIA:KFDIA,:) = 0._JPRB +ZMRATEPR_cov(KIDIA:KFDIA,:) = 0._JPRB +ZMRATEPS_cov(KIDIA:KFDIA,:) = 0._JPRB +ZFEVAPR_cov(KIDIA:KFDIA,:) = 0._JPRB ! +ZFSUBLS_cov(KIDIA:KFDIA,:) = 0._JPRB +ZTAERO(KIDIA:KFDIA,:,:) = 0._JPRB + +ZCDNCACT(KIDIA:KFDIA,:) = 0._JPRB !number of activated particles [m-3] +ZCEN(KIDIA:KFDIA,:,:) = 0._JPRB + +ZFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !fraction of activated particles per mode + +ZRG=1/RG + +! computation of tropopause level +CALL TROPLEV(KLON,KIDIA,KFDIA,KLEV,.FALSE.,PTP,PQP,PRSF1,IKLEVTROP) + +! Initializing tracer number and mixing ratios and gas concentrations to not be tendency updated values +ZCEN(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ITRC=0 +DO JEXT=1,NGHG + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YGHG(JEXT)%MP9_PH) + ENDDO + ENDDO +ENDDO + +DO JEXT=1,NAERO + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YAERO(JEXT)%MP9_PH) + ENDDO + ENDDO +ENDDO + +DO JEXT=1,NCHEM + ITRC=ITRC+1 + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZCEN(JL,JK,ITRC) = PGFL(JL,JK,YCHEM(JEXT)%MP9_PH) + ENDDO + ENDDO +ENDDO + +!DO JAER=1,NACTAERO +! DO JK=1,KLEV +! DO JL=KIDIA,KFDIA +! ! check on max-values here to prevent excessive values in OPTICS_AOP_GET.. probably to be removed again!! +! ZAEROK(JL,JK,JAER) =MIN(ZCEN (JL,JK,KAERO(JAER)), 1e10) +! ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) +! ENDDO +! ENDDO +!ENDDO + +! Initialize output aerosol tendencies +DO JAER=1,NACTAERO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAEROK(JL,JK,JAER) =ZCEN (JL,JK,KAERO(JAER)) + ZTAEROK(JL,JK,JAER)=PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO +ENDDO + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZRHO(JL,JK) = PRSF1(JL,JK)/(RD*PTP(JL,JK)) + ZDP(JL,JK) = PRS1(JL,JK) - PRS1(JL,JK-1) + ZDPG(JL,JK) = (PRS1(JL,JK) - PRS1(JL,JK-1))/RG ! calculate dp/g + ZDZ(JL,JK) = ZDP(JL,JK) / (ZRHO(JL,JK)*RG) + ENDDO +ENDDO + +ZM6RP(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZM6DRY(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZRHOP(KIDIA:KFDIA,:,:) = 0.0_JPRB +ZWW(KIDIA:KFDIA,:,:) = 0.0_JPRB + +DO JB=1, NBANDS_TROP + PTAUS_AER(KIDIA:KFDIA,1:KLEV,JB,1) = 0.0_JPRB + PTAUA_AER(KIDIA:KFDIA,1:KLEV,JB,1) = 0.0_JPRB + PPMAER (KIDIA:KFDIA,1:KLEV,JB,1) = 0.0_JPRB + PTAUS_AER(KIDIA:KFDIA,1:KLEV,JB,2) = 0.0_JPRB + PTAUA_AER(KIDIA:KFDIA,1:KLEV,JB,2) = 0.0_JPRB + PPMAER (KIDIA:KFDIA,1:KLEV,JB,2) = 0.0_JPRB +ENDDO + +IF (LCHEM_DIA) THEN + ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + ZTENC0(KIDIA:KFDIA,1:KLEV, :) = 0._JPRB +ENDIF + +! +!* 1.1 COMPUTE RELATIVE HUMIDITY WITHOUT VERTICAL SMOOTING +! --------------------------------------------------- +! Q at saturation for RH calculation +IFLAG=2 +CALL SATUR(KIDIA , KFDIA , KLON , KTDIA , KLEV, YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN, & + & PRSF1, PTP , ZQSAT , IFLAG) + +! RH calculation +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZQP(JL,JK)=MAX(0.0_JPRB,PQP(JL,JK)) ! threshold for full level humid + ZRH(JL,JK)=ZQP(JL,JK)/(MAX(1.E-30_JPRB,ZQSAT(JL,JK))) + ZRH(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,ZRH(JL,JK))) + ZAP(JL,JK)=MIN(1.0_JPRB,MAX(0.0_JPRB,PAP(JL,JK))) ! threshold for cloud cover + IF (JK >= KCTOP(JL) .AND. JK <= KCBOT(JL)) THEN ! cloud fraction for convective wet removal (0 outside and 1 inside cloud) + ZAP_COV(JL,JK) = 1.0_JPRB + ELSE + ZAP_COV(JL,JK) = 0.0_JPRB + END IF + ENDDO +ENDDO +ZBLHIDX(KIDIA:KFDIA)=1.0_JPRB +! Find top level index of bounrary layer +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! check the PBL height against the grid point height from surface + ! PGEOH used here as it is the layer interface geopotential, and when divided by gravitation constat gives height + ! + IF (PBLH(JL)>(((PGEOH(JL,JK)-PGEOH(JL,KLEV))*ZRG)) .and. .not. LBLHFOUND(JL)) THEN + ZBLHIDX(JL)=REAL(JK, KIND=JPRB) + LBLHFOUND(JL)=.TRUE. + END IF + ENDDO +ENDDO + +!THIS-IS-NEVER-USED ! TB apparently unnecessary in current implementation, but ISSO4_C still needed for chem_inext in the code. +!THIS-IS-NEVER-USED ! needs to be reviewed if it can be removed. +!THIS-IS-NEVER-USED IF (TRIM(CHEM_SCHEME)=="tm5") THEN +!THIS-IS-NEVER-USED DO JT=1,NCHEM +!THIS-IS-NEVER-USED IF(TRIM(YCHEM(JT)%CNAME)== 'SO4' ) THEN +!THIS-IS-NEVER-USED ISSO4_C=KCHEM(JT) +!THIS-IS-NEVER-USED ISO4_C=JT +!THIS-IS-NEVER-USED ENDIF +!THIS-IS-NEVER-USED ENDDO +!THIS-IS-NEVER-USED ZSO4G(KIDIA:KFDIA,1:KLEV)=ZCEN(KIDIA:KFDIA,1:KLEV,ISSO4_C) +!THIS-IS-NEVER-USED ELSE IF (TRIM(CHEM_SCHEME)=="SimChem") THEN +!THIS-IS-NEVER-USED ZSO4G(KIDIA:KFDIA,1:KLEV)=0._JPRB +!THIS-IS-NEVER-USED ELSE +!THIS-IS-NEVER-USED CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) +!THIS-IS-NEVER-USED ENDIF + + +! Convert from kg kg-1 to molec cm-3 + +SELECT CASE (TRIM(CHEM_SCHEME)) +CASE("tm5") + ZELVOC(KIDIA:KFDIA,1:KLEV)= ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(ielvoc)) + ZSVOC(KIDIA:KFDIA,1:KLEV) = ZCEN(KIDIA:KFDIA,1:KLEV,KAERO(iisvoc)) +CASE("SimChem") + ZELVOC(KIDIA:KFDIA,1:KLEV)= 0.0_JPRB + ZSVOC(KIDIA:KFDIA,1:KLEV) = 0.0_JPRB +CASE DEFAULT + ! This should be caught earlier at setup + CALL ABOR1(" M7: UNCOUPLED CHEMISTRY SCHEME "//TRIM(CHEM_SCHEME) ) +END SELECT + +!calculate ICNC +ZICNC(KIDIA:KFDIA,1:KLEV) = 0._JPRB +ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE + +! Initialize "from-OIFS-to-HAM" tracer mixing ratios and tendencies +ZXTM0(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTE(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB +ZXTTEM1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + +!number +DO JCLASS=1,nclass + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZXTTE(JL,JK,ind_oifs_ham%ind_class_HAM(JCLASS)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + END DO + END DO +END DO + +!mass +DO JMASS=1,naerocomp + JO=ind_oifs_ham%ind_mass_OIFS(JMASS) ! JO -> index context OIFS + JH=ind_oifs_ham%ind_mass_HAM(JMASS) ! JH -> index context HAM + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! in case of simple sulfur scheme add SO4_AQ part into SO4_ACS + ! both original tendency and m7tendency [FIXME: what??] + + !ADD SO4 from wet chemistry to tendencies + if(trim(YAERO(JO)%CNAME)=='SO4_AS') then + ZXTTE(JL,JK,JH)=ZXTTE(JL,JK,JH)+PCHEM2AER(JL,JK,2)!!! need to be verrified, Lianghai + end if + !if(trim(YAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))%CNAME)=='SO4') then!!! add SO4 into tendency, ugly loop for now,Lianghai + ! ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))=ZXTTE(JL,JK,ind_oifs_ham%ind_mass_HAM(JMASS))+PCHEM2AER(JL,JK,1) + !end if + + END DO + END DO +END DO + +!gas +DO JGAS=1,subm_ngasspec + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + JO = ind_oifs_ham%ind_gas_OIFS(JGAS) ! JO -> index context OIFS + JH = ind_oifs_ham%ind_gas_HAM(JGAS) ! JH -> index context HAM + + ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) + ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) + + !IF(TRIM(YCHEM(JO)%CNAME)=='H2SO4')THEN + ! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KCHEM(JO)) + ! !ZSO4_PROD(JL,JK) = PCHEM2AER(JL,JK,1)*time_step_len!PTENC(JL,JK,KCHEM(ind_gas_OIFS(JGAS)))*time_step_len + ! !ZSO4_PROD_TEST(JL,JK) = PTENC(JL,JK,KCHEM(JO))*time_step_len + !ELSE + ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KCHEM(JO)) + !END IF + + !add for diagnostics + !ZSO4_PROD(JL,JK) = PTENC(JL,JK,KCHEM(JO))*time_step_len + !ZSO4_CONC(JL,JK) = ZCEN(JL,JK,KCHEM(JO)) + ! ELSE !simple sulfur scheme + ! IF(TRIM(YAERO(JO)%CNAME)=='SO2')THEN + ! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ! ! + ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! + ! ELSE IF (TRIM(YAERO(JO)%CNAME)=='SO4_gas')THEN + ! ZXTM1(JL,JK,JH) = ZCEN(JL,JK,KAERO(JO)) + ! ZXTTE(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! ZXTTEM1(JL,JK,JH) = PTENC(JL,JK,KAERO(JO)) + ! END IF + END DO + END DO +END DO + +! RCHG -> This will produce segmentation fault if CDNC are not in the namelist +! we need to test these things and do a CALL ABORT1() +! for these cases. For this we need to find the best flags or combinations +! of flags. FIXME + +! IF (LAERRRTM) THEN +!cloud +DO JCLOUD=1,2 !CDNC and ICNC + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZXTM1(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = ZCEN(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + ZXTTE(JL,JK,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) = PTENC(JL,JK,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + END DO + END DO +END DO +!ENDIF + +!eehol: init CDNC and ICNC with non updated to temporary HAMM7 variables (unit in #/kg) +ZCDNC_temp(KIDIA:KFDIA,1:KLEV) = (1.0E6_JPRB*PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH))/ZRHO(KIDIA:KFDIA,1:KLEV) +ZICNC_temp(KIDIA:KFDIA,1:KLEV) = (1.0E6_JPRB*PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH))/ZRHO(KIDIA:KFDIA,1:KLEV) + +! implementation of HAM-M7 +ZWND(KIDIA:KFDIA) = 0._JPRB +DO JL=KIDIA,KFDIA + ZWND(JL)=MAX(1.0E-10_JPRB,PAERWS(JL)) ! make threshold for wind speed + ! Compute average fluxes over tiles + DO JTILE=1,KTILES + ZAHFSM(JL)=ZAHFSM(JL)+PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) + ENDDO +ENDDO + +! --> calling the microphysics scheme + + ! Initializations for submodel interface + ZGRVOL(KIDIA:KFDIA,1:KLEV) = 1.79e12_JPRB ! ZGRVOL is only used for diagnostics (only when HAMMOZ is on) + ZPBL = 1 ! boundary layer top = 1 (ITOP=1) + ! Allocate variables for aerosol processes + ALLOCATE(ZW(KLON,KLEV,nw)) + ALLOCATE(ZWPDF(KLON,KLEV,nw)) + !IF (.NOT. ALLOCATED(w_large)) ALLOCATE(w_large(KLON,KLEV,ZKROW)) + !IF (.NOT. ALLOCATED(w_turb)) ALLOCATE(w_turb(KLON,KLEV,ZKROW)) + ALLOCATE(ZRC(KLON,KLEV,nclass,nw)) + ALLOCATE(ZSMAX(KLON,KLEV,nw)) + !IF (.NOT. ALLOCATED(reffi)) ALLOCATE(reffi(KLON,KLEV,ZKROW)) + !IF (.NOT. ALLOCATED(reffl)) ALLOCATE(reffl(KLON,KLEV,ZKROW)) + DO IMODE=1,NMOD + ALLOCATE(RW_MODE (IMODE)%d2(KLON,KLEV)) + ALLOCATE(DENS_MODE(IMODE)%d2(KLON,KLEV)) + IF (sizeclass(IMODE)%lsoluble) THEN + ALLOCATE(RWD_MODE(IMODE)%d2(KLON,KLEV)) + ALLOCATE(H2O_MODE(IMODE)%d2(KLON,KLEV)) + END IF + ENDDO + ! End allocate variables for aerosol processes + + ZWPDF(KIDIA:KFDIA,1:KLEV,:) = 0.0_JPRB + + !----------------------------------------------------------------- + ! Submodel interface call (HAM aerosol microphysics) + + CALL GSTATS(2501,0) + + CALL HAM_SUBM_INTERFACE(& + & KFDIA, KLON, KLEV, ZKROW, & !dimension indices + & ntrac, PRSF1, PRS1, & !number of tracers, pressure full levels, pressure half levels + & PTP, ZQP, ZQSAT, & !temperature, specific humidity, saturation spec. hum. + & ZXTM1, ZXTTE, & !tracer mass/number mr, tracer tendencies + & ZM6RP, ZM6DRY, & !mean mode actual radius [m], dry radius for soluble modes [m] + & ZRHOP, ZWW, & !mean mode particle density [kg m-3], aerosol water content for each mode [kg(water)-3(air)] + & ZAP, ZGRVOL, & !cloud fraction, grid box volume (only for diagnostics) + & ZBLHIDX, ZOUT3,PCVH, zout_dnuc) !boundary layer top level, outputs, high vegetation + + CALL GSTATS(2501,1) + + ! updating wet and dry radii, aerosol density and water content + DO IMODE=1,NMOD + RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZM6RP(KIDIA:KFDIA,1:KLEV,IMODE) ! m ( , KLEV, NMOD) + DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=ZRHOP(KIDIA:KFDIA,1:KLEV,IMODE) ! kg/m3 + ENDDO + DO IMODE=1,NMOD + IF (sizeclass(IMODE)%lsoluble) THEN + RWD_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZM6DRY(KIDIA:KFDIA,1:KLEV,IMODE) ! m + H2O_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = ZWW(KIDIA:KFDIA,1:KLEV,IMODE) ! ? + END IF + ENDDO + !----------------------------------------------------------------- + + CALL GSTATS(2502,0) + + ZTKEM1(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! turbulent kinetic energy as zero for now as it is not used (YET!) + + ! LWP + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + IF ( ZAP(JL,JK) >=0.001_JPRB ) THEN + ZTMPA = 1.0_JPRB/ZAP(JL,JK) + LLIQCLD(JL,JK) = ( PLP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for liquid cloud + LICECLD(JL,JK) = ( PIP(JL,JK)*ZTMPA ) > ZEPSEC ! logical for ice cloud + ZQLWP(JL,JK) = MIN(MAX(0._JPRB, PLP(JL,JK)*ZTMPA), RCLDMAX) ! lwc + ZQIWP(JL,JK) = MIN(MAX(0._JPRB, PIP(JL,JK)*ZTMPA), RCLDMAX) ! iwc + ZMSNOWACL_str(JL,JK) = PSNOWACL(JL,JK)*ZTMPA ! accretion rate of snow with cloud drop. in cloudy part for strat. wetdep + ELSE + LLIQCLD(JL,JK) = .FALSE. + LICECLD(JL,JK) = .FALSE. + ZQLWP(JL,JK) = 0.0_JPRB + ZQIWP(JL,JK) = 0.0_JPRB + ZMSNOWACL_str(JL,JK) = 0.0_JPRB + END IF + END DO + END DO + ZMSNOWACL_cov(KIDIA:KFDIA,1:KLEV) = 0.0_JPRB ! accretion rate of snow 0 for conv. wetdep + + !---find highest model level where there is cloud + KTOP = KLEV !eehol: add as default (basically if no cloud so KTOP is assigned to lowest level) + DO JK=1,KLEV + IF ( ANY(ZAP(KIDIA:KFDIA,JK) >=0.001_JPRB) ) THEN ! if cloud fraction is larger than threshold + KTOP = JK + EXIT + ENDIF + END DO + + ! Default values for effective radii + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = ZDEF_RE_LIQ ! comes from liquid effective radius routine (PP_MIN_RE_UM) + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = ZDEF_RE_ICE ! comes from ice effective radius routine (ZDEFAULT_RE_UM) + + ! Cloud activation scheme + CLDACT: IF ( NCLOUDACT == 1 ) THEN ! Morales and Nenes + + !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!) + ZSIGMA_W(KIDIA:KFDIA,1:KLEV) = 0.8_JPRB + !ELSE + ! ZSIGMA_W(KIDIA:KFDIA,1:KLEV)= MAX(0.1_JPRB, (ZTUNPAR*((ZTKEM1(KIDIA:KFDIA,1:KLEV))**0.5_JPRB))) ! m/s + !END IF + + ! Update mixing ratios with tendencies + DO JT =1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO + + CALL AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & + & PRS1, PRSF1, PTP, ZQP, ZQSAT, & + & PVERVEL, ZAP, PLP, PIP, & + & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & + & PGFL, YDMODEL, ZCDNCACT, ZICNC, REFFL(1:KLON,1:KLEV,ZKROW), REFFI(1:KLON,1:KLEV,ZKROW), & + & ZSMAXMN, ZM6DRY, ZXTP1, KTRAC, ZSIGMA_W, ZFRACN, ZMIN_CDNC, ZDEF_CDNC, & + & ZQLWP, LLIQCLD, LICECLD, ZDEF_RE_LIQ, ZDEF_RE_ICE) + + ! Store effective radii in PGFL + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters + IF (LAERICESED .OR. LAERICEAUTO) THEN + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters + ENDIF + + ELSE IF (NCLOUDACT == 2) THEN ! AR&G scheme + + !IF ( LCONSIGW ) THEN !eehol: if using the constant sigma_w it is set to 0.8 otherwise use the TKE to calculate (NOT USED YET!!) + ZTKEM1(KIDIA:KFDIA,1:KLEV) = ((1/ZTUNPAR)**2)*((0.8_JPRB)**2) !eehol: this is converted back to sigma_w in mo_activ.F90 + !ELSE + ! ZTKEM1(KIDIA:KFDIA,1:KLEV) = ZTKEM1(KIDIA:KFDIA,1:KLEV) + !END IF + + !---calculate updraft velocity + ZWCAPE(KIDIA:KFDIA) = 0._JPRB ! CAPE as zero as it is not used + + CALL ACTIV_UPDRAFT(KFDIA, KLON, KLEV, ZKROW, & ! krow = 1 + ZTKEM1, ZWCAPE, PVERVEL, ZRHO, & ! turbulent kinetic energy, CAPE contr. to conv. vert. veloc. [m s-1], large scale vert. veloc. + ZW, ZWPDF) + + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO + + IF (NCD_ACTIV == 2 .OR. NCCNDIAG > 0) THEN + CALL HAM_ACTIV_KOEHLER_AB(KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! krow=1 ktdia=1 + ZXTP1, PTP, ZA, ZB) + END IF + + DO JCLASS = 1,NCLASS + IF (SIZECLASS(JCLASS)%LSOLUBLE) THEN + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6DRY(KIDIA:KFDIA,1:KLEV,JCLASS) !soluble modes rdry from rdry_m7 + ELSE + ZRDRY(KIDIA:KFDIA,1:KLEV,JCLASS) = ZM6RP(KIDIA:KFDIA,1:KLEV,JCLASS) !insoluble modes rdry from rwet_m7 + END IF + END DO + + !calculate saturation water vapor pressure from saturation specific humidity + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZESW(JL,JK)=(ZQSAT(JL,JK)*PRSF1(JL,JK))/(0.62198_JPRB) + ENDDO + ENDDO + + ZWPDF(KIDIA:KFDIA,1:KLEV,:) = MAX(ZWPDF(KIDIA:KFDIA,1:KLEV,:),1.0E-6_JPRB) !eehol: threshold vvel PDF to 1e-6 to get rid of 0 division + + CALL HAM_ACTIV_ABDULRAZZAK_GHAN( KFDIA, KLON, KLEV, ZKROW, KTDIA, & ! in original 1 = ktdia... for diagnostics so krow=1 and ktdia=1 + & ZCDNCACT, ZESW, ZRHO, & ! number of activated particles, saturation vapor pressure, air density + & ZXTP1, PTP, PRSF1, ZQP, & ! tracer mix rat, temperature, air pressure, spec. humid. + & ZW, ZWPDF, ZA, ZB, ZRDRY, & ! mean udr veloc, pdf of udr. veloc, Koehler A, Koehler B, dry radius + & ZNACT, ZFRACN, ZSC, ZRC, ZSMAX) ! num. act. part. per mode, frac ", crit. ssat., crit. radius, max ssat + + ! threshold fraction of activated particles to gridcells with only liquid clouds + DO JCLASS = 1,NCLASS + ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS) = MERGE(ZFRACN(KIDIA:KFDIA,1:KLEV,JCLASS),0._JPRB,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + ENDDO + + ! threshold CDNC and ICNC to grid cells with only liquid or ice clouds + ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZDEF_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud + ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud + + ELSE !Default values if no activation scheme is used + + ZFRACN(KIDIA:KFDIA,:,:) = 0._JPRB !init + + DO JL = KIDIA,KFDIA !eehol: add CDNC over land and over ocean as default values + IF ( PLSM(JL) < 0.5_JPRB ) THEN !over ocean + ZCDNCACT(JL,1:KLEV) = RCCNSEA*1.0E6_JPRB !from 1/cm3 to 1/m3 + ELSE !over land + ZCDNCACT(JL,1:KLEV) = RCCNLND*1.0E6_JPRB !from 1/cm3 to 1/m3 + END IF + END DO + + !calculate modewise fraction of activated particles + !assume only KS, AS, CS modes to be activated + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZNACT_TOT = ZCDNCACT(JL,JK) / ZRHO(JL,JK) !calculate total number of activated particles in #/kg + IF ( ZXTM1(JL,JK,SIZECLASS(4)%IDT_NO) > 1.E-9_JPRB ) THEN + ZFRAC_CS = MAX(ZNACT_TOT,0._JPRB) / ZXTM1(JL,JK,SIZECLASS(4)%IDT_NO) + ELSE + ZFRAC_CS = 0._JPRB + ENDIF + ZFRACN(JL,JK,4) = MAX(0._JPRB,MIN(ZFRAC_CS,1._JPRB)) !threshold between 0 and 1 + ZNACT_CS(JL,JK) = ZXTM1(JL,JK,SIZECLASS(4)%IDT_NO) * ZFRACN(JL,JK,4) !calculate activated number for CS mode + + IF ( ZXTM1(JL,JK,SIZECLASS(3)%IDT_NO) > 1.E-9_JPRB ) THEN + ZFRAC_AS = MAX(ZNACT_TOT - ZNACT_CS(JL,JK),0._JPRB) / ZXTM1(JL,JK,SIZECLASS(3)%IDT_NO) + ELSE + ZFRAC_AS = 0._JPRB + ENDIF + ZFRACN(JL,JK,3) = MAX(0._JPRB,MIN(ZFRAC_AS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_AS(JL,JK) = ZXTM1(JL,JK,SIZECLASS(3)%IDT_NO) * ZFRACN(JL,JK,3) !calculate activated number for AS mode + + IF ( ZXTM1(JL,JK,SIZECLASS(2)%IDT_NO) > 1.E-9_JPRB ) THEN + ZFRAC_KS = MAX((ZNACT_TOT - ZNACT_CS(JL,JK) - ZNACT_AS(JL,JK)),0._JPRB) / ZXTM1(JL,JK,SIZECLASS(2)%IDT_NO) + ELSE + ZFRAC_KS = 0._JPRB + ENDIF + ZFRACN(JL,JK,2) = MAX(0._JPRB,MIN(ZFRAC_KS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_KS(JL,JK) = ZXTM1(JL,JK,SIZECLASS(2)%IDT_NO) * ZFRACN(JL,JK,2) !calculate activated number for KS mode + + ZFRACN(JL,JK,2) = MERGE(ZFRACN(JL,JK,2),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + ZFRACN(JL,JK,3) = MERGE(ZFRACN(JL,JK,3),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + ZFRACN(JL,JK,4) = MERGE(ZFRACN(JL,JK,4),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is cloud + END DO + END DO + + ! threshold CDNC and ICNC to grid cells with only liquid or ice clouds + ZCDNCACT(KIDIA:KFDIA,1:KLEV) = MERGE(ZCDNCACT(KIDIA:KFDIA,1:KLEV),1.0E6_JPRB*ZDEF_CDNC,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside liq cloud + ZICNC(KIDIA:KFDIA,1:KLEV) = MERGE(ZICNC(KIDIA:KFDIA,1:KLEV), RNICE, LICECLD(KIDIA:KFDIA,1:KLEV)) !mask only values inside ice cloud + + END IF CLDACT + + CALL GSTATS(2502,1) + + ! Store CDNC (number of activated particles) and ICNC as a number mixing ratio to tracer values, and in PGFL + ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_CDNC) = (MAX(ZCDNCACT(KIDIA:KFDIA,1:KLEV),((1.0E6_JPRB)*ZMIN_CDNC)))/ZRHO(KIDIA:KFDIA,1:KLEV) ! [#/kg] and threshold CDNC + ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (1.0E6_JPRB)*ZICNC(KIDIA:KFDIA,1:KLEV)/ZRHO(KIDIA:KFDIA,1:KLEV) !ice crystal number conc = #/cm3 --> number mix rat [#/kg] + + PGFL(KIDIA:KFDIA,1:KLEV,YCDNC%MP9_PH) = MAX((1.0E-6_JPRB)*ZCDNCACT(KIDIA:KFDIA,1:KLEV),ZMIN_CDNC) ! convert from #/m3 to #/cm3 and threshold minimum value to 1 cm-3 + PGFL(KIDIA:KFDIA,1:KLEV,YICNC%MP9_PH) = MAX( ZICNC(KIDIA:KFDIA,1:KLEV), RNICE) ! no conversion needed: already in #/cm3, just impose minimum value + + !eehol: update tendency of CDNC and ICNC (calculate only the newly formed droplets) + ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,IDT_CDNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_CDNC) - ZCDNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len + ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,IDT_ICNC) = (ZXTM1(KIDIA:KFDIA,1:KLEV,IDT_ICNC) - ZICNC_temp(KIDIA:KFDIA,1:KLEV))/time_step_len + + !----------------------------------------------------------------- + !--> Calculation of liquid effective radii (Note: already done if NCLOUDACT=1) + IF (NCLOUDACT == 2 .OR. NCLOUDACT == 0 ) THEN + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! effective radius (in um) calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*ZQLWP(JL,JK)/PGFL(JL,JK,YCDNC%MP9_PH))**0.333_JPRB + END DO + END DO + + ! Add liq. eff. rad. to HAM variables (only if there is liquid cloud else minimum value) + REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV), ZDEF_RE_LIQ, LLIQCLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_LIQ%MP9_PH) = 1.0E-06_JPRB * REFFL(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + ENDIF + + !--> Calculation of ice effective radii (Note: already done if NCLOUDACT=1 *and* (LAERICESED .OR. LAERICEAUTO) ) + IF (.NOT. (NCLOUDACT==1 .AND. (LAERICESED .OR. LAERICEAUTO) )) THEN + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PRSF1, PTP, ZAP, PIP, PSP, PGEMU, & ! pressure, temp, cloud fr., IWC, SWC, sine of latitude + & reffi(1:KLON,1:KLEV,ZKROW)) ! ice effective radius (updated to mo_activ variable 'reffi' which used in mo_ham_wetdep) + + ! only if there is ice cloud else minimum value + REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) = MERGE(REFFI(KIDIA:KFDIA,1:KLEV,ZKROW), ZDEF_RE_ICE, LICECLD(KIDIA:KFDIA,1:KLEV)) + + ! add effective radii to PGFL fields + PGFL(KIDIA:KFDIA,1:KLEV,YRE_ICE%MP9_PH) = 1.0E-06_JPRB * REFFI(KIDIA:KFDIA,1:KLEV,ZKROW) ! convert um to meters and save to PGFL fields + ENDIF + + !----------------------------------------------------------------- + !--- Mass conserving correction of negative tracer values: + CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, NTRAC, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Wet deposition for HAM-M7 + CALL GSTATS(2503,0) + + IF ( LAERSCAV ) THEN + + !--> initialize mixing ratios for wet deposition + ! Only ZXTP1, in case no tracers subject to wet dep, since it may be used in drydep! + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + END DO + + !<-- call wetdep interface for wet deposition + !-- interface to wet deposition routine (also from cuflx_subm) + IF ( ANY(trlist%ti(:)%nwetdep > 0) ) THEN + + ! for calculating the rain and snow evaporation/formation variables used in wet deposition + ! convective wet deposition values + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZFLXR=PFPLCL(JL,JK-1) + ZFLXS=PFPLCN(JL,JK-1) + ZFLXRB=PFPLCL(JL,JK) + ZFLXSB=PFPLCN(JL,JK) + ZMRATEPR_cov(JL,JK) = MAX(ZFLXRB-ZFLXR,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPS_cov(JL,JK) = MAX(ZFLXSB-ZFLXS,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPR_cov(JL,JK) = ZMRATEPR_cov(JL,JK) * TIME_STEP_LEN ! time integrated + ZMRATEPS_cov(JL,JK) = ZMRATEPS_cov(JL,JK) * TIME_STEP_LEN ! time integrated + !same formula negatives/positives for evap or formation + ZFEVAPR_cov(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) ! [kg/m2.s] + ZFSUBLS_cov(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) ! [kg/m2.s] + ZFPLCL(JL,JK) = 0.5_JPRB*(ZFLXR+ZFLXRB) + ZFPLCN(JL,JK) = 0.5_JPRB*(ZFLXS+ZFLXSB) + END DO + END DO + ! stratiform wet deposition values + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZFLXR=PFPLSL(JL,JK-1) + ZFLXS=PFPLSN(JL,JK-1) + ZFLXRB=PFPLSL(JL,JK) + ZFLXSB=PFPLSN(JL,JK) + IF ( ZAP(JL,JK) >=0.001_JPRB ) THEN + ZTMPA = 1.0_JPRB/ZAP(JL,JK) + ZMRATEPR_str(JL,JK) = MAX(ZFLXRB-ZFLXR,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPS_str(JL,JK) = MAX(ZFLXSB-ZFLXS,1.E-10_JPRB)/ZDPG(JL,JK) ! [kg/kg/s] + ZMRATEPR_str(JL,JK) = ZMRATEPR_str(JL,JK) * TIME_STEP_LEN * ZTMPA ! time integrated + ZMRATEPS_str(JL,JK) = ZMRATEPS_str(JL,JK) * TIME_STEP_LEN * ZTMPA ! time integrated + ELSE + ZMRATEPR_str(JL,JK) = 0.0_JPRB + ZMRATEPS_str(JL,JK) = 0.0_JPRB + END IF + !same formula negatives/positives for evap or formation + IF ( PCOVPTOT(JL,JK) > ZEPSEC ) THEN + ZTMPA = 1.0_JPRB/PCOVPTOT(JL,JK) + ZFEVAPR_str(JL,JK) = -1._JPRB*MIN(ZFLXRB-ZFLXR,0._JPRB) * ZTMPA ! [kg/m2.s] + ZFSUBLS_str(JL,JK) = -1._JPRB*MIN(ZFLXSB-ZFLXS,0._JPRB) * ZTMPA ! [kg/m2.s] + ZFPLSL(JL,JK) = 0.5_JPRB*(ZFLXR+ZFLXRB) * ZTMPA + ZFPLSN(JL,JK) = 0.5_JPRB*(ZFLXS+ZFLXSB) * ZTMPA + ELSE + ZFEVAPR_str(JL,JK) = 0.0_JPRB + ZFSUBLS_str(JL,JK) = 0.0_JPRB + ZFPLSL(JL,JK) = 0.0_JPRB + ZFPLSN(JL,JK) = 0.0_JPRB + END IF + END DO + END DO + + ZLFRAC_SO2(KIDIA:KFDIA,:) = 0._JPRB ! zlfrac_so2 only needed in gas scavenging and this is off for now (put this zero) + + ! In cloudsc.f90 PLU is defined as convective condensate (understood as total condensate, ie "include liquid and ice phases"). + ! So we use ZIPDUM to set the ice part to zero and use total condensate as liquid for the convective case of wetdep. + ! In the future, it would be better to calculate the actual fraction based on 7.6. This may be important to describe the + ! liquid and ice fractions correctly. + ZLP(KIDIA:KFDIA,1:KLEV) = ZQLWP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - stratif case) + ZIP(KIDIA:KFDIA,1:KLEV) = ZQIWP(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud ice water content (modified in wetdep - stratif case) + ZIPDUM(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! temporary variable for cloud ice water content (modified in wetdep - convec case) + ZLPU(KIDIA:KFDIA,1:KLEV) = PLU(KIDIA:KFDIA,1:KLEV) ! temporary variable for cloud water content (modified in wetdep - convec case) + + ! Double call to wet deposition. One for convective case and one for stratiform case: + + ! WETDEP CONVECTIVE CASE + + !-- initialise in-cloud and interstitial mixing ratios + ! set both equal to tracer mixing ratio as starting point + ! ham_wet_chemistry will re-compute these values if lham=true + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + END DO + + ZDUMMY(KIDIA:KFDIA,:) = 0._JPRB ! output: massfix boundary condition (updated in mo_hammoz_wetdep) + ZWDEP_SCAV_IC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep in-cloud + ZWDEP_SCAV_BC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep below cloud + ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! dummy "fraction of grid box covered by precip" for conv. case (zero at start as in ECHAM) + ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy "previous tracer mixing ratio" for conv. case + ZFUXT3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! initialize updr mass flux for conv. case only (updated in wetdep so put 0 at start) + + LSTRAT = .FALSE. !False for convective case + IF (.NOT. LSTRAT) THEN + CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .TRUE., ZDUMMY) ! call convective mass conserving (init zxtte_old) + + ZMFU(KIDIA:KFDIA,1:KLEV) = MIN(PMFU(KIDIA:KFDIA,1:KLEV),ZDPG(KIDIA:KFDIA,1:KLEV)/TIME_STEP_LEN)!constraing Conv. mass flux up + + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = FALSE for conv. case + ZDPG, ZMRATEPR_COV, ZMRATEPS_COV, ZMSNOWACL_cov, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLPU, ZIPDUM, & ! cloud water content, cloud ice water content + ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] + REFFI, REFFL, & ! effective radii + ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode + PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) + ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + ZFPLCL, ZFPLCN, ZFEVAPR_cov, ZFSUBLS_cov, & ! rain flux, snow flux, + ZMFU, ZFUXT3D, & ! conv flux, updraft mass flux (updated in wetdep) + ZAP_COV, ZDUM2D, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + + CALL XT_CONV_MASSFIX(KFDIA, KLON, KLEV, KLEV+1, NTRAC, ZKROW, PRSF1, PRS1, ZXTTE, .FALSE., ZDUMMY) ! call convective mass conserving + END IF + + !Add convective case wet removal fluxes to diagnostics + DO JMASS=1,NAEROCOMP + JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + END DO + + DO JCLASS=1,NCLASS + JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + END DO + + ! WETDEP STRATIFORM CASE + + !-- initialise in-cloud and interstitial mixing ratios + ! set both equal to tracer mixing ratio as starting point + ! ham_wet_chemistry will re-compute these values if lham=true + DO JT = 1,NTRAC + ZXTP1(KIDIA:KFDIA,1:KLEV,JT) = ZXTM1(KIDIA:KFDIA,1:KLEV,JT) + ZXTTE(KIDIA:KFDIA,1:KLEV,JT) * TIME_STEP_LEN + ZXTP1C(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + ZXTP10(KIDIA:KFDIA,1:KLEV,JT) = ZXTP1(KIDIA:KFDIA,1:KLEV,JT) + END DO + + ZDUMMY(KIDIA:KFDIA,:) = 0._JPRB ! output: massfix boundary condition (updated in mo_hammoz_wetdep) + ZWDEP_SCAV_IC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep in-cloud + ZWDEP_SCAV_BC(KIDIA:KFDIA,:) = 0._JPRB ! output: diagnostic wdep below cloud + ZDUM2D(KIDIA:KFDIA,1:KLEV) = 0._JPRB ! dummy conv flux for strat. case + ZDUM3D(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB ! dummy updraft mass flux for strat. case + + LSTRAT = .TRUE. !True for strat case, large scale + CALL WETDEP_INTERFACE(KFDIA, KLON, KLEV, KTOP, ZKROW, LSTRAT, & ! ktop = cloud top level index, lstrat = TRUE for strat. case + ZDPG, ZMRATEPR_STR, ZMRATEPS_STR, ZMSNOWACL_str, & ! dp/g, evap. of rain, subl. of snow, accr. rate of snow with cl. drop in-cl. + ZLP, ZIP, & ! cloud water content, cloud ice water content + ZM6RP, ZM6DRY, & ! m7 aerosol: to replace rwet_m7, dry radius for soluble modes [cm] + REFFI, REFFL, & ! effective radii + ZCDNCACT, ZFRACN, & ! number/fraction of activated particles per mode + PTP, ZXTM1, ZLFRAC_SO2, & ! temperature, prev. mixing ratio, zlfrac_so2 only needed in gas scavenging (0 for now) + ZXTTE, ZXTP10, ZXTP1C, & ! tendencies/mixing ratios (in/out) + ZFPLSL, ZFPLSN, ZFEVAPR_str, ZFSUBLS_str, & ! rain flux, snow flux, + ZDUM2D, ZDUM3D, & ! zeroes as these are not needed in strat. case + ZAP, PCOVPTOT, ZRHO, ZDUMMY, ZWDEP_SCAV_IC, ZWDEP_SCAV_BC) ! cloud frac., precip. frac., air dens., in/output*3 + + ! Add stratiform case wet removal fluxes to diagnostics + DO JMASS=1,NAEROCOMP + JY=KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_mass_ham(JMASS)) + END DO + + DO JCLASS=1,NCLASS + JY=KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)) + WDEPOUT_2D (KIDIA:KFDIA,JY) = WDEPOUT_2D (KIDIA:KFDIA,JY) + ZDUMMY (KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_IC_2D(KIDIA:KFDIA,JY) = WDEPOUT_IC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_IC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + WDEPOUT_BC_2D(KIDIA:KFDIA,JY) = WDEPOUT_BC_2D(KIDIA:KFDIA,JY) + ZWDEP_SCAV_BC(KIDIA:KFDIA, ind_oifs_ham%ind_class_ham(JCLASS)) + END DO + + END IF + END IF + CALL GSTATS(2503,1) + + !<-- End wet deposition for HAM-M7 + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL XT_BORROW(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Sedimentation for HAM-M7 + CALL GSTATS(2504,0) + + IF (LAERSEDIM) THEN + IF ( ANY(trlist%ti(:)%nsedi > 0) ) THEN + + ZTENCIH(KIDIA:KFDIA,1:KLEV,1:NTRAC)=ZXTTE(KIDIA:KFDIA,1:KLEV,1:NTRAC) + + CALL SEDI_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & + PTP, ZQP, PRSF1, PRS1, & ! temperature, specific humidity, pressure at full level, pressure at half level + ZM6RP, ZRHOP, & ! mean mode actual radius [m], mean mode particle density [kg m-3] + ZXTM1, ZXTTE, ZSEDIFLUX, ZSEDIFLUXSURF) ! tracer mixing ratios and tendency (sediflux for diagnostics) + + SEDOUT(KIDIA:KFDIA, 1:KLEV,1:NTRAC) = ZTENCIH(KIDIA:KFDIA, 1:KLEV,1:NTRAC) - ZXTTE(KIDIA:KFDIA, 1:KLEV,1:NTRAC) + DO JK=1,KLEV + DO JCLASS=1,NCLASS + SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) + ZSEDIFLUX(KIDIA:KFDIA, JK,ind_oifs_ham%ind_class_HAM(JCLASS)) + END DO + DO JMASS=1,NAEROCOMP + SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS)))=SEDOUT_2D(KIDIA:KFDIA,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) + ZSEDIFLUX(KIDIA:KFDIA,JK,ind_oifs_ham%ind_mass_HAM(JMASS)) + END DO + END DO + END IF + ENDIF + CALL GSTATS(2504,1) + + !<-- End sedimentation for HAM-M7 + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Dry deposition for HAM-M7 + IF (.NOT.LAERSURF) THEN + PAERDDP(:,:) =0._JPRB + ELSEIF (LAERSURF) THEN + + !* DRY DEPOSITION INCLUDED AS MODIFICATION TO SURFACE FLUXES + ! --------------------------------------------------------- + CALL GSTATS(2505,0) + + IF (LAERDRYDP) THEN + + !--> variables not needed for aerosol dry deposition + ZCFML(:) = 0._JPRB + ZCFMW(:) = 0._JPRB + ZCFMI(:) = 0._JPRB + ZCFNCL(:) = 0._JPRB + ZCFNCW(:) = 0._JPRB + ZCFNCI(:) = 0._JPRB + ZEPDU2 = 0._JPRB + ZKAP = 0._JPRB + ZGEOM1(:,:) = 0._JPRB + ZRIL(:) = 0._JPRB + ZRIW(:) = 0._JPRB + ZRII(:) = 0._JPRB + ZTVIR1(:,:) = 0._JPRB + ZTVL(:) = 0._JPRB + ZTVW(:) = 0._JPRB + ZTVI(:) = 0._JPRB + ZAZ0(:) = 0._JPRB + ZFRL(:) = 0._JPRB + ZSRFL(:) = 0._JPRB + ZFOREST(:) = 0._JPRB + ZTSI(:) = 0._JPRB + ZAZ0L(:) = 0._JPRB + ZAZ0I(:) = 0._JPRB + ZCDNI(:) = 0._JPRB + + !--> variables calculated for dry deposition + DO JL = KIDIA,KFDIA + IF ( PLSM(JL) < 0.99_JPRB ) THEN + ZLOLAND(JL) = .FALSE. + ZAZ0W(JL) = PZ0M(JL) + ELSE + ZLOLAND(JL) = .TRUE. + ZAZ0W(JL) = 0._JPRB + END IF + ZAZ0W(JL) = MAX(1.0E-5_JPRB,ZAZ0W(JL)) ! threshold roughness length to min value + ZFRW(JL) = MAX(0.,1.-PLSM(JL)-PCI(JL)) ! water fraction = 1 - land mask - sea ice fraction + ZCVS(JL) = PFRTI(JL,5)+PFRTI(JL,7) ! snow cover fraction = Snow on low-veg + snow on bare-soil + snow under high-veg + ZCVW(JL) = PFRTI(JL,3) ! wet skin fraction + ZVGRAT(JL) = PCVL(JL)+PCVH(JL) ! vegetation ratio = low veg. cover + high veg. cover + ZCDNL(JL) = PAERUST(JL) ! adding ustar to not used variable + ZCDNW(JL) = LOG(ZDZ(JL,KLEV)/PZ0M(JL))/(VKARMAN*PAERUST(JL)) ! calculate aerodyn. resistance on surface to not used variable + END DO + + !--> init values + ZTENCIH(KIDIA:KFDIA,1:KLEV,:) = ZXTTE(KIDIA:KFDIA,1:KLEV,:) ! init tendency before drydep + ZXTEMS(KIDIA:KFDIA,:) = 0._JPRB ! surface emissions as zero for input + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = 0._JPRB + ZXTMD1(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + (ZTENCIH(KIDIA:KFDIA,1:KLEV,:) * TIME_STEP_LEN) ! update mixrat with tendency + ZVDEP(KIDIA:KFDIA,:) = 0._JPRB ! ddep velocity as zero + + ! RCHG: Recommendation, those subroutines specific of m7 should have + ! m7 in the name not sure if this is specific or general/common + ! but adapted to m7. + CALL DRYDEP_INTERFACE(KLON, KFDIA, KLEV, ZKROW, & + & ZQP(:,KLEV), ZQSAT(:,KLEV), PTP(:,KLEV), ZCFML, ZCFMW, ZCFMI, & + & ZCFNCL, ZCFNCW, ZCFNCI, & + & ZEPDU2, ZKAP, PUP, PVP, ZGEOM1, ZRIL, ZRIW, & + & ZRII, & + & ZTVIR1, ZTVL, ZTVW, ZTVI, ZAZ0, & + & PTP(:,KLEV), ZLOLAND, & + & ZM6RP, ZRHOP, & ! M7 + & ZFRL, ZFRW, PCI, ZCVS, ZCVW, ZVGRAT, & + & ZSRFL, PUP(:,KLEV), PVP(:,KLEV), & !eehol: FIXME 10m u and v wind from lowest level.. needs to be revised in future!! + & ZXTEMS, ZXTMD1, ZRHO(:,KLEV), PRS1, ZFOREST, ZTSI, & !air dens lowest, air press at int. + & ZAZ0L, ZAZ0W, ZAZ0I, ZCDNL, ZCDNW, ZCDNI, ZDDEPFLUX, ZVDEP) !ZCDNL and ZCDNW used for ustar and aerodyn. resist. + + + !--> modify tendency at surface according to changes in surface emissions + DO JT = 1,NTRAC + DO JL = KIDIA,KFDIA + ZXTTE(JL,KLEV,JT) = ZTENCIH(JL,KLEV,JT) + ((ZXTEMS(JL,JT)*RG)/(ZDP(JL,KLEV))) + END DO + END DO + + ENDIF ! LAERDRYDP + END IF + CALL GSTATS(2505,1) + + !<-- End dry deposition for HAM-M7 + !----------------------------------------------------------------- + + !--- Mass conserving correction of negative tracer values: + CALL xt_borrow(KFDIA, KLON, KLEV, KLEV+1, ntrac, & + PRSF1, PRS1, & + ZXTM1, ZXTTE) + + !----------------------------------------------------------------- + !--> Add HAM modified tendency back to PTENC (OIFS values) + + !number + DO JCLASS=1,NCLASS + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_class_OIFS(JCLASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_class_HAM(JCLASS)) + END DO + !mass + DO JMASS=1,NAEROCOMP + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_mass_OIFS(JMASS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_mass_HAM(JMASS)) + END DO + !gas + IF(LAERCHEM ) THEN + DO JGAS=1,SUBM_NGASSPEC + PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + END DO + END IF + !!ELSE + !! DO JGAS=1,SUBM_NGASSPEC + !! PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_gas_HAM(JGAS)) + !! END DO + !!END IF + + ! RCHG -> not sure best way to solve here. I commented to avoid segmentation fault + ! but it may be avoided with other more specific flag. Anyway something was + ! needed to avoid core-dump. + ! The problem with these arrays in loop below is that the indices: + ! ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + ! KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) + ! are not propoperly set up by hamm7_init.F90 + ! -- this need to be solved probably in hamm7_init.F90 which detect the + ! problems with these tracers about CCN. + !cloud variables + DO JCLOUD=1,2 !CDNC and ICNC + !PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = ZXTTE(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(ind_oifs_ham%ind_cloud_OIFS(JCLOUD))) = (1.0E-6_JPRB) * ZRHO(KIDIA:KFDIA,1:KLEV) * ZXTTE_CLD(KIDIA:KFDIA,1:KLEV,ind_oifs_ham%ind_cloud_HAM(JCLOUD)) + END DO + !<-- End adding HAM modified tendency back to PTENC + !----------------------------------------------------------------- + + +! ZTSO4 is filled only if LAERCHEM=F, which is not possible with M7 - Commented out +!THIS-IS-NEVER-USED +!THIS-IS-NEVER-USED ! write flux to extra fields for diagnostic of aerosol 'chemical' conversion +!THIS-IS-NEVER-USED IF (.NOT. LAERCHEM .AND. LCHEM_DIA) THEN +!THIS-IS-NEVER-USED CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , 1, 1, & +!THIS-IS-NEVER-USED & ZDP, PTSPHY, ZTSO4, ZTENC0,PEXTRA(:,ISO4_C,IEXTR_CH)) +!THIS-IS-NEVER-USED END IF + + +!* 4. ELIMINATION OF NEGATIVE PROGNOSTIC AEROSOL CONCENTRATIONS +! --------------------------------------------------------- + +IF (LAERNGAT) THEN + + IF (LCHEM_DIA) THEN + ZTAERO0(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = ZTAEROK(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + ENDIF + + DO JAER=1,NACTAERO + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAER(JL,JK) = ZCEN(JL,JK,KAERO(JAER)) + ZTAER(JL,JK)= PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO + + CALL AER_NEGAT & + & ( YREAERATM, KIDIA , KFDIA, KLON , KLEV, & + & PTSPHY , & + & ZAER , ZTAER, PRS1, & + & ZAERNEG ) + + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTAERO(JL,JK,JAER)=ZTAER(JL,JK) + ENDDO + ENDDO + DO JL=KIDIA,KFDIA + ZAERNGT(JL,JAER)=ZAERNEG(JL,KLEV) + ENDDO + + ENDDO + + ! collect neg fix tendencies + IF (LCHEM_DIA) THEN + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & + & ZDP, PTSPHY, ZTAERO ,ZTAERO0, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_NG)) + ENDIF + + ! do not fix the tendencies for now, number concentration fixes will break the + ! correlation between mass and number + PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) = ZTAERO(KIDIA:KFDIA,1:KLEV,1:NACTAERO) + +ENDIF + +!------------------------------------------------------------------------------ +!* 5. STORE ALL AEROSOL VERTICALLY INTEGRATED FLUXES +! ---------------------------------------------- + +DO JAER=1,NACTAERO + DO JL=KIDIA,KFDIA + PAERODDF(JL,JAER,1)=PAERSRC(JL,JAER) ! aerosol so4 source term + PAERODDF(JL,JAER,2)=PAERDDP(JL,JAER) ! aerosol dry deposition + PAERODDF(JL,JAER,3)=PAERSDM(JL,JAER) ! aerosol sedimentation + PAERODDF(JL,JAER,4)=0.0 ! (todo) so2 sink added to scavenging + PAERODDF(JL,JAER,5)=0.0 ! (todo) scavenging (in-cloud & below cloud) so wet deposition + PAERODDF(JL,JAER,6)=ZAERNGT(JL,JAER) + PAERODDF(JL,JAER,7)=0.0 ! (todo) total AOD? + ENDDO +ENDDO + +!----------------------------------------------------------------------- +!* 6. OPTICAL PROPERTIES +! -------------------------------------------------- +IBLK=(KSTGLO-1)/KLON + 1 + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + DO JAER=1,14 + PAER_TAU(JL,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBLK) + PAER_SSA(JL,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBLK) + PAER_ASYM(JL,JK,JAER ) = YDAERM7%M7ASYM(JL,JK,JAER,IBLK) + ENDDO + DO JAER=1,16 + PAER_TAU_LW(JL,JK,JAER)= YDAERM7%M7AODLW(JL,JK,JAER,IBLK) + ENDDO + ENDDO +ENDDO + + +!* 6.1 Calculate optical properties only when radiation is called +! ---------------------------------------------------------- +IF(MOD(NSTEP,NRADFR) == 0) THEN + + CALL GSTATS(2506,0) + ZAER_TAU(KIDIA:KFDIA,:,:,:) = 0.0_JPRB + ZAER_SSA(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_ASYM(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_TAU_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB + + ZAOD_DIAG(KIDIA:KFDIA,:)= 0._JPRB + ZSSA_DIAG(KIDIA:KFDIA,:)= 0._JPRB + ZASY_DIAG(KIDIA:KFDIA,:)= 0._JPRB + ZAER_TAU_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_SSA_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + ZAER_ASYM_DIAG(KIDIA:KFDIA,:,:) = 0.0_JPRB + +SELECT CASE (NAEROOPT) + +CASE (0) + + ! Optical properties is not calculated + +CASE (1) + ! Use TM5 codes to calculate optical properties (optical properties for LW = 0) + !--> Add HAM updated tendency to ZTAERO and use that in optics + ZTAERO(KIDIA:KFDIA,:,:) = 0._JPRB + DO JAER=1,NACTAERO + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZTAERO(JL,JK,JAER)= PTENC(JL,JK,KAERO(JAER)) + ENDDO + ENDDO + ENDDO + + ZAEROK(KIDIA:KFDIA,:,:) = ZAEROK(KIDIA:KFDIA,:,:) + ZTAERO(KIDIA:KFDIA,:,:)*TIME_STEP_LEN + + CALL TM5M7_OPTICS_AOP_GET( YGFL, YREAERSRC, KIDIA,KFDIA, KLON, KLEV,NACTAERO, & + & NASWBAND, ASWBAND, 1, .false., & + & ZRHO, ZAEROK,RW_MODE,RWD_MODE,H2O_MODE,& + & ZAER_TAU, ZAER_SSA, ZAER_ASYM) + + PAOD(KIDIA:KFDIA,:)=0._JPRB + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW) = ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))/RG + PAER_SSA(JL,JK,IW) = ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)= ZAER_ASYM(JL,JK,IW) + !PAOD(JL,IW)=ZAER_TAU(JL,JK,IW,1)*(PGEOH(JL,JK-1) - PGEOH(JL,JK))+PAOD(JL,IW) + ENDDO + DO IW=1,16 + PAER_TAU_LW(JL,JK,IW)=0.0_JPRB + END DO + ENDDO + ENDDO + + CASE (2) + ! Use HAM codes to calculate optical properties + LWBANDS=16 + PRS1D(KIDIA:KFDIA,:) = PRS1(KIDIA:KFDIA,1:KLEV)-PRS1(KIDIA:KFDIA,0:KLEV-1) + + LDIAG_AEROPT = (NAERO_WVL_DIAG >0) .AND. (YGFL%NAERO_WVL_DIAG_TYPES>0) + + DO IW = 1, NAERO_WVL_DIAG + LAMBDA_DIAG(IW) = YGFL%YAERO_WVL_DIAG_NL(IW)%IWVL *1.0E-9_JPRB ! nm to m + ENDDO + !CALL ham_rad_cache(KLON,KLEV) + ZXTM0(KIDIA:KFDIA,1:KLEV,:) = ZXTM1(KIDIA:KFDIA,1:KLEV,:) + ZXTTE(KIDIA:KFDIA,1:KLEV,:)*time_step_len + + CALL HAM_RAD(KFDIA, KLON, KLEV, ZKROW, LWBANDS, NASWBAND, ZXTM0, PRS1D, & + & ZAER_TAU(:,:,:,1), ZAER_SSA, ZAER_ASYM, ZAER_TAU_LW, ZM6RP, & + & LDIAG_AEROPT,NAERO_WVL_DIAG,YGFL%NAERO_WVL_DIAG_TYPES, & + & LAMBDA_DIAG, ZAER_TAU_DIAG, ZAER_SSA_DIAG, ZAER_ASYM_DIAG) + !CALL ham_rad_cache_cleanup + + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW) = ZAER_TAU(JL,JK,IW,1)!*(PGEOH(JL,JK-1) - PGEOH(JL,JK)) + PAER_SSA(JL,JK,IW) = ZAER_SSA(JL,JK,IW) + PAER_ASYM(JL,JK,IW)= ZAER_ASYM(JL,JK,IW) + ENDDO + DO IW=1,16 + PAER_TAU_LW(JL,JK,IW)=ZAER_TAU_LW(JL,JK,IW) + END DO + + ENDDO + ENDDO + + ! Vertically integrated optical properties at diagnostic wavelenghts + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NAERO_WVL_DIAG + ZAOD_DIAG(JL,IW)= ZAER_TAU_DIAG(JL,JK,IW)+ZAOD_DIAG(JL,IW) + ZSSA_DIAG(JL,IW)= ZAER_SSA_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZSSA_DIAG(JL,IW) + ZASY_DIAG(JL,IW)= ZAER_ASYM_DIAG(JL,JK,IW)*ZAER_SSA_DIAG(JL,JK,IW)*ZAER_TAU_DIAG(JL,JK,IW)+ZASY_DIAG(JL,IW) + END DO + END DO + END DO + + DO JL = KIDIA,KFDIA + DO IW=1,NAERO_WVL_DIAG + IF(ZSSA_DIAG(JL,IW)>0._JPRB) THEN + ZASY_DIAG(JL,IW) = ZASY_DIAG(JL,IW)/ZSSA_DIAG(JL,IW)! AVERAGE + ENDIF + IF(ZAOD_DIAG(JL,IW)>0._JPRB) THEN + ZSSA_DIAG(JL,IW) = ZSSA_DIAG(JL,IW)/ZAOD_DIAG(JL,IW)! AOD AVERAGE + ENDIF + END DO + END DO + + END SELECT + + ! Impose safety limits + IF ((NAEROOPT .NE. 0).AND. LSAFETY) THEN + ! REPSCAER was needed to avoid corruption in radiation_scheme at + ! some point. Such limit could be removed once we are satisfied + ! with computed optical depths + DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAER_TAU(JL,JK,IW) = MAX(REPSCAER, PAER_TAU(JL,JK,IW) ) + PAER_SSA(JL,JK,IW) = MIN(MAX(0._JPRB, PAER_SSA(JL,JK,IW) ), 1._JPRB) + PAER_ASYM(JL,JK,IW)= MIN( MAX(-1._JPRB, PAER_ASYM(JL,JK,IW)), 1._JPRB) + ENDDO + DO IW=1,16 + PAER_TAU_LW(JL,JK,IW) = MAX(REPSCAER, PAER_TAU_LW(JL,JK,IW)) + END DO + ENDDO + ENDDO + ENDIF + + CALL GSTATS(2506,1) +ENDIF ! It's a time step when radiation is called + +!* 6.2 Vertically integrated optical properties +! ---------------------------------------- +PAOD (KIDIA:KFDIA,:)=0._JPRB +PABS (KIDIA:KFDIA,:)=0._JPRB +PFAOD(KIDIA:KFDIA,:)=0._JPRB +PSSA (KIDIA:KFDIA,:)=0._JPRB +PASY (KIDIA:KFDIA,:)=0._JPRB +PAOD_LW(KIDIA:KFDIA,:)=0._JPRB + +DO JK = 1, KLEV + DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + PAOD(JL,IW)=PAER_TAU(JL,JK,IW)+PAOD(JL,IW) + PSSA(JL,IW)=PAER_SSA(JL,JK,IW)*PAER_TAU(JL,JK,IW)+PSSA(JL,IW) + PASY(JL,IW)=PAER_ASYM(JL,JK,IW)*PAER_TAU(JL,JK,IW)*PAER_SSA(JL,JK,IW)+PASY(JL,IW) + END DO + + DO IW=1,16 + PAOD_LW(JL,IW)=PAOD_LW(JL,IW)+PAER_TAU_LW(JL,JK,IW) + END DO + + END DO +END DO + +DO JL = KIDIA,KFDIA + DO IW=1,NASWBAND + IF(PSSA(JL,IW)>0._JPRB) THEN + PASY(JL,IW) = PASY(JL,IW)/PSSA(JL,IW) ! AVERAGE + ENDIF + IF(PAOD(JL,IW)>0._JPRB) THEN + PSSA(JL,IW) = PSSA(JL,IW)/PAOD(JL,IW) ! AOD AVERAGE + ENDIF + END DO +END DO + +!* 6.3 Fill selective aerosol OD fields in structure as available in IFS-AER +! --------------------------------------------------------------------- + +IF(MOD(NSTEP,NRADFR) == 0) THEN ! Use computed values + DO JWAVL=1,NAERO_WVL_DIAG + DO JL=KIDIA,KFDIA + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AOD) = ZAOD_DIAG(JL,JWAVL) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + !PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZABS_DIAG(JL,JWAVL)! 0.0 + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODABS) = ZAOD_DIAG(JL,JWAVL)*(1._JPRB-ZSSA_DIAG(JL,JWAVL))! absorption + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN! not implemented yet + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_AODFM) = 0._JPRB!PFAOD(JL,JWAVL)! 0.0 + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_SSA) = ZSSA_DIAG(JL,JWAVL) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PAERO_WVL_DIAG(JL,JWAVL,JPAERO_WVL_ASSIMETRY) = ZASY_DIAG(JL,JWAVL) + ENDIF + ENDDO + ENDDO +ELSE ! Use stored values (PAERO_WVL_DIAG get corrupted - see ticket OIFS-668) + + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AOD) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(6)%MP) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODABS) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(7)%MP) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODFM) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(8)%MP) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_SSA) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(9)%MP) + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_ASSIMETRY) = PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(10)%MP) + ENDIF +ENDIF + +!* +!* VH - Requires full checking by expert if this makes sense - FIXME +!* +DO JL=KIDIA,KFDIA + PODTO(JL) =PTAUS_AER(JL,KLEV,1,1) + PODTO469(JL) =PTAUS_AER(JL,KLEV,2,1) + PODTO670(JL) =PTAUS_AER(JL,KLEV,3,1) + PODTO865(JL) =PTAUS_AER(JL,KLEV,4,1) + PODTO1240(JL)=PTAUS_AER(JL,KLEV,5,1) +ENDDO + + +CALL HAMM7_DIAG_PM & + &( YDMODEL, KIDIA , KFDIA , KLON , KLEV , NAERO ,& + & PAEROP, & + & PAEPM1, PAEPM25, PAEPM10, & + & ZRHO, ZM6DRY, ZM6RP, ZRHOP) +!* 7. STORE IN AEROUTs +! ------------------------------ + +! LIFSMIN (T if running minimisation) and LIFSTRAJ (T if running high +! resolution trajectory integration) are both assimilation flags +IF(.NOT.LIFSMIN .AND. .NOT.LIFSTRAJ) THEN + + !** YAEROUT(1) : RADIATIVE PROPERTIES + + ! AOD/SSA/ASY of one internal (short) wavelengths - 533 nm + PGFL(KIDIA:KFDIA,1,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,10) + PGFL(KIDIA:KFDIA,2,YAEROUT(1)%MP)=PSSA(KIDIA:KFDIA,10) + PGFL(KIDIA:KFDIA,3,YAEROUT(1)%MP)=PASY(KIDIA:KFDIA,10) + + ! AOD of 14 internal (short) wavelengths + PGFL(KIDIA:KFDIA,4:17,YAEROUT(1)%MP)=PAOD(KIDIA:KFDIA,1:14) + + ! AOD of 16 internal (long) wavelengths + PGFL(KIDIA:KFDIA,18:33,YAEROUT(1)%MP)= PAOD_LW(KIDIA:KFDIA,1:16) + + !** YAEROUT(2) : DRY DEPOSITION + + DO JN=1,NAEROCOMP + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) + END DO + DO JN=1,NCLASS + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(2)%MP)=ZDDEPFLUX(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) + END DO + + !** YAEROUT(3) : COLUMN INTEGRATED WET-DEPOSITION + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(3)%MP) = WDEPOUT_2D(KIDIA:KFDIA,KAERO(JN)) + END DO + + !** YAEROUT(4) : SEDIMENTATION + + DO JN=1,NAEROCOMP + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_mass_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_mass_HAM(JN)) + END DO + DO JN=1,NCLASS + PGFL(KIDIA:KFDIA,ind_oifs_ham%ind_class_OIFS(JN),YAEROUT(4)%MP) = ZSEDIFLUXSURF(KIDIA:KFDIA,ind_oifs_ham%IND_class_HAM(JN)) + END DO + + !** YAEROUT(5) : NET AEROSOLS FLUXES (EMISSIONS - ???) ; level index of top of boundary layer ; boundary layer height + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(5)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) + END DO + PGFL(KIDIA:KFDIA,NACTAERO+2,YAEROUT(5)%MP) = ZBLHIDX(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,NACTAERO+3,YAEROUT(5)%MP) = PBLH(KIDIA:KFDIA) + + !** YAEROUT(6:10) : Store all requested AOP at selected (diagnostic) wavelengths + + IF(MOD(NSTEP,NRADFR) == 0) THEN + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AOD) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(6)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AOD) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODABS) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(7)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODABS) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_AODFM) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(8)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_AODFM) + ENDIF + IF (YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_SSA) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(9)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_SSA) + ENDIF + IF (YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES >= JPAERO_WVL_ASSIMETRY) THEN + PGFL(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, YAEROUT(10)%MP) = PAERO_WVL_DIAG(KIDIA:KFDIA, 1:NAERO_WVL_DIAG, JPAERO_WVL_ASSIMETRY) + ENDIF + ENDIF + + !** YAEROUT(11) : Total column mass and number concentration + + DO JN=1,NAEROCOMP + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(11)%MP + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)= ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(11)%MP + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(12) : mass and number tendency + ! kg/kg -> kg/m2 N/kg-> N/m2 + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(12)%MP + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(12)%MP + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA) = ZTMP(KIDIA:KFDIA) + ZXTTE(KIDIA:KFDIA,JK,JH) + END DO + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(13) : Surface fluxes of tracers (not emissions) + + DO JN=1,NACTAERO + !ZTMP(KIDIA:KFDIA)=0.0_JPRB + !DO JK=1,KLEV + ! ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PCEN(KIDIA:KFDIA,JK,KAERO(JN)) + !END DO + !PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(13)%MP) = ZTMP(KIDIA:KFDIA) + PGFL(KIDIA:KFDIA,KAERO(JN),YGFL%YAEROUT(13)%MP)= - PCFLX(KIDIA:KFDIA,KAERO(JN))* ZDPG(KIDIA:KFDIA,KLEV) + END DO + + !** YAEROUT(14) : Total column tracer/number PREVIOUS (before call to M7) concentration + + DO JN=1,NACTAERO + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+ZCEN(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(14)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(15) : Total column UPDATED TENDENCIES tracer + + DO JN=1,NACTAERO + ZTMP(KIDIA:KFDIA)=0.0_JPRB + DO JK=1,KLEV + ZTMP(KIDIA:KFDIA)=ZTMP(KIDIA:KFDIA)+PTENC(KIDIA:KFDIA,JK,KAERO(JN)) + END DO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(15)%MP) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(16) : M7 mass and number mixing ratio at surface + + DO JN=1,NAEROCOMP !ntrac!NACTAERO + JO=ind_oifs_ham%ind_mass_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_mass_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(16)%MP + ZTMP(KIDIA:KFDIA)= ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*ZDPG(KIDIA:KFDIA,KLEV) + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + DO JN=1,NCLASS + JO=ind_oifs_ham%ind_class_OIFS(JN) ! JO -> index context OIFS + JH=ind_oifs_ham%IND_class_HAM(JN) ! JH -> index context HAM + JY=YAEROUT(16)%MP + ZTMP(KIDIA:KFDIA) = ZXTM1(KIDIA:KFDIA,KLEV,JH)+(ZXTTE(KIDIA:KFDIA,KLEV,JH)*TIME_STEP_LEN)!*PRHO(KIDIA:KFDIA,KLEV) + PGFL(KIDIA:KFDIA,JO,JY) = ZTMP(KIDIA:KFDIA) + END DO + + !** YAEROUT(17-18) : IN-CLOUD & BELOW CLOUD WET DEPOSITION + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(17)%MP) = WDEPOUT_IC_2D(KIDIA:KFDIA,KAERO(JN)) + PGFL(KIDIA:KFDIA,KAERO(JN),YAEROUT(18)%MP) = WDEPOUT_BC_2D(KIDIA:KFDIA,KAERO(JN)) + END DO + + !** YAEROUT(19-20) : + + PGFL(KIDIA:KFDIA,KLEV,YAEROUT(19)%MP) = ZXTTE(KIDIA:KFDIA,KLEV,3) ! tendency SS CS ham after update surface + PGFL(KIDIA:KFDIA,KLEV-1,YAEROUT(20)%MP) = ZTENCIH(KIDIA:KFDIA,KLEV,17) ! tendency SS CS ham before update surface + + !** YAEROUT(21) : height of each level top + + DO JK=1,KLEV + PGFL(KIDIA:KFDIA,JK,YAEROUT(21)%MP) = (PGEOH(KIDIA:KFDIA,JK-1)-PGEOH(KIDIA:KFDIA,KLEV))*ZRG + END DO + + !** YAEROUT(22-26) : Nucleation diagnostics + + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(22)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,1) ! NS-mass production kg/s from nucleatiom (limited by amount of SO4) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(23)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,2) ! NS-number production rate #/s from nucleatiom (limited by amount of SO4 vs original #/s) + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(24)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,3) ! original #/s from H2SO4/H2O nucleatiom + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(25)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,4) ! original #/s from organic nucleatiom + PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(26)%MP) = ZOUT_dnuc(KIDIA:KFDIA,1:KLEV,5) ! original #/s sum from organic and vehkamäki nucleation schemes + + !** YAEROUT(27) : M7 GAS MIXING RATIOS at SURFACE + + DO JN=1,SUBM_NGASSPEC + PGFL(KIDIA:KFDIA,JN,YAEROUT(27)%MP)=zxtm1(KIDIA:KFDIA,KLEV,ind_oifs_ham%ind_gas_HAM(JN)) + END DO + + !** YAEROUT(28) : EMISSIONS + + DO JN=1,NACTAERO + PGFL(KIDIA:KFDIA, JN, YAEROUT(28)%MP) = PAERSRC(KIDIA:KFDIA,KAERO(JN)) + END DO + + !** YAEROUT(29) : SURFACE EMISSIONS MODIFIED BY DRY DEPOSITION + + DO JN=1,NTRAC + PGFL(KIDIA:KFDIA,JN,YAEROUT(39)%MP)=ZXTEMS(KIDIA:KFDIA,JN) + END DO + + !** YAEROUT(30) : -- + !** YAEROUT(31) : -- + !** YAEROUT(32) : -- + !** YAEROUT(33) : -- + !** YAEROUT(34) : -- + !** YAEROUT(35) : -- + !** YAEROUT(36) : -- + !** YAEROUT(37) : -- + !** YAEROUT(38) : -- + !** YAEROUT(39) : -- + !** YAEROUT(46) + ! !---------------DUST FIELDS DIAGNOSTICS----------------------- + ! !** YAEROUT(47) : -- + ! !3D Dust DU_AI in KG/M3 + ! JO= 20 ! JO -> index context OIFS`` + ! JH= 20 ! JH -> index context HAM + ! JY=YAEROUT(47)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ! END DO + + + ! ! ** YAEROUT(48) : -- + ! !DU_CI + ! JO= 26 ! JO -> index context OIFS`` + ! JH= 21 ! JH -> index context HAM + ! JY=YAEROUT(48)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= (ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN)) * ZDPG(KIDIA:KFDIA,JK) + ! END DO + + ! ! **YAEROUT(49) + ! !DU_AI NUM + ! JO= 19 ! JO -> index context OIFS`` + ! JH= 27 ! JH -> index context HAM + ! JY=YAEROUT(49)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN) + ! END DO + + ! ! **YAEROUT(50) + ! !DU_CI NUM + ! JO= 25 ! JO -> index context OIFS`` + ! JH= 28 ! JH -> index context HAM + ! JY=YAEROUT(50)%MP + ! DO JK=1,KLEV + ! PGFL(KIDIA:KFDIA,JK,JY)= ZXTM1(KIDIA:KFDIA,JK,JH)+(ZXTTE(KIDIA:KFDIA,JK,JH)*TIME_STEP_LEN) + ! END DO + +!Commented because of overlap DO JGAS=1,SUBM_NGASSPEC +!Commented because of overlap !!! BUG: JL? JK? !!! PGFL(KIDIA:KFDIA,JGAS,YAEROUT(28+JGAS)%MP)=ZCEN(JL,JK,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) +!Commented because of overlap PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(29+JGAS)%MP)= PTENC(KIDIA:KFDIA,1:KLEV,KCHEM(ind_oifs_ham%ind_gas_OIFS(JGAS))) +!Commented because of overlap END DO +!Commented because of overlap +!Commented because of overlap DO IMODE=1,NMOD +!Commented because of overlap PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(30+IMODE)%MP)=RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) ! m +!Commented because of overlap ENDDO + + !IF (TRIM(CHEM_SCHEME)=="SimChem")THEN + ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(40)%MP) = ZFSO2(KIDIA:KFDIA) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(41)%MP) = ZFSO4(KIDIA:KFDIA) ! tendency SS CS ham after update surfac + ! PGFL(KIDIA:KFDIA,KLEV,YAEROUT(42)%MP) = ZFSO4_AQ(KIDIA:KFDIA) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(43)%MP) = ZTSO4(KIDIA:KFDIA,1:KLEV,1) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(44)%MP) = ZTSO4_AQ(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + ! PGFL(KIDIA:KFDIA,1:KLEV,YAEROUT(45)%MP) = ZTSO2(KIDIA:KFDIA,1:KLEV) ! tendency SS CS ham after update surface + !END IF + +ENDIF + +!------------------------------------------------------------------------------ +!* 9. RELEASE LOCAL MEMORY +! -------------------- +IF (ALLOCATED(ZAERNGT)) DEALLOCATE( ZAERNGT ) +IF (ALLOCATED(ZWPDF ) ) DEALLOCATE( ZWPDF ) +IF (ALLOCATED(ZW ) ) DEALLOCATE( ZW ) +IF (ALLOCATED(ZRC) ) DEALLOCATE( ZRC ) +IF (ALLOCATED(ZSMAX)) DEALLOCATE( ZSMAX ) + +DO IMODE=1,NMOD + IF (ASSOCIATED(RW_MODE(IMODE)%D2)) DEALLOCATE(RW_MODE(IMODE)%D2) + IF (ASSOCIATED(DENS_MODE(IMODE)%D2)) DEALLOCATE(DENS_MODE(IMODE)%D2) +ENDDO + +DO IMODE=1,NMOD + IF (SIZECLASS(IMODE)%LSOLUBLE) THEN + IF (ASSOCIATED(RWD_MODE(IMODE)%D2)) DEALLOCATE(RWD_MODE(IMODE)%D2) + IF (ASSOCIATED(H2O_MODE(IMODE)%D2)) DEALLOCATE(H2O_MODE(IMODE)%D2) + END IF +ENDDO + +END ASSOCIATE +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('HAMM7_INTERFACE',1,ZHOOK_HANDLE) + +END SUBROUTINE HAMM7_INTERFACE diff --git a/ifs-source/arpifs/m7/phys_ec/m7.F90 b/ifs-source/arpifs/m7/phys_ec/m7.F90 new file mode 100755 index 00000000..2612f30e --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/m7.F90 @@ -0,0 +1,262 @@ +SUBROUTINE m7(KIDIA, KFDIA, KLON, KLEV, & ! TM5 indices + papp1, prelhum, ptp1, & ! " thermodynamics + pso4g, pelvoc, psvoc, paerml, paernl, & ! M7 tracers + prhop, pww, pm6rp, pm6dry, & ! " aerosol properties + ptime ) ! TM5 time step + ! + ! ****m7* Aerosol model for the system so4,bc,oc,soa,ss,dust in 7 modes. + ! + ! Authors: + ! --------- + ! E. Vignati, JRC/EI (original source) 2000 + ! P. Stier, MPI (f90-version, changes, comments) 2001 + ! E. Vignati, JRC/IES (so2 is not required in this version) 2005 + ! T Bergman FMI (modification for IFS) 2020 + ! + ! Purpose + ! --------- + ! Aerosol model for the system so4,bc,oc,ss,dust in 7 modes. + ! + ! Externals + ! --------- + ! + ! *m7_averageproperties* + ! calculates the average mass for all modes and the particle + ! dry radius and density for the insoluble modes. + ! + ! *m7_equiz* + ! calculates the ambient radius of sulphate particles + ! + ! *m7_equimix* + ! calculates the ambient radius of so4,bc,oc (dust) particles + ! + ! *m7_equil* + ! calculates the ambient radius of so4,ss particles + ! + ! *m7_dgas* + ! calculates the sulfate condensation on existing particles + ! + ! *m7_dnum* + ! calculates new gas phase sulfate and aerosol numbers and masses + ! after condensation, nucleation and coagulation over one timestep + ! + ! *m7_dconc* + ! repartitions aerosol number and mass between the + ! the modes to account for condensational growth and the formation + ! of an accumulation mode from the upper tail of the aitken mode and + ! of a coarse mode from the upper tail of the accumulation mode + ! + + !USE mo_aero_m7, ONLY: lsnucl, lscoag, lscond, & + USE TM5M7_DATA, ONLY : nmod, nss, nsol, naermod + USE PARKIND1, ONLY : JPIM, JPRB +! use tracer_data, only : tracer_print +! use GO, only : gol, goErr, goPr, goBug + ! use mo_aero, only : nsoa !RM + + IMPLICIT NONE + + !--- Parameter list: + ! + ! papp1 = atmospheric pressure at time t+1 [Pa] + ! prelhum = atmospheric relative humidity [% (0-1)] + ! ptp1 = atmospheric temperature at time t+1 [K] + ! pso4g = mass of gas phase sulfate [molec. cm-3] + ! paerml = total aerosol mass for each compound + ! [molec. cm-3 for sulphate and ug m-3 for bc, oc, ss, and dust] + ! paernl = aerosol number for each mode [cm-3] + ! prhop = mean mode particle density [g cm-3] + ! pm6rp = mean mode actual radius (wet radius for soluble modes + ! and dry radius for insoluble modes) [cm] + ! pm6dry = dry radius for soluble modes [cm] + ! pww = aerosol water content for each mode [kg(water) m-3(air)] + ! + !--- Local variables: + ! + ! zttn = average mass for single compound in each mode + ! [in molec. for sulphate and in ug for bc, oc, ss, and dust] + ! zhplus = number of h+ in mole [???] (kg water)-1 + ! zso4_x = mass of sulphate condensed on insoluble mode x [molec. cm-3] + ! (calculated in dgas used in concoag) + + + ! Parameters: + + INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA, KFDIA, KLON, KLEV + + REAL(KIND=JPRB),INTENT(IN) :: ptime + REAL(KIND=JPRB),INTENT(IN) :: prelhum(KLON,KLEV), papp1(KLON,KLEV), ptp1(KLON,KLEV) + REAL(KIND=JPRB),INTENT(INOUT) :: pso4g(KLON,KLEV), pelvoc(KLON,KLEV), psvoc(KLON,KLEV) !RM + REAL(KIND=JPRB),INTENT(INOUT) :: paerml(KLON,KLEV,naermod), paernl(KLON,KLEV,nmod), & + & pm6rp(KLON,KLEV,nmod), pm6dry(KLON,KLEV,nsol), & + & prhop(KLON,KLEV,nmod), pww(KLON,KLEV,nmod) + + ! Local variables: + + REAL(KIND=JPRB) :: zso4_5(KLON,KLEV), zso4_6(KLON,KLEV), zso4_7(KLON,KLEV) + REAL(KIND=JPRB) :: zhplus(KLON,KLEV,nss) + + REAL(KIND=JPRB) :: zttn(KLON,KLEV,naermod) + + ! + !--- 0) Initialisations: ------------------------------------------------- + ! + ! RCHG -> this subroutine depends on KIDIA and KFDIA so this Initialisations + ! are confusing/dangerous. + zhplus(:,:,:) = 0._JPRB + pm6dry(:,:,:) = 0._JPRB + pm6rp(:,:,:) = 0._JPRB + zttn(:,:,:) = 0._JPRB + prhop(:,:,:) = 0._JPRB + pww(:,:,:) = 0._JPRB + zso4_5(:,:) = 0._JPRB + zso4_6(:,:) = 0._JPRB + zso4_7(:,:) = 0._JPRB + +!!$ ! +!!$ !--- 1) Calculation of particle properties under ambient conditions: ----- +!!$ ! +!!$ !--- 1.1) Calculate mean particle mass for all modes +!!$ ! and dry radius and density for the insoluble modes. +!!$ ! +!!$ CALL m7_averageproperties(KIDIA, KFDIA, KLON, KLEV, paernl, paerml, zttn, pm6rp, prhop) +!!$ ! +!!$ !--- 1.2) Calculate ambient count median radii and density +!!$ ! for lognormal distribution of particles. +!!$ ! +!!$ ! Sulfate particles: +!!$ ! +!!$ CALL m7_equiz(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Mixed particles with sulfate, b/o carbon and dust: +!!$ ! +!!$ CALL m7_equimix(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Accumulation and coarse mode particles in presence of +!!$ ! sea salt particles: +!!$ ! +!!$ CALL m7_equil(KIDIA, KFDIA, KLON, KLEV, prelhum, paerml, paernl, & +!!$ pm6rp, pm6dry, zhplus, pww, prhop, ptp1 ) +!!$ ! +!!$ ! +!!$ !--- 2) Calculate changes in aerosol mass and gas phase sulfate ---------- +!!$ ! due to sulfate condensation: +!!$ ! No change in particle mass/number relationships. +!!$ ! +!!$ IF (lscond) CALL m7_dgas(KIDIA, KFDIA, KLON, KLEV, pso4g, paerml, paernl, & +!!$ ptp1, papp1, pm6rp, zso4_5, zso4_6, zso4_7, & +!!$ ptime) +!!$ +!!$ !--- 2b) Calculate changes in aerosol mass ---------- +!!$ ! due to organic condensation: +!!$ ! No change in particle mass/number relationships. +!!$ ! +!!$ +!!$ IF (nsoa .GT. 0 .AND. lscond) THEN +!!$ CALL m7_dgas_org(KIDIA, KFDIA, KLON, KLEV, pelvoc, psvoc, paerml, paernl, & +!!$ ptp1, papp1, pm6rp, & +!!$ ptime) +!!$ END IF +!!$ ! +!!$ ! +!!$ !--- 3) Calculate change in particle number concentrations --------------- +!!$ ! due to nucleation and coagulation: +!!$ ! Change particle mass/number relationships. +!!$ ! +!!$ ! JadB: Removed "If (lsnucl .OR. lscoag)". +!!$ ! If only lscond is set, the m7_dnum is required for storing sulfuric acid on insoluble aerosols (making the soluble). +!!$ ! Without m7_dnum, the sulfuric acid condensed on insoluble particles is turned into void. +!!$ ! IF (lsnucl.OR.lscoag) CALL m7_dnum(KIDIA, KFDIA, KLON, KLEV, & +!!$ ! pso4g, paerml, paernl, ptp1, & +!!$ ! papp1, prelhum, pm6rp, prhop, & +!!$ ! zso4_5, zso4_6, zso4_7, ptime ) +!!$ +!!$ CALL m7_dnum(KIDIA, KFDIA, KLON, KLEV, & +!!$ pso4g, pelvoc, paerml, paernl, ptp1, & +!!$ papp1, prelhum, pm6rp, prhop, & +!!$ zso4_5, zso4_6, zso4_7, ptime ) +!!$ ! +!!$ ! +!!$ !--- 4) Recalculation of particle properties under ambient conditions: --- +!!$ ! +!!$ !--- 4.1) Recalculate mean masses for all modes +!!$ ! and dry radius and density for the insoluble modes. +!!$ ! +!!$ CALL m7_averageproperties(KIDIA, KFDIA, KLON, KLEV, paernl, paerml, zttn, pm6rp, prhop) +!!$ ! +!!$ !--- 4.2) Calculate ambient count median radii and density +!!$ ! for lognormal distribution of particles. +!!$ ! +!!$ ! Sulfate particles: +!!$ ! +!!$ CALL m7_equiz(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Mixed particles with sulfate, b/o carbon and dust: +!!$ ! +!!$ CALL m7_equimix(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Accumulation and coarse mode particles in presence of +!!$ ! sea salt particles: +!!$ ! +!!$ CALL m7_equil(KIDIA, KFDIA, KLON, KLEV, prelhum, paerml, paernl, & +!!$ pm6rp, pm6dry, zhplus, pww, prhop, ptp1 ) +!!$ ! +!!$ !--- 5) Repartitition particles among the modes: ------------------------- +!!$ ! +!!$ IF (lscond.OR.lscoag) THEN +!!$ +!!$ CALL m7_dconc(KIDIA, KFDIA, KLON, KLEV, paerml, paernl, pm6dry) +!!$ +!!$ END IF +!!$ ! +!!$ !--- 6) Recalculation of particle properties under ambient conditions: --- +!!$ ! +!!$ !--- 6.1) Calculate mean particle mass for all modes +!!$ ! and dry radius and density for the insoluble modes: +!!$ ! +!!$ CALL m7_averageproperties(KIDIA, KFDIA, KLON, KLEV, paernl, paerml, zttn, pm6rp, prhop) +!!$ ! +!!$ !--- 6.2) Calculate ambient count median radii and density +!!$ ! for lognormal distribution of particles. +!!$ ! +!!$ ! Sulfate particles: +!!$ ! +!!$ CALL m7_equiz(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Mixed particles with sulfate, b/o carbon and dust: +!!$ ! +!!$ CALL m7_equimix(KIDIA, KFDIA, KLON, KLEV, & +!!$ papp1, zttn, ptp1, & +!!$ prelhum, pm6rp, pm6dry, & +!!$ prhop, pww, paernl ) +!!$ ! +!!$ ! Accumulation and coarse mode particles in presence of +!!$ ! sea salt particles: +!!$ ! +!!$ CALL m7_equil(KIDIA, KFDIA, KLON, KLEV, prelhum, paerml, paernl, & +!!$ pm6rp, pm6dry, zhplus, pww, prhop, ptp1 ) +!!$ + +! write(*,*) 'ou2', 'h2so4= ', pso4g(2100,1),'num1= ',paernl(2100,1,1) +! write(*,*) 'ou2', 'BCsol= ', paerml(2100,1,5),'BCins= ', paerml(2100,1,8) +! write(*,*) 'ou2', 'POsol= ', paerml(2100,1,9),'POins= ', paerml(2100,1,12) +! write(*,*) 'ou2', 'num2= ', paernl(2100,1,2), 'num5= ', paernl(2100,1,5) +! write(*,*) 'ou2', 'BCtot= ', paerml(2100,1,5)+ paerml(2100,1,8)+paerml(2100,1,6)+paerml(2100,1,7) +! write(*,*) 'ou2', 'cond5= ', zso4_5(2100,1), '6= ',zso4_6(2100,1), '7= ',zso4_7(2100,1) + ! +END SUBROUTINE m7 diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_drydep.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_drydep.F90 new file mode 100644 index 00000000..6d3054b8 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_drydep.F90 @@ -0,0 +1,639 @@ +SUBROUTINE TM5M7_DRYDEP & + !---input + & ( KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & + & PTSPHY, PTENCI, PT , PAP , PAPH, PWIND, & + & PLSM,PCI, PAERUST, PZ0M,PRHCL,PGEOH, PDZ,& + & SSHF, SLHF, & + !---prognostic fields + & RW_MODE, DENS_MODE, PCEN, & + !---output + & PFLUXAER, PTENC, PVDA) + +!**** *TM5M7_DRYDEP* - ROUTINE FOR PARAMETRIZATION OF TM5M7 AEROSOL DEPOSITION +! +! !DESCRIPTION: This module calculates deposition of aerosol particles +! +! It is assumed that the distribution is described by nmodes log-normal +! distributions +! +! Each mode has a number and mass and a sigma_lognormal. Number and mass are +! related and the mean aerosol radius can thus be calculated for each mode. +! +! mass=pi*4./3.*radius**3.*number*exp(9./2.*ln2s) /1e18*density, with: +! +! density = density of aerosol type +! ln2s = (alog(sigma_lognormal(mode)))**2 +! mass = mode mass +! number = mode number +! +! mode1 : accumulation +! mode2 : coarse +! mode3 : super coarse (ss) coarse +! +! For each mode a separate fall velocity is calculated according to the mass +! and number mean radii. Water take-up by seasalt particles is taken into +! account. This changes the density, radius, and sigma of the distribution. +! +! Also included is the deposition calculation. based on a lookup table +! calculated for a reference aerosol density (e.g. 1800 kg/m3) and a number of +! radii. This deposition curve is convoluted with the number/volume +! distribution of the aerosols. +! + +! Again, for SS the water takeup is accounted for, and the effects on density, +! sigma and radius are calculated. The density has effect on the impaction +! term is the depotion calculation. This can be modeled by a shift in the +! radius. Thus the radii of the lookup table are adapted for density +! differences when impaction becomes important. + +!** INTERFACE. +! ---------- +! *TM5M7_DRYDEP* IS CALLED FROM *TM5M7_PHY2*. + +! INPUTS: +! ------- +! PTSPHY : TIMESTEP (s) +! PTENCI(KLON,KLEV,KTRAC) : INPUT TENDENCIES (xx kg s-1) +! PAP (KLON,KLEV) : LEVEL PRESSURE (Pa) +! PAPH (KLON,KLEV+1) : HALF-LEVEL PRESSURE (Pa) +! PWIND (KLON) : 10-meter wind speed +! PCI (KLON) : FRACTION OF SEA ICE +! PLSM (KLON) : LAND-SEA MASK +! PAERUST KLON) : Friction velocity +! PZ0M : roughness length for momentum (m) +! PRHCL (KLON) : Rel. humidity at surface level (0-1) +! PT (KLON) : SURFACE LEVEL TEMPERATURE (K) +! PCEN (KLON,KLEV,KTRAC) : CONCENTRATION OF TRACERS (xx kg-1) + +! OUTPUTS: +! -------- +! PTENC (KLON,KLEV,KTRAC) : TENDENCY (xx kg-1 s-1) +! PVDA (KLON,NACTAERO) : dry deposition velocities (m/sec) + +! EXTERNALS. +! ---------- +! NONE + +! MODIFICATIONS. +! ------------- + +! SWITCHES. +! -------- + +! MODEL PARAMETERS +! ---------------- + +!----------------------------------------------------------------------- +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK + +USE YOMLUN, ONLY : NULERR +USE YOEAERSRC ,ONLY : YREAERSRC +USE YOEAERSNK ,ONLY : YREAERSNK +USE YOMCST ,ONLY : RG, RD,RNAVO,RPI +USE YOM_YGFL ,ONLY : YGFL +USE TM5M7_DATA, ONLY : NMOD, MODE_NM_SED, mode_start, mode_tracers_sed, XMAIR,MODAL_DATA, & + & SIGMA_LOGNORMAL, NRDEP, LUR, DENSITY_REF +USE TM5M7_EMIS_DATA, ONLY : VKARMAN + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +!---input fields +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YGFL%NAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PTENCI(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON) ! Temp +REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV)! Mid-lev pres +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON),PLSM(KLON),PCI(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PAERUST(KLON),PZ0M(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PRHCL(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PGEOH(KLON,0:KLEV),PDZ(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: SSHF(KLON),SLHF(KLON) ! sensible and latent heat fluxes (W/m2) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) ! interface pres +TYPE(MODAL_DATA) ,INTENT(IN) :: RW_MODE(NMOD) +TYPE(MODAL_DATA) ,INTENT(IN) :: DENS_MODE(NMOD) + +REAL(KIND=JPRB) ,INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) +!---output fields +REAL(KIND=JPRB) ,INTENT(INOUT) :: PFLUXAER(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PVDA(KLON,YGFL%NACTAERO) !eehol: correct indices + +!---local fields +REAL(KIND=JPRB) :: TEMP, PB, DP, ZVIS, RHO_AIR, TO_PASCAL,RADIUS,VT +REAL(KIND=JPRB) :: UM,ZR, VD_SEA,CUNNING,DC,DENSAER,RELAX,SC +REAL(KIND=JPRB) :: UST_LAND, ST_LAND,VB_LAND,VI_LAND, VKD_LAND, VD_LAND +REAL(KIND=JPRB) :: FREESEA, UST_SEA, ST_SEA, RE, VBSEA,VISEA, VKDACCSEA, VKD_SEA + +REAL(KIND=JPRB) :: ZRAERO(KLON) +REAL(KIND=JPRB) :: USTAR_SEA(KLON), SR_SEA(KLON), ALPHA(KLON), BUBBLE(KLON),ALPHAE(KLON) +REAL(KIND=JPRB) :: Y0,YRA, ZRA,OBUK, BUOY, TSTV, Z1TSPHY, ZAERI, ZAERO + +INTEGER(KIND=JPIM) :: JK, JL, JN, JNN, MODE, IMODE, INMODE, IRDEP, ITN, NRD, JAER + +REAL(KIND=JPRB) :: m_to_pa !factor from m/s --> Pa/s + +REAL(KIND=JPRB), PARAMETER :: dynvisc=1.789e-4*2. ! g cm-1 s-1 CHECKED FD OK, there is temp. dependence Perry p. 3-248. + ! unit is g cm-1 s+1 FD + ! checked with Seinfeld---> factor 2. came out (diameter ? radius) +REAL(KIND=JPRB), PARAMETER :: cl=0.066*1e-4 ! mean free path [cm] (particle size also in cm) +REAL(KIND=JPRB), PARAMETER :: bc= 1.38e-16 ! boltzman constant [g cm-2 s-1 K-1] (1.38e-23 J deg-1) =>binas +REAL(KIND=JPRB), PARAMETER :: kappa=1. ! shapefactor +REAL(KIND=JPRB), PARAMETER :: visc=0.15 ! KINEMATIC molecular viscocity [cm2 s-1] + ! this is also function of temperature FD + + +REAL(KIND=JPRB),PARAMETER :: eff=0.5 ! parameters needed for sea/bubble formation +REAL(KIND=JPRB),PARAMETER :: rdrop=0.005 ! cm +REAL(KIND=JPRB),PARAMETER :: zdrop=10.0 ! cm +REAL(KIND=JPRB),PARAMETER :: eps=0.6 ! parameter related to bubble formation +REAL(KIND=JPRB) :: qdrop,ZS,phi,alpha1,vk1,vk2,alpharat ! auxiliary parameters for bubble formation +REAL(KIND=JPRB) :: sr_help ! surface roughnes consistent with 10 m wind. + + + ! Href: constant reference height for calculations of raero + real, parameter :: Href=30. + real,parameter :: rhoCp = 1231.0 + real,parameter :: rhoLv = 3013000.0 + + +REAL(KIND=JPRB),DIMENSION(KLON,NRDEP) :: ZVDA + +REAL(KIND=JPRB) :: LNS (NMOD) + +REAL(KIND=JPRB),DIMENSION(:),POINTER :: VS + + + +REAL(KIND=JPRB), DIMENSION(nrdep) :: d_aer ! diameter vd loopup table (um) +REAL(KIND=JPRB), DIMENSION(nrdep) :: nnumb,nvolume ! number and volume distribution +REAL(KIND=JPRB), DIMENSION(nrdep) :: vdi ! for the integration +REAL(KIND=JPRB), DIMENSION(nrdep) :: vdi_def ! for the integration +REAL(KIND=JPRB), DIMENSION(nrdep) :: lure ! effective loo +REAL(KIND=JPRB), DIMENSION(nrdep) :: ddpi ! integration bin-sizes +REAL(KIND=JPRB), DIMENSION(nrdep+1) :: dlogdp,ddp ! integration edges +REAL(KIND=JPRB), DIMENSION(nrdep) :: logdp,logde ! log(diameter) + +REAL(KIND=JPRB) :: SIGMA, LNSIGMA, DENSITY, DPG, NTOT +INTEGER(KIND=JPIM) :: NSHIFT, IR1, IR + +REAL(KIND=JPRB) :: Z1RG, ZALPHA, ZHGT, ZZ0M,ZAERUST,ZDP(KLON,KLEV) + +! Arrays to collect deposition velocities +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: vn_deposition +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: vm_deposition + + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_DRYDEP',0,ZHOOK_HANDLE) + +! Initialize.. +PVDA(1:KLON,1:KLEV)=0._JPRB + +do JK=1,KLEV + ZDP(KIDIA:KFDIA,JK)=PAPH(KIDIA:KFDIA,JK)-PAPH(KIDIA:KFDIA,JK-1) +end do +!-- Compute aerodynamic resistance. +! VH - for now use fixed resistance. Particul +! VH - there is an issue with SSHF and SLHF (and in turn buoy), +! VH - which does not seem to lead to reasonable numbers. +! VH - needs to be double-checked if these quantities are already computed before call to aerini_layer +! DO JL=KIDIA,KFDIA +! ZZ0M=MAX(1e-9_JPRB,PZ0M(JL)) +! ZAERUST=MAX(1e-9_JPRB,PAERUST(JL)) +! buoy = -SSHF(JL) / rhoCp & +! & -0.61 * PT(JL) * SLHF(JL)/rhoLv +! tstv=-buoy/ZAERUST +! obuk=1E-6_JPRB +! IF( abs(tstv) .gt. 1.E-25_JPRB .AND. abs(tstv) .LT. 1E25_JPRB ) THEN +! obuk = ZAERUST*ZAERUST*PT(JL)/(tstv*RG*vKarman) +! ENDIF +! +! IF( obuk > 0. ) THEN ! stable conditions +! ZRA = 0.74*( alog(Href/ZZ0M) + 6.4*(Href-ZZ0M)/obuk )& +! & / (vKarman*ZAERUST) +! ELSE ! unstable +! y0 = sqrt(1.-9.*ZZ0M/obuk)+1. +! yra = sqrt(1.-9.*Href/obuk)+1. +! ZRA = 0.74*(alog(Href/ZZ0M)+2.*(alog(y0)-alog(yra)))/ & +! & (vKarman*ZAERUST) +! ENDIF +! IF (ZRA .GT. 0._JPRB) THEN +! ZRA=ZRA +! ELSE +!!VH DEBUG +! WRITE(NULERR,*)"DDEP DEBUG: ",ZRA, PZ0M(JL), ZZ0M, OBUK +! WRITE(NULERR,*)"DDEB DEBUG-B:",TSTV,buoy,SSHF(JL),SLHF(JL) +!!VH END DEBUG +! +! ENDIF +! +! ZRAERO(JL)=max(10._JPRB,min(ZRA,1e10_JPRB)) +! ENDDO +! VH end. +! VH For now take aerodynamic resistance as from 'AER' model. + DO JL=KIDIA,KFDIA + ZRAERO(JL)=LOG(PDZ(JL)/PZ0M(JL))/(VKARMAN*PAERUST(JL)) + ENDDO + + + DO JL=KIDIA,KFDIA + ! SEA: + ! surface roughness from Charnock equation + ! friction velocity from surface stress + ! + if(PLSM(JL) < 0.99) then + !VH ustar_sea(JL)=sqrt(sstr(JL)) + !VH sr_sea(JL)=alfa_charnock1*v_charnock/ustar_sea(JL) + & + !VH alfa_charnock2*sstr(JL)/RG + !VH replace with something (hopefully) appropriate... (check?!) + ustar_sea(JL)=PAERUST(JL) + sr_sea(JL)=PZ0M(JL) + else + ustar_sea(JL)=0.0 + sr_sea(JL)=0.0 + endif + + + freesea = MAX(0.,1.-PLSM(JL)-PCI(JL)) + if (freesea>0.01) then ! + + ! bubble bursting effect,see Hummelshoj, equation 10 + ! relationship by Wu (1988), note that Hummelshoj has not + ! considered the cunningham factor which yields a different + ! vb curve, with smaller values for small particles + ! according to LG indeed 10 m windspeed (instead of 1 m windspeed in use in ECHAM5 + + alpha(JL)=MIN(1.0,MAX(1.e-10,1.7e-6*PWIND(JL)**3.75)) ! set maximum! + + qdrop=5.*(100.*alpha(JL)) ! 100 is the flux of bubbles per cm^2/s (see Monohan(1988)) + + bubble(JL)=((100.*ustar_sea(JL))**2.)/(100.*PWIND(JL)) + & + eff*(2.*rpi*rdrop**2.)*(2.*zdrop)*(qdrop/alpha(JL)) + + !--- Correction of particle radius for particle growth close to the + ! surface according to Fitzgerald, 1975, the relative humidity over + ! the ocean is restricted to 98% (0.98) due to the salinity + + ZS=MIN(0.98,PRHCL(JL)) + + !fd23012004 beta(JL)=EXP((0.00077*ZS)/(1.009-ZS)) THIS term was present in ECHAM code ! + !; max. value reached for this parameter is 1.04 and is ignored here. + + phi=1.058-((0.0155*(ZS-0.97))/(1.02-ZS**1.4)) + alpha1=1.2*EXP((0.066*ZS)/(phi-ZS)) + vk1=10.2-23.7*ZS+14.5*ZS**2. + vk2=-6.7+15.5*ZS-9.2*ZS**2. + alpharat=1.-vk1*(1.-eps)-vk2*(1.-eps**2) + alphae(JL)=alpharat*alpha1 + + !--- Over land no correction for large humidity close to the surface: + + else ! land surface + alpha(JL)=0. + bubble(JL)=0. + alphae(JL)=1. + endif + ENDDO + + + + ! look up table for different aerosol radii: + do irdep = 1, nrdep + + do JL=KIDIA,KFDIA + + zr = 2.0e-4 * lur(irdep) ! diameter in cm ! + vd_land=0. + vd_sea=0. + + + um=PWIND(JL) + ! xland = PLSM(JL) ![]fraction . xland replaced with PLSM(JL) + + !--- Cunningham factor: + + cunning=1.+(cl/(alphae(JL)*zr))*(2.514+0.800*EXP(-0.55*zr/cl)) + + !--- Diffusivity: + + dc=(bc* PT(JL)*cunning)/(3.*RPI*dynvisc*(alphae(JL)*zr)) ! [cm2/s] FD + + ! Relaxation: + ! relax represents characteristic relaxation time scale [Seinfeld, p. 319] + ! [ kg m-3 => g cm-3 ] + densaer = density_ref ! reference density (e.q. 1800 kg/m3) + relax=cunning*densaer*1.E-3*((alphae(JL)*zr)**2. ) & + & /(18.*dynvisc*kappa) + + + ! Sedimentation is calculated operator split in the subroutine sedimentation: + ! + ! sedspeed=(((((alphae(JL)*zr(JL)))**2.)* & + ! densaer(jl,klev,jmod,jrow)*1.E-3*grav*cunning)/(18.*dynvisc)) ! note grav should be in cm + ! [ kg m-3 => g cm-3 ] + + ! Calculation of schmidt + + sc =visc/dc ![cm2 s-1]/[cm2 s-1] dimensionless + + if (PLSM(JL).gt.0.01) then + ! note that in ECHAM there is a difference between vegetaton and snow/bare soil + + ust_land=PAERUST(JL) + + ! + ! calculation of stokes numbers + + st_land =max(0.1,(relax*(100.*ust_land)**2.)/visc) + + !--- Calculation of the dry deposition velocity + ! See paper slinn and slinn, 1980, vd is related to d**2/3 + ! over land, whereas over sea there is accounted for slip + ! vb_ represents the contribution in vd of the brownian diffusion [cm s-1] + ! and vi_ represents the impaction [cm s-1] + ! + + vb_land =(1./vkarman)*((ust_land/um)**2)*100.*um*(sc**(-2./3.)) ![cm s-1] + vi_land =(1./vkarman)*((ust_land/um)**2)*100.*um*(10.**(-3./st_land)) ![cm s-1] + vkd_land =(vb_land+vi_land)*1e-2 ![m s-1] + vd_land=1./(ZRAERO(JL)+1./vkd_land) + ! if (vkd_land.gt.1.) write(*,999) & + ! 'after vb',i,j,'jtype',jtype,'jmod',jmod,'vb',vb_land,'vi',vi_land,& + ! 'um10',um,'ust_land',ust_land,'dc',dc,'relax',relax,'schmidt',sc,'stokes',st_land + endif ! PLSM.gt.0 + if (PLSM(JL) < 0.99) then + !--- Over sea: + ! Brownian diffusion for rough elements, see Hummelshoj + ! re is the reynolds stress: + + ust_sea=ustar_sea(JL) + st_sea =max(0.1,(relax*(100.*ust_sea)**2.)/visc) + re =(100.*ust_sea*100.*sr_sea(JL))/visc ! [cm/s]*[cm]/[cm2/s] + vbsea =(1./3.)*100.*ust_sea*((sc**(-0.5))*re**(-0.5)) + visea =100.*ust_sea*10.**(-3./st_sea) + vkdaccsea =vbsea+visea + vkd_sea =((1.-alpha(JL))*vkdaccsea+alpha(JL)*bubble(JL))*1e-2 ! [m s-1] + vd_sea=1./(ZRAERO(JL)+1./vkd_sea) ! [m s-1] + ! if (vkd_sea.gt.1.) write(*,999) 'sea',i,j,'jtype',jtype,'jmod',jmod,'vb',vbsea,& + ! 'vi',visea,'vkd_sea',vkd_sea,'alpha*bubble',alpha(JL)*bubble(JL),'alpha',alpha(JL) + + endif ! PLSM.lt.0.99 + + ZVDA(JL,IRDEP) = min(0.1,(1.-PLSM(JL))*vd_sea + PLSM(JL)*vd_land) ! [m s-1] limit to 10 cm/s + + enddo !JL +enddo ! loop over nrdep + + + + + + +! ----------------------------------------- +! Part 2: Apply aerosol deposition velocity +! ----------------------------------------- + + + + + +m_to_pa = 7.24e16*RG*xmair*1e3/RNAVO !factor from m/s --> Pa/s + +!- PCEN in unit of kg kg-1 (mass mixing ratio) +!- ZRHO in unit of kg m-3 +!- v[n|m]_deposition in unit of m s-1 speed + + +DO IMODE=1,NMOD + ALLOCATE(vn_deposition(IMODE)%surf(KIDIA:KFDIA)) + ALLOCATE(vm_deposition(IMODE)%surf(KIDIA:KFDIA)) + + vn_deposition(IMODE)%surf(KIDIA:KFDIA)=0.0_JPRB + vm_deposition(IMODE)%surf(KIDIA:KFDIA)=0.0_JPRB +ENDDO + + + do mode =1,nmod + lns(mode) = log(sigma_lognormal(mode)) + enddo + + ! calculate the binsizes (um) around the radii of the pre-calculated vd's + d_aer(1:NRDEP) = 2.0*lur(1:NRDEP) ! diameter (um) + logdp(1:NRDEP) = log10(d_aer(1:NRDEP)) ! log(diameter) + + + do JL=KIDIA, KFDIA + + + temp = PT(JL) ! at surface to temp box + pb = PAPH(JL,KLEV+1) ! pressure at bottom of box (Pa) + dp = PAPH(JL,KLEV+1)-PAPH(JL,KLEV) ! layer thickness + ! to_pascal = m_to_pa*dt*pb/temp ! convert from m/s ---> Pa/timestep + + ! do IRDEP=1,nrdep + ! vdi_def(IRDEP) = VDA(JL,IRDEP) + ! enddo + + M7MODES: do mode = 1, nmod + + vt = 0.0_JPRB + + itn = mode_start(mode) ! position of number tracer + + ! compute radius: + radius = rw_mode(mode)%d2(JL,KLEV) + + ! initial deposition velocities for increasing radia: + vdi(1:NRDEP) = ZVDA(JL,1:NRDEP) + + sigma = sigma_lognormal(mode) + lnsigma = log(sigma) + density = dens_mode(mode)%d2(JL,KLEV) + + !if(okdebug) then + ! if(radius > tiny(radius)) then + ! r_mean(mode) = r_mean(mode) + radius + ! nr(mode) = nr(mode) + 1 + ! r_max(mode) = max(r_max(mode), radius) + ! endif + !endif + + RADENS: if (radius > 1e-11 .and. density > 1e-2) then + + ! account for density different than density_ref of the look-up table (lur --> vdi): + lure(:) = lur(:) + logde(:) = logdp(:) + do ir = 2, nrdep + if(vdi(ir) > vdi(ir-1)) exit ! for bigger r's : impaction dominates (density effects) + if ( ir == nrdep ) exit ! trap upper boundary + enddo + do ir1 = ir, nrdep + lure(ir1) = lur(ir1)*sqrt(density_ref/density) + logde(ir1) = log10(2*lure(ir1)) + enddo + + ! compress look-up table such that radii are increasing monotonic: + nshift = 0 + ir1 = ir + do + if ( logde(ir1) > logde(ir-1) ) exit + nshift = nshift + 1 + ir = ir -1 + if(ir == 1) exit + enddo + nrd = nrdep - nshift + if (nshift > 0) then + do ir1 = ir, nrd + logde(ir1) = logde(ir1+nshift) + lure(ir1) = lure(ir1+nshift) + vdi(ir1) = vdi(ir1+nshift) + enddo + endif + + ! do the integration of the shifted lookup table: + dlogdp(1) = -3.0 + do ir=2,nrd + dlogdp(ir) = 0.5*(logde(ir-1)+logde(ir)) ! take middle of the log scale + enddo + dlogdp(nrd+1) = 3.0 ! 1000 um + ddp(1:nrd+1) = 10**dlogdp(1:nrd+1) + ddpi(1:nrd) = ddp(2:nrd+1)-ddp(1:nrd) ! integration intervals (um) + d_aer(1:nrd) = 2.0*lure(1:nrd) + + ! perform convolution with log-normal distribution: + dpg = 2*radius*1e6 ! diameter in um + ! In TM5: ntot=rm(JL,1,itn). Double-check if this is consistent?! + ntot = PCEN(JL,KLEV,KAERO(itn)) + + ! calculate the distribution (number and mass) over the deposition bins: + if(ntot > 1.0 .and. radius > tiny(radius) ) then ! you need some aerosol! + do JNN=1,nrd + nnumb(JNN) = ntot/(sqrt(2.*RPI)*d_aer(JNN)*lnsigma)*exp(-(log(d_aer(JNN))-log(dpg))**2/(2*lnsigma**2)) + nvolume(JNN) = nnumb(JNN)*(RPI/6.0)*d_aer(JNN)**3 + enddo + vt = sum(nnumb(1:nrd)*ddpi(1:nrd)*vdi(1:nrd))/sum(nnumb(1:nrd)*ddpi(1:nrd)) + else + vt = 0.0 + endif + + ! vn_deposition_mean%surf(JL,mode) = vn_deposition_mean%surf(JL, mode) + vt + ! vn_deposition(mode)%surf(JL) = min(to_pascal*vt,ndp*dp) ! in Pa/timestep downwards + vn_deposition(mode)%surf(JL) = max(0._JPRB,vt) ! keep units in (presumably ) m/sec + + !if(okdebug) then + ! if ( vt > tiny(vt) ) then + ! vd_mean(mode,1) = vd_mean(mode,1) + vt + ! vd_max(mode,1) = max(vd_max(mode,1) , vt) + ! nvd(mode,1) = nvd(mode,1) + 1 + ! endif + !endif + + ! for mass: + if(ntot > 1.0 .and. radius > tiny(radius) ) then ! you need some aerosol! + vt = sum(nvolume(1:nrd)*ddpi(1:nrd)*vdi(1:nrd))/sum(nvolume(1:nrd)*ddpi(1:nrd)) + else + vt = 0.0 + endif + ! vm_deposition_mean%surf(JL, mode) = vm_deposition_mean%surf(JL, mode) + vt + ! vm_deposition(mode)%surf(JL) = min(to_pascal*vt,ndp*dp) ! in Pa/timestep downwards + vm_deposition(mode)%surf(JL) = max(0._JPRB, vt) ! in m/sec + + + !if(okdebug) then + ! if ( vt > tiny(vt) ) then + ! vd_mean(mode,2) = vd_mean(mode,2) + vt + ! vd_max(mode,2) = max(vd_max(mode,2) , vt) + ! nvd(mode,2) = nvd(mode,2) + 1 + ! endif + !endif ! + + else + vm_deposition(mode)%surf(JL) = 0.0 + vn_deposition(mode)%surf(JL) = 0.0 + endif RADENS + + end do M7MODES + + enddo ! JL + + + +! Compute corresponding tendencies +Z1RG = 1.0_JPRB/RG +Z1TSPHY = 1.0_JPRB/PTSPHY + +! ================= +! Loop over tracers +! ================= +do mode =1,nmod + !do inmode=0,mode_nm(mode) + do inmode=0,mode_nm_sed(mode) + + JN = mode_tracers_sed(inmode,mode) + JAER=KAERO(JN) + + !------------- reset + NULLIFY(VS) + if (inmode == 0) then ! number or mass tracer + vs => vn_deposition(mode)%surf + else + vs => vm_deposition(mode)%surf + endif + + !output velocity field for diagnostics purposes.. + PVDA(KIDIA:KFDIA,JAER)=VS(KIDIA:KFDIA) + + DO JL =KIDIA,KFDIA + ZAERO = PCEN(JL,KLEV,JAER) + PTSPHY * PTENCI(JL,KLEV,JAER) + +! using the analytical solution (Flemming et al., 2011, D_GRG_4.6) +! The tendency in the lowest layer is modified, but the surface flux remains +! untouched. + + ZHGT= PGEOH(JL,KLEV-1) * Z1RG + ZALPHA= PTSPHY* VS(JL) /ZHGT +!-- using Euler forward +! ZAERI = ZAERO * (1.0_JPRB - ZALPHA) +!-- using Euler backward +! ZAERI = ZAERO * (1.0_JPRB + ZALPHA) +!-- using Euler centered +! ZAERI = ZAERO * ((1.0_JPRB - ZALPHA)/(1.0_JPRB + ZALPHA)) +!-- using the analytical solution (Flemming et al., 2011, D_GRG_4.6) + ZAERI = ZAERO * EXP(-1.0_JPRB * ZALPHA) + PTENC(JL,KLEV,JAER)= PTENCI(JL,KLEV,JAER) & + & + (ZAERI-ZAERO) * Z1TSPHY + !vh check indices.. PFLUXAER(JL,JAER)= (ZAERO - ZAERI)*Z1TSPHY * PDP(JL,KLEV) * Z1RG + ! No update of surface flux: + PFLUXAER(JL,JAER)= (ZAERO - ZAERI)*Z1TSPHY * ZDP(JL,KLEV) * Z1RG!PFLUXAER(JL,JAER) + ENDDO + + enddo ! loop over tracers in mode +enddo ! loop over modes + + + +DO IMODE=1,NMOD + IF(ASSOCIATED(vn_deposition(IMODE)%surf)) DEALLOCATE(vn_deposition(IMODE)%surf) + IF(ASSOCIATED(vm_deposition(IMODE)%surf)) DEALLOCATE(vm_deposition(IMODE)%surf) +ENDDO + + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_DRYDEP',1,ZHOOK_HANDLE) + + + +END SUBROUTINE TM5M7_DRYDEP diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_get_refr_idx.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_get_refr_idx.F90 new file mode 100644 index 00000000..a39ca7b8 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_get_refr_idx.F90 @@ -0,0 +1,409 @@ +SUBROUTINE TM5M7_GET_REFR_IDX(wdep, SO4, BC, OC, SOA, SS, DU, water, mode, m_eff) + +!*** * TM5M7_GET_REFR_IDX* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: TM5M7_GET_REFR_IDX +! +! !DESCRIPTION: Compute refractive index of internally mixed aerosols by use +! of effective medium theory for the size-dependent aerosol +! mixtures assumed in M7. +! +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! +! !REVISION HISTORY: +! +! 12 Aug 2008 - Michael Kahnert, SMHI +! 6 Feb 2011 - Achim Strunk - +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN ,ONLY : NULERR + +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY : ss_density, dust_density, carbon_density, & + & pom_density, so4_density, soa_density +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +type(wavelendep), INTENT(IN) :: wdep ! wavelength properties (wavelength, re/img part of refractive index) +REAL(KIND=JPRB), INTENT(IN) :: SO4, BC, OC,SOA ! mass mixing ratios or concentrations of sulphate, black carbon, organic carbon +REAL(KIND=JPRB), INTENT(IN) :: SS, DU, water ! sea salt, dust, and water +INTEGER(KIND=JPIM), INTENT(IN) :: mode ! mode number (M7) +! +! !OUTPUT PARAMETERS: +! +COMPLEX, INTENT(OUT) :: m_eff ! effective refractive index of mixture +!INTEGER(KIND=JPIM), INTENT(OUT) :: status + + + +!* 0.2 LOCAL VARIABLES +! --------------- + +! refractive indices +COMPLEX :: m_SO4, m_BC, m_OC, m_SOA, m_SS, m_DU, m_water + +! volume fractions +REAL(KIND=JPRB) :: v_SO4, v_BC, v_OC, v_SOA, v_SS, v_DU, v_water, water_iv + +REAL(KIND=JPRB) :: vtot, v2 +COMPLEX :: m00, m0, m1, m2 + +!VH REAL(KIND=JPRB) :: rpls, ipls +REAL(KIND=JPRB),PARAMETER :: ROL = 1000. ! kg/m^3 + + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',0,ZHOOK_HANDLE) + + ! Get the refractive indices from the lookup-tables and put them into COMPLEX numbers. + m_so4 = cmplx( wdep%n(1),wdep%k(1) ) ! H2-SO4 + NH4NO3 + m_bc = cmplx( wdep%n(2),wdep%k(2) ) ! BC + m_oc = cmplx( wdep%n(3),wdep%k(3) ) ! POM + m_soa = cmplx( wdep%n(4),wdep%k(4) ) ! SOA + m_ss = cmplx( wdep%n(5),wdep%k(5) ) ! SS + m_du = cmplx( wdep%n(6),wdep%k(6) ) ! DU + m_water = cmplx( wdep%n(7),wdep%k(7) ) ! Water + + !status = 0 + ! no mixing for mode=6,7: + if(mode.ge.6)then + m_eff=m_DU + IF(LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',1,ZHOOK_HANDLE) + RETURN + endif + + ! compute volume fractions: + v_SO4=0._JPRB + v_BC=0._JPRB + v_OC=0._JPRB + v_SOA=0._JPRB + v_SS=0._JPRB + v_DU=0._JPRB + v_water=0._JPRB + vtot=0._JPRB + + ! Added sanity check (15-7-2010 - P. Le Sager) : Avoid negative water + ! mixing ratio! + ! The bruggeman logically assumes that v_water is between 0 and 1, but + ! this is never checked in the call chain : + ! ECEarth_Optics_Step -> calculate_aop -> get_refr_idx [here] -> + ! Bruggeman + ! We do it here, with a warning since it reflects a problem upstream: + if(water.lt.0.0_JPRB)then + !write (gol,*)" WARNING - [Get_refr_idx] : negative relative humidity..." + !write (gol,*)" WARNING - [Get_refr_idx] : .....set to 0" + water_iv=0.0_JPRB + else + water_iv=water + endif + + if(mode.le.4)then + v_SO4=SO4/so4_density + v_water=water_iv/rol + vtot=vtot+v_SO4+v_water + endif + if(mode.le.5)then + !v_OC=OC/pom_density + v_SOA=SOA/soa_density + vtot=vtot+v_SOA + end if + if(mode.ge.2.and.mode.le.5)then + v_BC=BC/carbon_density + v_OC=OC/pom_density + vtot=vtot+v_BC+v_OC + endif + if(mode.ge.3.and.mode.le.4)then + v_SS=SS/ss_density + vtot=vtot+v_SS + endif + if(mode.ge.3.and.mode.ne.5)then + v_DU=DU/dust_density + vtot=vtot+v_DU + endif + ! If vtot is zero, we will get 0.0/0.0's causing NaNs. In that case, the + ! refractive index does not matter and will be set to (1.0,1.0e-9). The + ! reason not to take (1.0,0.0) is that someone with humour might take + ! the logarithm of the imaginary part. Dust particles get their usual + ! refractive index, because they already returned m_DU. But that does + ! not matter, because there are zero aerosols in this case. + if (vtot .le. 1E-20_JPRB) then + m_eff = Cmplx(1.0,1.0e-9) + else + v_SO4=MAX(1E-20,v_SO4/vtot) + v_BC=MAX(1E-20,v_BC/vtot) + v_OC=MAX(1E-20,v_OC/vtot) + v_SOA=MAX(1E-20,v_SOA/vtot) + v_SS=MAX(1E-20,v_SS/vtot) + v_DU=MAX(1E-20,v_DU/vtot) + v_water=MAX(1E-20,v_water/vtot) + + !----------------------------------------------------------------------- + ! effective medium computations for each mode + !----------------------------------------------------------------------- + if(mode.eq.1)then + ! Bruggeman mixing rule for SO4 OC and water: + m1=m_SO4 + m2=m_SOA + vtot=v_SO4+v_SOA + v2=v_SOA/vtot + call Bruggeman(m1,m2,v2,m0) + m1=m0 + m2=m_water + v2=v_water + call Bruggeman(m1,m2,v2,m0) + elseif(mode.eq.2)then + ! iterative Bruggeman mixing rule for SO4, OC, and water: + m1=m_SO4 + m2=m_OC + vtot=v_SO4+v_OC + v2=v_OC/vtot + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_SOA + vtot=vtot+v_SOA + v2=v_SOA/vtot + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_water + vtot=vtot+v_water + v2=v_water/vtot + call Bruggeman(m1,m2,v2,m00) + ! Maxwell-Garnett mixing rule for BC inclusions: + m1=m00 + m2=m_BC + v2=v_BC + call Maxwell_Garnett(m1,m2,v2,m0) + elseif(mode.eq.3.or.mode.eq.4)then + ! iterative Bruggeman mixing rule for SO4, OC, SS, and water: + m1=m_SO4 + m2=m_OC + vtot=v_SO4+v_OC + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_OC/vtot + end if + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_SOA + vtot=vtot+v_SOA + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_SOA/vtot + end if + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_SS + vtot=vtot+v_SS + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_SS/vtot + end if + call Bruggeman(m1,m2,v2,m00) + m1=m00 + m2=m_water + vtot=vtot+v_water + v2=v_water/vtot + call Bruggeman(m1,m2,v2,m00) + ! iterative Maxwell-Garnett mixing rule for BC and dust + ! inclusions: + m1=m00 + m2=m_BC + vtot=vtot+v_BC + if ( vtot < TINY( vtot ) ) then + v2=0.0_JPRB + else + v2=v_BC/vtot + end if + call Maxwell_Garnett(m1,m2,v2,m00) + m1=m00 + m2=m_DU + v2=v_DU + call Maxwell_Garnett(m1,m2,v2,m0) + elseif(mode.eq.5)then + + m1=m_SOA + m2=m_OC + vtot=v_SOA+v_OC + v2=v_OC/vtot + call Bruggeman(m1,m2,v2,m00) + ! Maxwell-Garnett mixing rule for BC inclusions: + m1=m00 + m2=m_BC + v2=v_BC + call Maxwell_Garnett(m1,m2,v2,m0) + + endif + m_eff = m0 + End If + + ! Debug : trap for a NAN (13-7-2010 - P. Le Sager) + ! rpls=real(m_eff) + ! ipls=imag(m_eff) + ! IF ((rpls.NE.rpls).or.(ipls.NE.ipls)) then + ! status = 1 + ! write (NULERR,'(" GET_REFR_IDX-NAN: ", 3(E16.4,2x),i4,2x,7(E16.4,2x))') rpls, ipls, vtot, mode,& + ! & SO4,BC,OC,SOA,SS,DU,water + ! endif + +IF(LHOOK) CALL DR_HOOK('TM5M7_GET_REFR_IDX',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_GET_REFR_IDX + + + + +!-------------------------------------------------------------------------- +! TM5 ! +!-------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: BRUGGEMAN +! +! !DESCRIPTION: Compute effective refractive index of a mixture of 2 components +! by use of the Bruggeman mixing rule +!\\ +!\\ +! !INTERFACE: +! +PURE SUBROUTINE BRUGGEMAN(m1,m2,v2,m0) + ! + ! !INPUT PARAMETERS: + ! + USE PARKIND1 ,ONLY : JPIM ,JPRB + COMPLEX, INTENT(IN) :: m1,m2 + REAL(KIND=JPRB), INTENT(IN) :: v2 + ! + ! !OUTPUT PARAMETERS: + ! + COMPLEX, INTENT(OUT):: m0 + ! + ! !REVISION HISTORY: + ! 12 Aug 2008 - Michael Kahnert, SMHI + ! 6 Feb 2011 - Achim Strunk - + ! + ! !REMARKS: + ! + !EOP + !------------------------------------------------------------------------ + !BOC + + !local: + COMPLEX :: m1s,m2s,mt + REAL(KIND=JPRB) :: fac1,fac2 + + !Begin + + if(v2.eq.1.0_JPRB)then + m0=m2 + ! IF(LHOOK) CALL DR_HOOK('routine_name',1,ZHOOK_HANDLE) + RETURN + elseif(v2.eq.0.0_JPRB)then + m0=m1 + ! IF(LHOOK) CALL DR_HOOK('routine_name',1,ZHOOK_HANDLE) + RETURN + endif + + fac1=2._JPRB-3._JPRB*v2 + fac2=3._JPRB*v2-1._JPRB + m1s=m1**2_JPIM + m2s=m2**2_JPIM + mt=m1s*fac1+m2s*fac2 + m0=1._JPRB/16._JPRB*mt**2_JPIM+0.5_JPRB*m1s*m2s + m0=csqrt(m0) + m0=m0+0.25_JPRB*mt + m0=csqrt(m0) + + END SUBROUTINE BRUGGEMAN +!EOC + + + + + +!-------------------------------------------------------------------------- +! TM5 ! +!-------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: MAXWELL_GARNETT +! +! !DESCRIPTION: Compute effective refractive index for a medium consisting of +! a matrix with refractive index m1 and inclusions with refractive +! index m2 and volume fraction v2 by use of the Maxwell-Garnett +! mixing rule. +!\\ +!\\ +! !INTERFACE: +! +PURE SUBROUTINE MAXWELL_GARNETT( m1, m2, v2, m0) + ! + ! !INPUT PARAMETERS: + ! + USE PARKIND1 ,ONLY : JPIM ,JPRB + COMPLEX, INTENT(IN) :: m1, m2 + REAL(KIND=JPRB), INTENT(IN) :: v2 + ! + ! !OUTPUT PARAMETERS: + ! + COMPLEX, INTENT(OUT):: m0 + ! + ! !REVISION HISTORY: + ! 12 Aug 2008 - Michael Kahnert, SMHI + ! 6 Feb 2011 - Achim Strunk - + ! + ! !REMARKS: + ! + !EOP + !------------------------------------------------------------------------ + !BOC + + !local: + COMPLEX :: m1s,m2s + REAL(KIND=JPRB) :: fac1,fac2 + + ! Begin: + + fac1=3.0_JPRB-2.0_JPRB*v2 + fac2=3.0_JPRB-v2 + m1s=m1**2_JPIM + m2s=m2**2_JPIM + + m0=m2s*(fac1*m1s+2.0*v2*m2s)/(v2*m1s+fac2*m2s) + m0=csqrt(m0) + +END SUBROUTINE MAXWELL_GARNETT +!EOC + + diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 new file mode 100644 index 00000000..e4d4b7eb --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_aop_get.F90 @@ -0,0 +1,241 @@ +SUBROUTINE TM5M7_OPTICS_AOP_GET(YGFL, YREAERSRC, KIDIA,KFDIA,KLON, KLEV, NACTAERO, & + & nwav, wdep, ncontr, ecearth_units, & + & PRHO, PAERO, RW_MODE,RWD_MODE,H2O_MODE, & + & Paop_out_ext, Paop_out_a, Paop_out_g, aop_out_add ) + +!*** * TM5M7_OPTICS_AOP_GET* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: OPTICS_AOP_GET +! +! !DESCRIPTION: Initialise the fields "aop_in" and then calculate the +! optical properties through a call to optics_calculate_aop. +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN ,ONLY : NULOUT +USE YOEAERSRC, ONLY : TEAERSRC !YREAERSRC +!USE YOMCST, ONLY : +USE TM5M7_DATA, ONLY : H2SO4_FACTOR,NH4NO3_FACTOR, SO4_DENSITY,MSA_DENSITY, & + & NH4NO3_DENSITY, & + & MODAL_DATA,NMOD,NSOL +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, AOPI,NADD +USE YOM_YGFL , ONLY : TYPE_GFLD!YGFL +USE TM5M7_DATA, ONLY : & + & INO3_A , IACS_N , ISO4ACS , IBCACS , IPOMACS , ISSACS , IDUACS , & + & ISOANUS , ISOAAIS , ISOAACS , ISOACOS , ISOAAII , IH2OPART ,IAII_N , IBCAII , & + & IPOMAII , IACI_N , IDUACI , IAIS_N , ISO4AIS , IBCAIS , IPOMAIS , ICOI_N , & + & IDUCOI , ICOS_N , ISO4COS , IBCCOS , IPOMCOS , ISSCOS , IDUCOS , INUS_N , & + & ISO4NUS , IELVOC , IISVOC , IMSA + + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +TYPE(TEAERSRC), INTENT(IN) :: YREAERSRC +TYPE(TYPE_GFLD) ,INTENT(IN) :: YGFL +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA,KFDIA,KLON,KLEV,NACTAERO, NWAV,NCONTR +TYPE(WAVELENDEP), DIMENSION(NWAV), INTENT(IN):: WDEP +LOGICAL, INTENT(IN) :: ECEARTH_UNITS +REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) ! air Density [kg/m3] +REAL(KIND=JPRB), INTENT(IN) :: PAERO(KLON,KLEV,NACTAERO) + + +TYPE(MODAL_DATA), INTENT(IN) :: RW_MODE(NMOD) +TYPE(MODAL_DATA), INTENT(IN) :: RWD_MODE(NSOL) +TYPE(MODAL_DATA), INTENT(IN) :: H2O_MODE(NSOL) + +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_EXT(KLON,KLEV,NWAV,NCONTR) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_A(KLON,KLEV,NWAV) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_G(KLON,KLEV,NWAV) +REAL(KIND=JPRB), INTENT(OUT), OPTIONAL :: AOP_OUT_ADD(KLON,KLEV,NWAV,NADD) ! additional parameters + + +!* 0.2 LOCAL VARIABLES +! --------------- + +TYPE(AOPI), dimension(:,:), allocatable :: aop_in +INTEGER(KIND=JPRB) :: IMODE + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +INTEGER(kind=JPIM)::NCHEM + +!----------------------------------------------------------------------- + +#include "tm5m7_optics_calculate_aop.intfb.h" +associate(NCHEM => YGFL%NCHEM) +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_AOP_GET',0,ZHOOK_HANDLE) + + + + ! --- start ------------------------------ + + + allocate( aop_in(KLON,KLEV) ) + + ! Initialize full array to zero. + DO IMODE = 1, nmod + aop_in(1:KLON,1:KLEV)%so4 (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%bc (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%oc (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%soa (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%ss (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%du (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%h2o (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%numdens(IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%rg (IMODE) = 0.0_JPRB + aop_in(1:KLON,1:KLEV)%rgd (IMODE) = 0.0_JPRB ; aop_in(1:KLON,1:KLEV)%no3 (IMODE) = 0.0_JPRB + END DO + +!>>> TvN +! In M7 sulphate is assumed to be H2-SO4 with corresponding particle density so4_density +! The sulphate mass should therefore also include the small contribution from the H atoms + ! NUS + aop_in(KIDIA:KFDIA,1:KLEV)%so4(1) = 1.E9_JPRB * h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4nus) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(1) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoanus) + + ! AIS + aop_in(KIDIA:KFDIA,1:KLEV)%so4(2) = 1.E9_JPRB * h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4ais) + aop_in(KIDIA:KFDIA,1:KLEV)%bc (2) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibcais ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (2) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomais) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(2) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoaais) + ! ACS (additional: NO3) +! The contribution from methane sulfonate (MSA-) aerosol is added +! to that for sulfate. +! As the addition is done by volume, +! we need to account for the difference in densities +! (as done below for ammonium nitrate). + if(NCHEM<1) then + aop_in(KIDIA:KFDIA,1:KLEV)%so4(3) = 1.E9_JPRB * ( h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4acs)) + ELSE + aop_in(KIDIA:KFDIA,1:KLEV)%so4(3) = 1.E9_JPRB * ( h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4acs) + & + (so4_density / msa_density) * PAERO(KIDIA:KFDIA,1:KLEV,imsa) ) + END if +! Since nh4no3_density is the density of NH4NO3, the contribution from NH4 should be included. +! Moreover, assuming the same refractive index for NH4NO3 as for H2-SO4, +! the contributions from both components can be added by volume; +! thus we need to account for the difference in densities. +! Estimates of the refractive index of NH4NO3 are available from literature +! (e.g. Lowenthal et al., Atmos. Environ., 2000). +! For practical purposes, it can be set equal to the value used for sulfate, +! i.e. the value for a solution containing 75% H2SO4 (Fenn et al., 1985). + if(NCHEM>0) then + aop_in(KIDIA:KFDIA,1:KLEV)%no3(3) = 1.E9_JPRB * nh4no3_factor * (so4_density / nh4no3_density) * & + PAERO(KIDIA:KFDIA,1:KLEV,ino3_a ) + END if + aop_in(KIDIA:KFDIA,1:KLEV)%bc (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibcacs ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomacs) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoaacs) + aop_in(KIDIA:KFDIA,1:KLEV)%ss (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,issacs ) + aop_in(KIDIA:KFDIA,1:KLEV)%du (3) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iduacs ) + ! COS + aop_in(KIDIA:KFDIA,1:KLEV)%so4(4) = 1.E9_JPRB * h2so4_factor * PAERO(KIDIA:KFDIA,1:KLEV,iso4cos) +!<<< TvN + aop_in(KIDIA:KFDIA,1:KLEV)%bc (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibccos ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomcos) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoacos) + aop_in(KIDIA:KFDIA,1:KLEV)%ss (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isscos ) + aop_in(KIDIA:KFDIA,1:KLEV)%du (4) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iducos ) + ! AII + aop_in(KIDIA:KFDIA,1:KLEV)%bc (5) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ibcaii ) + aop_in(KIDIA:KFDIA,1:KLEV)%oc (5) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,ipomaii) + aop_in(KIDIA:KFDIA,1:KLEV)%soa(5) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,isoaaii) + ! ACI + aop_in(KIDIA:KFDIA,1:KLEV)%du (6) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iduaci ) + ! COI + aop_in(KIDIA:KFDIA,1:KLEV)%du (7) = 1.E9_JPRB * PAERO(KIDIA:KFDIA,1:KLEV,iducoi ) + ! Water in (hydrophillic) modes + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(1) = 1.E9_JPRB * h2o_mode(1)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(2) = 1.E9_JPRB * h2o_mode(2)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(3) = 1.E9_JPRB * h2o_mode(3)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%h2o(4) = 1.E9_JPRB * h2o_mode(4)%d2(KIDIA:KFDIA,1:KLEV)/PRHO(KIDIA:KFDIA,1:KLEV) + + aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) = 1.E6_JPRB * rw_mode (1)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) = 1.E6_JPRB * rw_mode (2)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (3) = 1.E6_JPRB * rw_mode (3)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (4) = 1.E6_JPRB * rw_mode (4)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) = 1.E6_JPRB * rw_mode (5)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) = 1.E6_JPRB * rw_mode (6)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) = 1.E6_JPRB * rw_mode (7)%d2(KIDIA:KFDIA,1:KLEV) + + ! dry radius for soluble modes / rest equals the usual radii + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(1) = 1.E6_JPRB * rwd_mode(1)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(2) = 1.E6_JPRB * rwd_mode(2)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(3) = 1.E6_JPRB * rwd_mode(3)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(4) = 1.E6_JPRB * rwd_mode(4)%d2(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(5) = aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(6) = aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) + aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) = aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) + + + !VH original: rm/vol ->units [N/gridbox] / [m3/gridbox] -> [Number/m3] + !VH new PAERO/ DENS-> units [N/kg] * [kg/m3] = [N/m3] + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(1) = PAERO(KIDIA:KFDIA,1:KLEV,inus_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(2) = PAERO(KIDIA:KFDIA,1:KLEV,iais_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(3) = PAERO(KIDIA:KFDIA,1:KLEV,iacs_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(4) = PAERO(KIDIA:KFDIA,1:KLEV,icos_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(5) = PAERO(KIDIA:KFDIA,1:KLEV,iaii_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(6) = PAERO(KIDIA:KFDIA,1:KLEV,iaci_n) * PRHO(KIDIA:KFDIA,1:KLEV) + aop_in(KIDIA:KFDIA,1:KLEV)%numdens(7) = PAERO(KIDIA:KFDIA,1:KLEV,icoi_n) * PRHO(KIDIA:KFDIA,1:KLEV) + !TB safeguard for early timesteps when very small negatives may appear + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(1) .lt. 1.E-15_JPRB )aop_in(KIDIA:KFDIA,1:KLEV)%numdens(1) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(2).lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(2) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(3) .lt. 1.E-15_JPRB )aop_in(KIDIA:KFDIA,1:KLEV)%numdens(3) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(4).lt. 1.E-15_JPRB )aop_in(KIDIA:KFDIA,1:KLEV)%numdens(4) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(5).lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(5) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(6) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(6) = 1.E-15_JPRB + where(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(7).lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%numdens(7) = 1.E-15_JPRB + + ! check valid ranges in particle sizes (might be zero) + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (1) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(1) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(1) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (2) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(2) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(2) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (3) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (3) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(3) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(3) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (4) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (4) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(4) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(4) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (5) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(5) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(5) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (6) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(6) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(6) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rg (7) = 1.E-15_JPRB + where( aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) .lt. 1.E-15_JPRB ) aop_in(KIDIA:KFDIA,1:KLEV)%rgd(7) = 1.E-15_JPRB + + if (present(aop_out_add)) then + call tm5m7_optics_calculate_aop(KIDIA,KFDIA, KLON,KLEV, nwav,NCONTR, wdep, ecearth_units, & + & AOP_IN, & + & Paop_out_ext, Paop_out_a, Paop_out_g, aop_out_add ) + else + call tm5m7_optics_calculate_aop( KIDIA,KFDIA,KLON,KLEV, nwav, NCONTR, wdep, ecearth_units, & + & AOP_IN, & + & Paop_out_ext, Paop_out_a, Paop_out_g ) + endif + + ! OK + Deallocate( aop_in ) + +IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_AOP_GET',1,ZHOOK_HANDLE) +end associate +END SUBROUTINE TM5M7_OPTICS_AOP_GET diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 new file mode 100644 index 00000000..3a0fceee --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_calculate_aop.F90 @@ -0,0 +1,411 @@ +SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP(KIDIA,KFDIA,KLON,KLEV, nwl,NCONTR, wdep, ecearth_units, & + & AOP_IN, & + & PAOP_OUT_EXT, PAOP_OUT_A, PAOP_OUT_G, PAOP_OUT_ADD ) + +!*** * TM5M7_OPTICS_CALCULATE_AOP* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: OPTICS_CALCULATE_AOP +! +! !DESCRIPTION: This routine writes on PAOP_OUT_* (module wide parameters) +! the retrieved aerosol properties. The caller has to ensure +! that these fields have been allocated properly. +! IMPORTANT: OC is actually POM. +! Remember converting OC to POM when sending it to this method. +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! +! !REVISION HISTORY: +! 12 Aug 2008 - Michael Kahnert, SMHI +! 6 Feb 2011 - Achim Strunk - +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN ,ONLY : NULOUT,NULERR + +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY : SIGMA, H2SO4_FACTOR,NH4NO3_FACTOR, SO4_DENSITY,MSA_DENSITY, & + & CMEDR2MMEDR,CARBON_DENSITY,POM_DENSITY,SOA_DENSITY,SS_DENSITY,DUST_DENSITY,& + & MODAL_DATA,NMOD,NSOL +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, AOPI,NADD, & + & cext_159, a_159, g_159, cext_200, a_200, g_200 + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM) , INTENT(IN) :: KIDIA,KFDIA,KLON,KLEV,NWL,NCONTR +TYPE(WAVELENDEP), DIMENSION(NWL), INTENT(IN) :: WDEP +LOGICAL , INTENT(IN) :: ECEARTH_UNITS +TYPE(AOPI), DIMENSION(KLON,KLEV), INTENT(IN) :: AOP_IN + + +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_EXT(KLON,KLEV,NWL,NCONTR) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_A(KLON,KLEV,NWL) +REAL(KIND=JPRB), INTENT(OUT):: PAOP_OUT_G(KLON,KLEV,NWL) +REAL(KIND=JPRB), INTENT(OUT), OPTIONAL :: PAOP_OUT_ADD(KLON,KLEV,NWL,NADD) ! additional parameters + + + +!* 0.2 LOCAL VARIABLES +! --------------- +REAL(KIND=JPRB), DIMENSION(KLON,KLEV) :: NCsca, incext +REAL(KIND=JPRB) :: Cexti, ai, gi, NCscai, xg +COMPLEX :: m_eff +REAL(KIND=JPRB), DIMENSION(:),allocatable :: lnsigma + +INTEGER(KIND=JPIM) :: i, imode, JL,JK +INTEGER(KIND=JPIM) :: statusomp +LOGICAL :: coarse +REAL(KIND=JPRB) :: totvoldry, modfrac +REAL(KIND=JPRB), DIMENSION(:,:,:), Pointer :: cext_table, a_table, g_table +REAL(KIND=JPRB) :: TWOPI + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- + +#include "tm5m7_get_refr_idx.intfb.h" +#include "tm5m7_optics_get.intfb.h" + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_CALCULATE_AOP',0,ZHOOK_HANDLE) + + + TWOPI=2*RPI + +! allocate( NCsca ( KLON,KLEV ) ) +! allocate( incext( KLON,KLEV ) ) + STATUSOMP=0 + + + ! Sulphate based on OPAC (Hess et al., 1998): + + !======================================================================= + ! Get refractive indices of each component at the given wavelength: + !======================================================================= + do i = 1, nwl ! loop over wavelengths + + if( wdep(i)%split .or. wdep(i)%insitu ) then + allocate( lnsigma( nmod ) ) + lnsigma = log(sigma) + end if + + PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,:) = 0.0_JPRB + PAOP_OUT_G (KIDIA:KFDIA,1:KLEV,i) = 0.0_JPRB + PAOP_OUT_A (KIDIA:KFDIA,1:KLEV,i) = 0.0_JPRB + if( wdep(i)%insitu ) PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,:) = 0.0_JPRB + NCsca (KIDIA:KFDIA,1:KLEV) = 0.0_JPRB + + do imode = 1, 7 ! loop over M7 modes + coarse = (imode .eq. 4 .or. imode .eq. 7) + + If (coarse) then + cext_table => cext_200 + a_table => a_200 + g_table => g_200 + Else + cext_table => cext_159 + a_table => a_159 + g_table => g_159 + End if + + + !======================================================================= + ! Compute effective refractive index of internally mixed aerosols + ! for each grid cell and mode: + !======================================================================= + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + !write(1001,*) aop_in(JL,JK)%SO4(imode) + !write(1002,*) aop_in(JL,JK)%SOA(imode) + !write(1003,*) aop_in(JL,JK)%BC(imode) + !write(1005,*) aop_in(JL,JK)%OC(imode) + !write(1004,*) aop_in(JL,JK)%SS(imode) + !write(1006,*) aop_in(JL,JK)%DU(imode) + !write(1007,*) aop_in(JL,JK)%NO3(imode) + call tm5m7_get_refr_idx( wdep(i), & + aop_in(JL,JK)%SO4(imode) + aop_in(JL,JK)%NO3(imode), & ! H2-SO4 + NH4NO3 + aop_in(JL,JK)%BC (imode), aop_in(JL,JK)%OC (imode), & + aop_in(JL,JK)%SOA (imode), & + aop_in(JL,JK)%SS (imode), aop_in(JL,JK)%DU (imode), & + aop_in(JL,JK)%h2o(imode), imode, m_eff) + !if (statusomp ==1) then + ! WRITE(NULERR,'(" Problem with GET_REFR_IDX-NAN inputs: ", 9(E16.4,2x))') & + ! aop_in(JL,JK)%SO4(imode), aop_in(JL,JK)%NO3(imode), aop_in(JL,JK)%h2o(imode), & + ! aop_in(JL,JK)%SOA(imode),aop_in(JL,JK)%BC(imode), aop_in(JL,JK)%OC(imode),& + ! aop_in(JL,JK)%SS(imode), aop_in(JL,JK)%DU(imode) + ! ! Assume edge case not caught. Set m_eff to default (1.0,1.0e-9), same as in ref_idx + ! ! (subroutine problems with inputs SO4 and WATER?) + ! m_eff= Cmplx(1.0,1.0e-9) + ! ! If all edge cases were handled correctly, that should be: + ! !CALL ABOR1("Problem with tm5m7_get_refr_idx" ) + !endif + + ! cmk added towpi for new netcdf lookup table + xg = twopi*aop_in(JL,JK)%rg(imode) / wdep(i)%wl + + !======================================================================= + ! get aerosol optical properties from data base for each mode + !======================================================================= + ! add extra safeguard for negative xg. It is unphysical, but have a safeguard anyway + ! added for refr_idx_nan problem + + if (xg .gt. 0.0) then + call TM5M7_OPTICS_GET(m_eff, xg, Cexti, ai, gi, cext_table, a_table, g_table, statusomp ) + else + Cexti=0.0 + ai=1.0 + gi=1.0 + end if + if (statusomp ==1) then + call ABOR1("ERROR due to TM5M7_OPTICS_GET") + endif + + ! Multiply Cext with lambda^2 to get the cross section. + Cexti = Cexti*(wdep(i)%wl**2) + ! this here is extinction coefficient in this mode + incext(JL,JK) = aop_in(JL,JK)%numdens(imode) * Cexti + ! sum up partial coefficients + PAOP_OUT_EXT(JL,JK,i,1) = PAOP_OUT_EXT(JL,JK,i,1) + incext(JL,JK) + + ! scattering portion + NCscai = ai * incext(JL,JK) + + ! sum up weights for average (both albedo and asymmetry) + NCsca (JL,JK) = NCsca (JL,JK) + NCscai + PAOP_OUT_G(JL,JK,i) = PAOP_OUT_G(JL,JK,i) + NCscai * gi + + END DO + END DO + + ! Split extinction to separate contributions from constituents in modes. + ! A volume mixing is assumed (in contrast to the explicit mixing in get_refr_ind). + if( wdep(i)%split .or. wdep(i)%insitu) then + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + + if (wdep(i)%split) then + + ! The fine-mode contributions to the extinction + ! includes the contributions from particles + ! with (wet) diameters smaller than 1 micron. + ! For wet particles, only part of the accumulation mode + ! should be included, and the coarse mode should be excluded. + if (.not.coarse) then + ! Currently, the contribution of the accumulation mode + ! is approximated using weighting by volume scaling factor modfrac. + ! For extinction, area weighting would probably be more appropriate!! + if (imode .eq. 3 .or. imode .eq. 6 ) then + ! - convert number mean radius to volume mean radius (by cmedr2mmedr(imode)) + ! - 1 micron diameter --> radius is 0.5 microns (rg is also in microns) + modfrac = 0.5 + 0.5 * ERF( log( 0.5 / (aop_in(JL,JK)%rg(imode) * cmedr2mmedr(imode)) ) / & + (sqrt(2.0) * lnsigma(imode)) ) + else + ! Include full nucleation and Aitken mode contributions. + modfrac = 1.0 + endif + PAOP_OUT_EXT(JL,JK,i,10) = PAOP_OUT_EXT(JL,JK,i,10) + modfrac * incext(JL,JK) + endif + ! total volume from so4/no3/bc/oc/ss/du in this mode (ATTENTION: DRY!!) + ! take no3 as so4 + totvoldry = aop_in(JL,JK)%so4(imode)/so4_density + aop_in(JL,JK)%no3(imode)/so4_density + & + aop_in(JL,JK)%bc (imode)/carbon_density + aop_in(JL,JK)%oc (imode)/pom_density + & + aop_in(JL,JK)%soa (imode)/soa_density + & + aop_in(JL,JK)%ss (imode)/ss_density + aop_in(JL,JK)%du (imode)/dust_density + ! check whether there is some volume available + ! otherwise assign zeros to extinction increments + if( totvoldry < tiny(totvoldry) ) then + write(NULOUT,'("WARNING: no volume in mode (",i3,"). assigning zero extinctions")') imode + cycle + end if + ! H2-SO4 contribution + PAOP_OUT_EXT(JL,JK,i,2) = PAOP_OUT_EXT(JL,JK,i,2) + incext(JL,JK) * (aop_in(JL,JK)%so4(imode)/so4_density ) / totvoldry + ! BC contribution + PAOP_OUT_EXT(JL,JK,i,3) = PAOP_OUT_EXT(JL,JK,i,3) + incext(JL,JK) * (aop_in(JL,JK)%bc (imode)/carbon_density) / totvoldry + ! POM contribution + PAOP_OUT_EXT(JL,JK,i,4) = PAOP_OUT_EXT(JL,JK,i,4) + incext(JL,JK) * (aop_in(JL,JK)%oc (imode)/pom_density ) / totvoldry + ! SOA contribution + PAOP_OUT_EXT(JL,JK,i,5) = PAOP_OUT_EXT(JL,JK,i,5) + incext(JL,JK) * (aop_in(JL,JK)%soa (imode)/soa_density ) / totvoldry + ! SS contribution + PAOP_OUT_EXT(JL,JK,i,6) = PAOP_OUT_EXT(JL,JK,i,6) + incext(JL,JK) * (aop_in(JL,JK)%ss (imode)/ss_density ) / totvoldry + ! DU contribution + PAOP_OUT_EXT(JL,JK,i,7) = PAOP_OUT_EXT(JL,JK,i,7) + incext(JL,JK) * (aop_in(JL,JK)%du (imode)/dust_density ) / totvoldry + ! NH4NO3 contribution + PAOP_OUT_EXT(JL,JK,i,8) = PAOP_OUT_EXT(JL,JK,i,8) + incext(JL,JK) * (aop_in(JL,JK)%no3(imode)/so4_density ) / totvoldry + ! Fine-mode contributions for dust and sea salt + if (.not.coarse) then + PAOP_OUT_EXT(JL,JK,i,11) = PAOP_OUT_EXT(JL,JK,i,11) + incext(JL,JK) * (aop_in(JL,JK)%du (imode)/dust_density ) / totvoldry * modfrac + + PAOP_OUT_EXT(JL,JK,i,12) = PAOP_OUT_EXT(JL,JK,i,12) + incext(JL,JK) * (aop_in(JL,JK)%ss (imode)/ss_density ) / totvoldry * modfrac + endif + endif + + ! Water contribution: + ! Get optical properties without water, the difference will be extinction due to + ! water existence + ! - mis-use gi for this + gi = 0.0 + call tm5m7_get_refr_idx( wdep(i), & + aop_in(JL,JK)%SO4(imode),&! + aop_in(JL,JK)%NO3(imode), & + aop_in(JL,JK)%BC (imode), aop_in(JL,JK)%OC (imode), & + aop_in(JL,JK)%SOA(imode), & + aop_in(JL,JK)%SS (imode), aop_in(JL,JK)%DU (imode), & + gi, imode, m_eff) + !if (statusomp ==1) then + ! write (NULERR,'("Problem with GET_REFR_IDX-NAN inputs: ", 9(E16.4,2x))') & + ! aop_in(JL,JK)%SO4(imode), aop_in(JL,JK)%NO3(imode), aop_in(JL,JK)%h2o(imode), & + ! aop_in(JL,JK)%SOA(imode),aop_in(JL,JK)%BC(imode), aop_in(JL,JK)%OC(imode),& + ! aop_in(JL,JK)%SS(imode), aop_in(JL,JK)%DU(imode) + ! ! Assume edge case not caught. Set m_eff to default (1.0,1.0e-9), same as in ref_idx + ! ! (subroutine problems with inputs SO4 and WATER?) + ! m_eff= Cmplx(1.0,1.0e-9) + ! ! If all edge cases were handled correctly, that should be: + ! ! call ABOR1("error in tm5m7_optics_calculate_aop") + ! endif + + ! here we need the dry radius!!! + !>>> TvN + ! 2*pi should be included (see comment above) + !xg = aop_in(JL,JK)%rgd(imode) / wdep(i)%wl + xg = twopi*aop_in(JL,JK)%rgd(imode) / wdep(i)%wl + !<<< TvN + ! TB + ! add extra safeguard for negative xg, unphysical but have a safeguard + ! added for refr_idx_nan problem + if (xg .gt. 0.0) then + call TM5M7_OPTICS_GET(m_eff, xg, Cexti, ai, gi, cext_table, a_table, g_table, statusomp ) + else + Cexti=0.0 + ai=1.0 + gi=1.0 + end if + + if (statusomp ==1) then + call ABOR1("error in tm5m7_optics_calculate_aop") + endif + + Cexti = Cexti*(wdep(i)%wl**2) + + if (wdep(i)%split) then + ! add difference to water subarray + PAOP_OUT_EXT(JL,JK,i,9) = PAOP_OUT_EXT(JL,JK,i,9) + (incext(JL,JK) - aop_in(JL,JK)%numdens(imode) * Cexti) + endif + + if (wdep(i)%insitu) then + ! Surface dry extinction and absorption: + !>>> TvN + ! Remove cut off for the total values: + !modfrac = 0.5 + 0.5 * ERF( log( 5.0 / (aop_in(JL,JK)%rgd(imode) * cmedr2mmedr(imode)) ) / & + ! (sqrt(2.0) * lnsigma(imode)) ) + ! extinction and absorption (extinction-scattering): + !PAOP_OUT_ADD(JL,JK,i,1) = PAOP_OUT_ADD(JL,JK,i,1) + modfrac * aop_in(JL,JK)%numdens(imode) * Cexti + !PAOP_OUT_ADD(JL,JK,i,2) = PAOP_OUT_ADD(JL,JK,i,2) + modfrac * aop_in(JL,JK)%numdens(imode) * Cexti * (1. - ai) + PAOP_OUT_ADD(JL,JK,i,1) = PAOP_OUT_ADD(JL,JK,i,1) + aop_in(JL,JK)%numdens(imode) * Cexti + PAOP_OUT_ADD(JL,JK,i,2) = PAOP_OUT_ADD(JL,JK,i,2) + aop_in(JL,JK)%numdens(imode) * Cexti * (1. - ai) + PAOP_OUT_ADD(JL,JK,i,3) = PAOP_OUT_ADD(JL,JK,i,3) + aop_in(JL,JK)%numdens(imode) * Cexti * ai * gi + ! Add fine-mode contributions + ! For dry aerosol, the fine-mode optical properties include + ! the full accumulation mode, but not the coarse mode: + if (.not.coarse) then + PAOP_OUT_ADD(JL,JK,i,4) = PAOP_OUT_ADD(JL,JK,i,4) + aop_in(JL,JK)%numdens(imode) * Cexti + PAOP_OUT_ADD(JL,JK,i,5) = PAOP_OUT_ADD(JL,JK,i,5) + aop_in(JL,JK)%numdens(imode) * Cexti * (1. - ai) + endif + !<<< TvN + endif + + end do ! JL + end do ! JK + end if + + enddo ! modes + + if (ecearth_units) then + ! return extinction due to absorption + ! and asymmetry factor multiplied by extinction due to scattering + ! and convert um**2/m**3 into 1/m (as for extinction below) + PAOP_OUT_A(KIDIA:KFDIA,1:KLEV,i) = ( PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1) - NCsca(KIDIA:KFDIA,1:KLEV) ) * 1.e-12 + PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) = PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) * 1.e-12 + else + ! return single-scattering albedo and asymmetry factor + ! take into account small extinction values + where( PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1) > tiny(0.0) ) + PAOP_OUT_A(KIDIA:KFDIA,1:KLEV,i) = NCsca(KIDIA:KFDIA,1:KLEV) / PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1) + elsewhere + ! No extinction -> Fill 1.0 for albedo because it looks clean. + PAOP_OUT_A(KIDIA:KFDIA,1:KLEV,i) = 1.0 + endwhere + + ! take into account small extinction values + where( NCsca(KIDIA:KFDIA,1:KLEV) > tiny(0.0) ) + PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) = PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) / NCsca(KIDIA:KFDIA,1:KLEV) + elsewhere + ! No scattering at all -> Fill 1.0 for asymmetry because it looks clean. + PAOP_OUT_G(KIDIA:KFDIA,1:KLEV,i) = 1.0 + endwhere + endif + + ! convert um**2/m**3 into 1/m + PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,:) = PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,:) * 1e-12 + + if( wdep(i)%insitu) then + ! take into account small extinction values + where( PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1) - PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2) > tiny(0.0) ) + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,3) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,3) / (PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1)-PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2)) + elsewhere + ! No scattering at all -> Fill 1.0 for asymmetry because it looks clean. + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,3) = 1.0 + endwhere + + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,1) * 1e-12 + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,2) * 1e-12 + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,4) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,4) * 1e-12 + PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,5) = PAOP_OUT_ADD(KIDIA:KFDIA,1:KLEV,i,5) * 1e-12 + endif + + if( wdep(i)%split .or. wdep(i)%insitu ) then + if (allocated(lnsigma)) deallocate( lnsigma ) + endif + + !======================================================================= + enddo ! loop over wavelengths + + IF (ASSOCIATED(CEXT_TABLE)) NULLIFY(CEXT_TABLE) + IF (ASSOCIATED(A_TABLE)) NULLIFY(A_TABLE) + IF (ASSOCIATED(G_TABLE)) NULLIFY(G_TABLE) + + !do imode = 1,7 + ! print *, 'Radius,mode :', imode, sum(aop_in(KIDIA:KFDIA,1:KLEV)%rg(imode))/((KFDIA-KIDIA+1)*KLEV) + ! print *, 'numden,mode :', imode, sum(aop_in(KIDIA:KFDIA,1:KLEV)%numdens(imode))/((KFDIA-KIDIA+1)*KLEV) + !enddo + + ! deallocate( NCsca, incext ) + + !do i = 1,nwl + ! print *, 'AOD per grid box:', wdep(i)%wl, sum(PAOP_OUT_EXT(KIDIA:KFDIA,1:KLEV,i,1))/((KFDIA-KIDIA+1)*KLEV) + !enddo + + IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_CALCULATE_AOP',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_OPTICS_CALCULATE_AOP diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_get.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_get.F90 new file mode 100644 index 00000000..c88636b4 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_get.F90 @@ -0,0 +1,240 @@ +SUBROUTINE TM5M7_OPTICS_GET(m_eff, xg, Cext, a, g, cext_table, a_table, g_table,status) + +!*** * TM5M7_OPTICS_GET* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !IROUTINE: TM5M7_OPTICS_GET +! +! !DESCRIPTION: Main optical properties routine. Here the interpolated +! values for extinction coefficient, single scattering +! albedo and assymetry parameter are retrieved and returned. +! +!\\ +!\\ + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! +! !REVISION HISTORY: +! +! 12 Aug 2008 - Michael Kahnert, SMHI +! 6 Feb 2011 - Achim Strunk - +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN ,ONLY : NULERR + +USE TM5M7_OPTICS_DATA, ONLY : LKVAL, KVAL,N1R,N_RIR,N_RII,XS,N_X + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + + + +! +! !INPUT PARAMETERS: +! +complex, INTENT(IN) :: m_eff +REAL(KIND=JPRB), INTENT(IN) :: xg +REAL(KIND=JPRB), dimension(:,:,:), INTENT(IN) :: cext_table, a_table, g_table +! +! !OUTPUT PARAMETERS: +! +REAL(KIND=JPRB), INTENT(OUT) :: Cext, a, g +INTEGER(KIND=JPIM), INTENT(INOUT) :: status + + + + + +!* 0.2 LOCAL VARIABLES +! --------------- +REAL(KIND=JPRB) :: n, k, n1, k1, dk1, dk2, lk +REAL(KIND=JPRB) :: modrad, modrad1, dr, dr1, slope, cext1, a1, g1 +INTEGER(KIND=JPIM) :: i +INTEGER(KIND=JPIM) :: i_n, i_k, i_knew + + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',0,ZHOOK_HANDLE) + + + + status = 0 + !FAILS when K=1.00 because kval(15)=1.0 and k.lt.kval(15) false + !k1=15 + + n=real(m_eff) + k=imag(m_eff) + if(k.lt.kval(1))then + k1=kval(1) + i_knew=1 + elseif(k.gt.kval(15))then + k1=kval(15) + i_knew=15 + else + get_k: do i=2,15 + if(k.lt.kval(i))then + dk1=k-kval(i-1) + dk2=kval(i)-k + if(dk1.le.dk2)then + k1=kval(i-1) + i_knew=i-1 + else + k1=kval(i) + i_knew=i + endif + exit get_k + elseif (i==15 .and. abs(kval(i)-k) <1e-20)then + k1=kval(i) + i_knew=i + endif + enddo get_k + endif + lk=-log10(k1) + !#n1=float(int(50*n+0.5))/50. + !do i_n = 1, n_rir + ! if (abs(n1 - n1r(i_n)) < 1e-4) exit + !enddo + + !i_n = 1 + int((n-1.12)*50+0.5) + !AJS: I guess n is a number on the (increasing) n1r axis; search nearest index: + i_n = size(n1r) + do i = 1, size(n1r) + if ( n <= n1r(i) ) then + i_n = i + exit + end if + end do + if ( i_n > 1 ) then + if ( abs(n-n1r(i_n-1)) < abs(n-n1r(i_n)) ) i_n = i_n - 1 + else if ( i_n < n_rir ) then + if ( abs(n-n1r(i_n+1)) < abs(n-n1r(i_n)) ) i_n = i_n + 1 + end if + + do i_k = 1, n_rii + if (abs(lk - lkval(i_k)) < 1e-4) exit + enddo + + ! ! PLS - test : ik can be determined without the preceding loop "do i_k = 1, n_rii" + ! if (i_k.ne.i_knew) then + ! status = 1 + ! write (NULERR,'(" PLSPLS ik NE iknew = ",2(i2,2x))')i_k,i_knew + ! endif + + ! following the "get_k" loop above, the only way to get into this is to + ! have a NaN for k in the first place ? + if (i_k > n_rii) then + status = 1 + write(NULERR,*)'FATAL ERROR: i_k value outside LUT' + write (NULERR,'(" lk = ",E16.4)')lk + write (NULERR,'(" k1 = ",E16.4)')k1 + write (NULERR,'(" k = ",E16.4)')k + write (NULERR,'(" n = ",E16.4)')n + write (NULERR,'(" i_k = ",I6)')i_k + write (NULERR,'(" n_rii = ",I6)')n_rii + + do i_n = 1, 15 + write (NULERR,'(" lkval(",i2,") = ",E16.4)')i_n,lkval(i_n) + ! call goPr + write (NULERR,'(" kval(",i2,") = ",E16.4)')i_n,kval(i_n) + ! call goPr + enddo + + IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',1,ZHOOK_HANDLE) + RETURN + endif + + ! Added check (15-7-2010 - P. Le Sager) + if (i_n > n_rir) then + status = 1 + WRITE(NULERR,*)'FATAL ERROR: i_n value out of range' + IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',1,ZHOOK_HANDLE) + RETURN + endif + + + !>>> TvN + ! Since xs(1) equals zero a problem may occur when xg is negative, + ! because modrad.gt.xg would become true for i=1 in that case, + ! while modrad1, Cext1, a1 and g1 are not yet set. + ! It is not clear if negative xg values can ever occur, + ! but if they do that should be prevented when calculating rg. + ! + ! However, the problem may perhaps already occur + ! when xg equals zero, because of the finite machine precision. + ! + ! In any case, it is desired to initialize modrad1, Cext1, a1 and g1. + ! Cext1, a1 and g1 should be set to their table entries for i=1, + ! which are all zero: + Cext1 = cext_table(1,i_n,i_k) + a1 = a_table(1,i_n,i_k) + g1 = g_table(1,i_n,i_k) + ! modrad1 can be initialized to any value different from xs(1), + ! to prevent division by zero. + modrad1=xs(1)-9.99e-4 + ! This combination will force slope to zero + ! and Cext, a and g to the table entries for i=1 (zero), + ! in case modrad.gt.xg is true for i=1. + !<<< TvN + get_values: do i = 1, n_x + modrad = xs(i) + a = a_table(i,i_n, i_k) + g = g_table(i,i_n, i_k) + cext = cext_table(i,i_n, i_k) + ! With small concentrations, like in the stratosphere, M7 does not trust its radii. + ! See m7_averageproperties -> zinsvol. The M7-radius goes to zero + ! Modrad may never be larger than xg the first time. Modrad1 is not set, + ! will be zero (or something worse) and dr will be zero (or something worse). + ! slope is demolished, makeing all values NaN. Therefore, it is modrad .gt. xg + ! instead of modrad .ge. xg + ! + ! PLS-TRANSLATION - It boils down to: "on the first iteration of this loop, if modrad=xg and + ! you go into the if-statement below, you are in trouble, because modrad1 can be + ! anything. To prevent that, replace GE with GT to avoid going into the if-statement at the + ! first iteration." + ! + if(modrad.gt.xg)then + dr=modrad-modrad1 + dr1=xg-modrad1 + slope=(Cext-Cext1)/dr + Cext=Cext1+slope*dr1 + slope=(a-a1)/dr + a=a1+slope*dr1 + slope=(g-g1)/dr + g=g1+slope*dr1 + exit get_values + endif + modrad1=modrad + Cext1=Cext + a1=a + g1=g + enddo get_values + + + +IF(LHOOK) CALL DR_HOOK('TM5M7_OPTICS_GET',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_OPTICS_GET + diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 new file mode 100644 index 00000000..c7ba73cc --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_optics_init.F90 @@ -0,0 +1,528 @@ +SUBROUTINE TM5M7_OPTICS_INIT(NWAV,WDEP) + +!*** * TM5M7_OPTICS_INIT* +! +! +!----------------------------------------------------------------------------- +! TM5 ! +!----------------------------------------------------------------------------- +!BOP +! +! !MODULE: OPTICS +! +! !DESCRIPTION: Optics module to calculate optical depth from m7 output, +! based on the AOP_Package op Michael Kahnert. +! +! The optics code should be used in the following way (see +! examples in photolysis.F90, ecearth_optics.F90, and +! user_output_aerocom.F90): +! +! 1) prepare the optics calculation by calling +! 'OPTICS_INIT' --> lookuptables etc. +! this routine reads the wavelengths, lookupable and calculates +! refr. indices at these wavelengths. +! +! 2) allocate AOP arrays aop_out_ext/a/g with +! (n_gridcells, n_wavelengths, n_split), with: +! 'n_split' = 1 for (split == .false.) or +! 'n_split' = 11 for (split == .true. ), ie. +! partial contributions by +! Total, SO4, BC, OC, SS, DU, NO3, Water, Fine, Fine Dust, Fine SS +! additional fields are also provided for split==.true. in +! aop_out_add, which has to have size +! (n_gridcells, n_wavelengths, n_add) with nadd = 2 for +! surface PM10 dry extinction and surface PM10 dry absorption +! 3) Compute AOP for current conditions by calling 'OPTICS_AOP_GET' +! 4) done: 'OPTICS_DONE' +! +! IMPORTANT: *) Skipped the ZOOM options! (temporary) +! *) OC is actually POM. Remember converting OC to POM +! when sending it to optics_calculate_aop +!\\ +! +! +!** INTERFACE. +! ---------- +! *TM5M7_OPTICS_INIT* IS CALLED FROM *TM5M7_INIT*. + +! AUTHOR. +! ------- +! +! 6 Feb 2011 - Achim Strunk - worked on DECOUPLING optics routines +! from (optics)_output, in order to +! (re)establish a flexible way of using it +! - remaining parts have been moved to +! (the new routine) user_output_optics +! +! 24 Jun 2011 - Achim Strunk - added NO3 explicitly in order to allow +! for a slightly better split of the +! optical properties of (SO4+NO3) + +! SOURCE. +! ------- +! +! Taken from TM5-code +! +! MODIFICATIONS. +! -------------- +! +! Sep 2021 - V. Huijnen: first introduction into OpenIFS +! +! +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN ,ONLY : NULOUT + +USE YOMCST, ONLY : +USE TM5M7_DATA, ONLY : TM5M7_DATADIR +USE TM5M7_EMIS_DATA, ONLY : +USE TM5M7_OPTICS_DATA, ONLY: WAVELENDEP, N_RIR,N_RII,N_X, & + & lkval, & ! -log img part refr. index + & kval, & ! img part refr. index, 10^(-lkval) + & n1r, & ! real part refr. index + & xs, cext_159, a_159, g_159, cext_200, a_200, g_200, & + & opacdim,echamhamdim,segelsteindim,& + & opac,echamham,segelstein + + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +INTEGER(KIND=JPIM), INTENT(IN) :: NWAV +TYPE(WAVELENDEP), DIMENSION(NWAV), INTENT(INOUT) :: WDEP + + +!* 0.2 LOCAL VARIABLES +! --------------- + + character(len=256) :: lookuptable, refractive_indices + character(len=256) :: CL_FILE_NAME + INTEGER(KIND=JPIM) :: JL + + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT',0,ZHOOK_HANDLE) + + allocate( opac (7, opacdim ) ) + allocate( echamham (5, echamhamdim ) ) + allocate( segelstein(3, segelsteindim) ) + + ! identify filenames from input + lookuptable = "lookup_table.nc" + CL_FILE_NAME = TRIM(TM5M7_DATADIR)//lookuptable + + CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'mr', n_rir,n1r) + CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'mi', n_rii,kval) + CALL LOAD_TM5M7_OPTICS_DATA_1D(CL_FILE_NAME, 'x' , n_x ,xs) + + lkval = -log10(kval) + + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'ext_159', n_x,n_rir,n_rii,cext_159) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'ext_200', n_x,n_rir,n_rii,cext_200) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'a_159', n_x,n_rir,n_rii,a_159) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'a_200', n_x,n_rir,n_rii,a_200) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'g_159', n_x,n_rir,n_rii,g_159) + CALL LOAD_TM5M7_OPTICS_DATA_3D(CL_FILE_NAME, 'g_200', n_x,n_rir,n_rii,g_200) + + refractive_indices = "refractive_indices_hdfstyle.nc" + CL_FILE_NAME = TRIM(TM5M7_DATADIR)//refractive_indices + + CALL LOAD_TM5M7_OPTICS_DATA_2D(CL_FILE_NAME, 'Opac', 7,opacdim,opac) + CALL LOAD_TM5M7_OPTICS_DATA_2D(CL_FILE_NAME, 'ECHAM-HAM', 5,echamhamdim,echamham) + CALL LOAD_TM5M7_OPTICS_DATA_2D(CL_FILE_NAME, 'Segelstein', 3,segelsteindim,segelstein) + + call TM5M7_optics_wavelen_init( wdep,NWAV ) + + write(NULOUT,*) 'Optical parameters:' + do JL = 1, NWAV + write(NULOUT,*) 'Wavelength :', wdep(JL)%wl + write(NULOUT,*) ' SO4 (real/img) :', wdep(JL)%n(1), wdep(JL)%k(1) + write(NULOUT,*) ' BC (real/img) :', wdep(JL)%n(2), wdep(JL)%k(2) + write(NULOUT,*) ' OC (real/img) :', wdep(JL)%n(3), wdep(JL)%k(3) + write(NULOUT,*) ' SOA (real/img) :', wdep(JL)%n(4), wdep(JL)%k(4) + write(NULOUT,*) ' SS (real/img) :', wdep(JL)%n(5), wdep(JL)%k(5) + write(NULOUT,*) ' DU (real/img) :', wdep(JL)%n(6), wdep(JL)%k(6) + write(NULOUT,*) ' H2O (real/img) :', wdep(JL)%n(7), wdep(JL)%k(7) + enddo + + + if (allocated(opac)) deallocate( opac) + if (allocated(echamham)) deallocate( echamham ) + if (allocated(segelstein )) deallocate( segelstein ) + + !-- + + IF(LHOOK) CALL DR_HOOK('TM5_OPTICS_INIT',1,ZHOOK_HANDLE) +CONTAINS + + ! Load an individual field (or receive it from the first + ! MPI task) + SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,KLEN,PVAR) + USE YOMMP0 , ONLY : MYPROC, NPROC + USE MPL_MODULE, ONLY : MPL_BROADCAST + USE YOMTAG , ONLY : MTAGRAD + USE EASY_NETCDF,ONLY : NETCDF_FILE + USE YOMLUN , ONLY : NULERR + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + + IMPLICIT NONE + + ! Full name of the aerosol climatology file + CHARACTER(LEN=*), INTENT(IN) :: CD_FILE_NAME + ! Name of the variable in the file + CHARACTER(LEN=*), INTENT(IN) :: CD_VAR_NAME + ! Expected dimensions for input file + INTEGER(KIND=JPIM), INTENT(IN) :: ILEN,JLEN,KLEN + ! Variable to be filled + REAL(KIND=JPRB), INTENT(OUT) :: PVAR(ILEN,JLEN,KLEN) + + ! Local variable .. + REAL(KIND=JPRB), ALLOCATABLE :: ZVAR(:,:,:) + + + ! The NetCDF file containing the input climatology + TYPE(NETCDF_FILE) :: FILE + + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',0,ZHOOK_HANDLE) + + ! First process actually loads the file - expected 3-dim array. + IF (MYPROC == 1) THEN + CALL FILE%OPEN(TRIM(CD_FILE_NAME), IVERBOSE=4) + CALL FILE%GET(TRIM(CD_VAR_NAME), ZVAR) + CALL FILE%CLOSE() + + ! Check dimensions + IF (SIZE(ZVAR,1) /= ILEN .OR. SIZE(ZVAR,2) /= JLEN & + & .OR. SIZE(ZVAR,3) /= KLEN) THEN + WRITE(NULERR,*) CD_VAR_NAME, 'in', CD_FILE_NAME, 'must be dimensioned (', & + & ILEN, ",", JLEN, ",", KLEN, ")" + CALL ABOR1("Error reading TM5-M7 optics NetCDF file") + ELSE + PVAR(:,:,:)=ZVAR(:,:,:) + ENDIF + ENDIF + + ! If there are more than one processes then broadcast the data + ! (which means receive the data if MYPROC==1) + IF (NPROC > 1) THEN + CALL MPL_BROADCAST(PVAR, MTAGRAD, 1, & + & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D') + ENDIF + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_3D',1,ZHOOK_HANDLE) + + END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_3D + + + + ! Load an individual field (or receive it from the first + ! MPI task) + SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D(CD_FILE_NAME, CD_VAR_NAME, ILEN,JLEN,PVAR) + USE YOMMP0 , ONLY : MYPROC, NPROC + USE MPL_MODULE, ONLY : MPL_BROADCAST + USE YOMTAG , ONLY : MTAGRAD + USE EASY_NETCDF,ONLY : NETCDF_FILE + USE YOMLUN , ONLY : NULERR + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + + IMPLICIT NONE + + ! Full name of the aerosol climatology file + CHARACTER(LEN=*), INTENT(IN) :: CD_FILE_NAME + ! Name of the variable in the file + CHARACTER(LEN=*), INTENT(IN) :: CD_VAR_NAME + ! Expected dimensions for input file + INTEGER(KIND=JPIM), INTENT(IN) :: ILEN,JLEN + ! Variable to be filled + REAL(KIND=JPRB), INTENT(OUT) :: PVAR(ILEN,JLEN) + + ! Local variable .. + REAL(KIND=JPRB), ALLOCATABLE :: ZVAR(:,:) + + + ! The NetCDF file containing the input climatology + TYPE(NETCDF_FILE) :: FILE + + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',0,ZHOOK_HANDLE) + + ! First process actually loads the file - expected 2-dim array. + IF (MYPROC == 1) THEN + CALL FILE%OPEN(TRIM(CD_FILE_NAME), IVERBOSE=4) + CALL FILE%GET(TRIM(CD_VAR_NAME), ZVAR) + CALL FILE%CLOSE() + + ! Check dimensions + IF (SIZE(ZVAR,1) /= ILEN .OR. SIZE(ZVAR,2) /= JLEN) THEN + WRITE(NULERR,*) CD_VAR_NAME, 'in', CD_FILE_NAME, 'must be dimensioned (', & + & ILEN, ",", JLEN, ")" + CALL ABOR1("Error reading TM5-M7 optics NetCDF file") + ELSE + PVAR(:,:)=ZVAR(:,:) + ENDIF + ENDIF + + ! If there are more than one processes then broadcast the data + ! (which means receive the data if MYPROC==1) + IF (NPROC > 1) THEN + CALL MPL_BROADCAST(PVAR, MTAGRAD, 1, & + & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D') + ENDIF + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_2D',1,ZHOOK_HANDLE) + + END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_2D + + + + ! Load an individual field (or receive it from the first + ! MPI task) + SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D(CD_FILE_NAME, CD_VAR_NAME, KLEN,PVAR) + USE YOMMP0 , ONLY : MYPROC, NPROC + USE MPL_MODULE, ONLY : MPL_BROADCAST + USE YOMTAG , ONLY : MTAGRAD + USE EASY_NETCDF,ONLY : NETCDF_FILE + USE YOMLUN , ONLY : NULERR + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + + IMPLICIT NONE + + ! Full name of the aerosol climatology file + CHARACTER(LEN=*), INTENT(IN) :: CD_FILE_NAME + ! Name of the variable in the file + CHARACTER(LEN=*), INTENT(IN) :: CD_VAR_NAME + ! Expected dimension lengths for input file + INTEGER(KIND=JPIM), INTENT(IN) :: KLEN + ! Variable to be filled + REAL(KIND=JPRB), INTENT(OUT) :: PVAR(KLEN) + ! Variable to be filled + REAL(KIND=JPRB), ALLOCATABLE :: ZVAR(:) + + + ! The NetCDF file containing the input climatology + TYPE(NETCDF_FILE) :: FILE + + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',0,ZHOOK_HANDLE) + + ! First process actually loads the file - expected 1-dim array. + IF (MYPROC == 1) THEN + CALL FILE%OPEN(TRIM(CD_FILE_NAME), IVERBOSE=4) + CALL FILE%GET(TRIM(CD_VAR_NAME), ZVAR) + CALL FILE%CLOSE() + ! Check dimensions + IF (SIZE(ZVAR,1) /= KLEN ) THEN + WRITE(NULERR,*) CD_VAR_NAME, 'in', CD_FILE_NAME, 'must be dimensioned (', & + & KLEN, ")" + CALL ABOR1("Error reading TM5-M7 optics NetCDF file") + ELSE + PVAR(:)=ZVAR(:) + ENDIF + ENDIF + + ! If there are more than one processes then broadcast the data + ! (which means receive the data if MYPROC==1) + IF (NPROC > 1) THEN + CALL MPL_BROADCAST(PVAR, MTAGRAD, 1, & + & CDSTRING='TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D') + ENDIF + + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_INIT:LOAD_TM5M7_OPTICS_DATA_1D',1,ZHOOK_HANDLE) + + END SUBROUTINE LOAD_TM5M7_OPTICS_DATA_1D + + !-------------------------------------------------------------------------- + ! TM5 ! + !-------------------------------------------------------------------------- + !BOP + ! + ! !IROUTINE: OPTICS_WAVELEN_INIT + ! + ! !DESCRIPTION: Initialise parameters which are depending on given + ! wavelengths. + !\\ + !\\ + ! !INTERFACE: + ! + SUBROUTINE TM5M7_OPTICS_WAVELEN_INIT( wdep,NWL ) + + USE PARKIND1, ONLY : JPIM,JPRB + USE TM5M7_OPTICS_DATA, ONLY : WAVELENDEP, OPAC,ECHAMHAM,SEGELSTEIN, & + & opacdim, echamhamdim, segelsteindim + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + + IMPLICIT NONE + ! + ! !INPUT/OUTPUT PARAMETERS: + ! + ! wavelength properties (wavelength itself and real/img part of refractive index) + INTEGER(KIND=JPIM), INTENT(IN) :: NWL + type(wavelendep), intent(inout), dimension(NWL) :: wdep + ! + ! + !EOP + !------------------------------------------------------------------------ + !BOC + + INTEGER(KIND=JPIM) :: i, idx + REAL(KIND=JPRB) :: wl, h + REAL(KIND=JPRB) :: nscale, kscale + + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + !----------------------------------------------------------------------- + IF (LHOOK) CALL DR_HOOK('TM5M7_OPTICS_WAVELEN_INIT',0,ZHOOK_HANDLE) + + + + ! Real part n and imaginary part k of refractive index + ! for each wavelength: + + !>>> TvN + ! The refractive index for 'sulfate' is taken from + ! the OPAC database (Hess et al., 1998; + ! Koepke et al., MPI report no. 243, 1997). + ! The value used is that of 'sulfate solution', + ! i.e. particles consisting of 75% of sulfuric acid (H2SO4), + ! based on Fenn et al. (chapter 18 in Handbook of Geophysics + ! and Space Environment, 1985). + ! This is in line with Kinne et al. (JGR, 2003), + ! who write that refractive indices for sulfate + ! are usually based on 75% sulfuric acid solution. + ! Actually, the OPAC refractive index agrees very well + ! with the expression given by Boucher and Anderson (JGR, 1995) + ! for H2SO4 at visible wavelengths. + ! Thus, the OPAC data can be considered to apply to pure H2SO4, + ! which is consistent of our application of mixing rules. + + ! For BC, the OPAC refractive index is scaled to one of + ! the values proposed by Bond and Bergstrom (2006), + ! valid at 550 nm (see their Table 5). + ! Selected values for high, medium and low absorption are + ! 1.95 + 0.79 i, 1.85 + 0.71 i, and 1.75 + 0.63 i, respectively. + ! We select the low-absorption value, + ! because it produces results in best agreement + ! with AAOD from MODIS Collection 6 Deep Blue. + ! Note that the medium-absorption value 1.85 + 0.71 i + ! was used in ECHAM simulations by Stier et al. (2007), + ! and found to give reasonable results. + ! Lowenthal et al. (Atmos. Environ., 2000) + ! give a value of 1.90 + 0.6 i. + ! The reference value used in the scaling + ! is the OPAC value at 550 nm: 1.75 + 0.44 i. + ! It would be better to include the scaling + ! in the input file. + !nscale = 1.0 ! for using OPAC + !kscale = 1.0 ! for using OPAC + !nscale = 1.95/1.75 + !kscale = 0.79/0.44 + nscale = 1.85/1.75 + kscale = 0.71/0.44 + !nscale = 1.75/1.75 + !kscale = 0.63/0.44 + !<<< TvN + + !VH take from input: nwl = size(wdep) + do i = 1, nwl + wl = wdep(i)%wl + + ! Interpolate Opac data + findOpac: Do idx = 1,opacdim + If(opac(1,idx) .gt. wl) exit findOpac + End Do findOpac + If(idx .gt. opacdim) then + idx = opacdim + h = 1.0 + Else If(idx .eq. 1) then + idx = 2 + h = 0.0 + Else + h = (wl-opac(1,idx-1))/(opac(1,idx)-opac(1,idx-1)) + End If + + ! SO4 + wdep(i)%n(1) = opac(2,idx-1)+h*(opac(2,idx)-opac(2,idx-1)) + wdep(i)%k(1) = opac(3,idx-1)+h*(opac(3,idx)-opac(3,idx-1)) + ! BC + !>>> TvN + !wdep(i)%n(2) = opac(4,idx-1)+h*(opac(4,idx)-opac(4,idx-1)) + !wdep(i)%k(2) = opac(5,idx-1)+h*(opac(5,idx)-opac(5,idx-1)) + wdep(i)%n(2) = nscale * ( opac(4,idx-1)+h*(opac(4,idx)-opac(4,idx-1)) ) + wdep(i)%k(2) = kscale * ( opac(5,idx-1)+h*(opac(5,idx)-opac(5,idx-1)) ) + !<<< TvN + ! SS + wdep(i)%n(5) = opac(6,idx-1)+h*(opac(6,idx)-opac(6,idx-1)) + wdep(i)%k(5) = opac(7,idx-1)+h*(opac(7,idx)-opac(7,idx-1)) + + ! Interpolate ECHAM-HAM data + findEchamham: Do idx = 1,echamhamdim + If(echamham(1,idx) .gt. wl) exit findEchamham + End Do findEchamham + If(idx .gt. echamhamdim) then + idx = echamhamdim + h = 1.0 + Else If(idx .eq. 1) then + idx = 2 + h = 0.0 + Else + h = (wl-echamham(1,idx-1))/(echamham(1,idx)-echamham(1,idx-1)) + End If + + ! OC + !>>> TvN + ! The 'ECHAM-HAM' data currently used for POM + ! are based on the data from Fenn et al. (1985) + ! for the 'water soluble' component, + ! but at a reduced number of wavelengths up to 15 um. + ! It would be better to use the original table + ! in the input file. + !<<< TvN + wdep(i)%n(3) = echamham(2,idx-1)+h*(echamham(2,idx)-echamham(2,idx-1)) + wdep(i)%k(3) = echamham(3,idx-1)+h*(echamham(3,idx)-echamham(3,idx-1)) + + + ! SOA + ! >>TB + ! For now (March 2017) we use OC indices for SOA + ! <YDMODEL%YRML_GCONF%YGFL, & + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) +ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, & + & LAERSURF=>YDEAERATM%LAERSURF, & + & NSTART=>YDRIP%NSTART, LCHEM_DIA=>YDCOMPO%LCHEM_DIA, NCHEM=>YGFL%NCHEM ) +! ------------------------------------------------------------------ + +!* 1. PROGNOSTIC AEROSOLS - INITIAL COMPUTATIONS +! ------------------------------------------ + +ZAEROP(:,:,:) = 0.0_JPRB +ZINJF = 0.0_JPRB +LLPRINT=.FALSE. + +ZAEROP(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PCEN(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) +ZTAERI(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) + + +!---- + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZRHO(JL,JK)=PRSF1(JL,JK)/(RD*PTP(JL,JK)) + ZDP(JL,JK)= PRS1(JL,JK) - PRS1(JL,JK-1) + ZDZ(JL,JK)= ZDP(JL,JK) / (ZRHO(JL,JK)*RG) + ENDDO +ENDDO +DO JL=KIDIA,KFDIA + ZALT(JL,KLEV)=PAPHI(JL,KLEV)/RG +ENDDO +DO JK=KLEV-1,0,-1 + DO JL=KIDIA,KFDIA + ZALT(JL,JK)=ZALT(JL,JK+1)+ZDZ(JL,JK+1) + ENDDO +ENDDO + + +! WARNING: This should come from actual M7 aerosol information, +! rather than initialized here. +! Code to be updated once the M7 conversion routine has been introduced +!DO IMODE=1,NMOD +! ALLOCATE(RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)) +! ALLOCATE(DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)) +! +! ! Place holder - to be replaced with actual data using aedensm7 and aeradm7 etc!! +! RW_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV) = 0.1e-6 ! m +! DENS_MODE(IMODE)%d2(KIDIA:KFDIA,1:KLEV)= 1800.0 ! kg/m3! +! +!ENDDO + + +! NB: The physical calculations for the prognostic aerosols are done in a +! sequential mode, with any given process adding its tendency to the +! initial tendency (giving ZTENC), the field itself (ZCEN) remaining +! the same. + + +!-- set all fluxes relevant to surface emissions, dry deposition and sedimentation to zero +IF (.NOT.LAERSURF) THEN + PAERMAP(:,:) =0._JPRB + PAERFLX(:,:,:)=0._JPRB + PAERLIF(:,:) =0._JPRB + PAERDDP(:,:) =0._JPRB + PAERSDM(:,:) =0._JPRB + PAERSRC(:,:) =0._JPRB + ZWND(:) =0._JPRB + DO JAER=1,NACTAERO + DO JL=KIDIA,KFDIA + ZFAERO(JL,JAER) =0._JPRB + PCFLX(JL,KAERO(JAER))=0._JPRB + ENDDO + ENDDO +ELSEIF (LAERSURF) THEN + +!* 2. SURFACE FLUXES OF AEROSOLS +! -------------------------- + +! N.B: COMPUTATIONS USE SURFACE PRECIPITATION AT T-DT + + DO JL=KIDIA,KFDIA +! ZWND(JL)=SQRT(PUP(JL)*PUP(JL)+PVP(JL)*PVP(JL)) + ZWND(JL)=PAERWS(JL) + PLDAY(JL)=0._JPRB + PLISS(JL)=0._JPRB + PSO2(JL) =0._JPRB + PTDMS(JL)=0._JPRB + PODMS(JL)=0._JPRB + ENDDO + +! DO JTILE=1,KTILES +! write(8000+MYPROC,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE),PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) + !write(3334,*)jtile,jl,PFRTI(JL,JTILE),PAHFSTI(JL,JTILE) +!end DO + + CALL TM5M7_SRC & + &( YDGEOMETRY, YDMODEL, KIDIA , KFDIA , KLON , KTDIA, KLEV , KTILES, NSTART, NSTEP , KSTGLO, & + & KSW , KTRAC , KAERO, & + & PALB , PALBD , PAPHI , & + & PAERDEP,PAERLTS, PAERSCC, PAERGUST, ZALT, & + & PRS1 , PRSF1 , PCI , PCLAKE, ZINJF, PBLH, ZDP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & + & PLSM , PSST , PQP , ZRHO , PSNS , PTP , PTL , PTSPHY, PZ0M, KCHEM, & + & ZWND , PWSA1 , PSOIL_TYPE, & + & PCVL , PCVH, KTVL, KTVH, & + & PLDAY , PAERFLX, PCFLX, PCEN , PTENC, ZEMIDIAG, PSO2SRC,PSO4SRC, GPGAW) + + +! sea salt and desert dust fluxes in kg m-2 s-1, thus: +! dynamics, vert.diff, convection see mixing ratio in kg kg-1 (PCEN, ZAEROP) +! and corresponding tendencies ZTENC are in kg kg-1 s-1 + + DO JAER=1,NACTAERO + DO JL=KIDIA,KFDIA + PAERSRC(JL,JAER)=ZEMIDIAG(JL,JAER) !PCFLX(JL,KAERO(JAER)) + ! add SO2 and SO4 production for diagnostics in case of simple sulfur chemistry + ENDDO + ENDDO + ! collect distributed fluxes + IF (LCHEM_DIA) THEN + CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & + & ZDP, PTSPHY, PTENC(:,:,KAERO(1):KAERO(NACTAERO)) , ZTAERI, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_EM)) + ENDIF + +!* 3. DRY DEPOSITION INCLUDED AS MODIFICATION TO SURFACE FLUXES +! --------------------------------------------------------- + +! +! IF (LAERDRYDP) THEN +! +! ! Compute relative humidity +! IFLAG=2 +! CALL SATUR (KIDIA , KFDIA , KLON , KTDIA , 1,& +! & PRSF1(:,KLEV), PTP(:,KLEV) , ZQSAT(:,1) , IFLAG) +! +! DO JL=KIDIA,KFDIA +! ZRHCL(JL)=PQP(JL,KLEV)/(MAX(1.E-30_JPRB, ZQSAT(JL,1))) +! ENDDO +! +! +!!-- Dry deposition is applied to all aerosols. +! +! ZTENCI(KIDIA:KFDIA, 1:KLEV,:)=PTENC(KIDIA:KFDIA,1:KLEV,:) +! +! ! Compute average fluxes over tiles +! DO JTILE=1,KTILES +! ZAHFSM(JL)=ZAHFSM(JL)+PFRTI(JL,JTILE)*PAHFSTI(JL,JTILE) +! ENDDO +! +! CALL TM5M7_DRYDEP ( & +! & KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & +! & PTSPHY, ZTENCI, PTP(:,KLEV) , PRSF1 , PRS1, ZWND, & +! & PLSM, PCI,PAERUST,PZ0M,ZRHCL,PGEOH, ZDZ(:,KLEV), & +! & ZAHFSM, PAHFLEV, & +! & RW_MODE, DENS_MODE, PCEN, & +! & PAERDDP, PTENC,ZVDA) +! +! +! ! Compute dry deposition budgets +! IF (LCHEM_DIA) THEN +! CALL CHEM_INEXT(KIDIA, KFDIA, KLON, KLEV, NACTAERO, NACTAERO , & +! & ZDP, PTSPHY, PTENC(:,:, KAERO(1):KAERO(NACTAERO)), ZTENCI(:,:,KAERO(1):KAERO(NACTAERO)),PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_DD) ) +! ENDIF +! +! ! Output deposition velocity fields.. +! !IF(LCHEM_JOUT) THEN +! ! DO JK=1,KLEV +! ! DO JL=KIDIA,KFDIA +! ! PEXTRA(JL,JK,2)=ZVDA(JL,JK) +! ! ENDDO +! ! ENDDO +! !ENDIF +! +! +!!-- The dry deposition at the surface has been explicitly computed, and the +!! tendency in the first layer above the surface is to be updated. The +!! emission flux is kept untouched. +! +!!VH DO JAER=1,NACTAERO +!!VH DO JL=KIDIA,KFDIA +!!VH PAERDDP(JL,JAER)=ZFDRYD(JL,JAER) +!!VH ENDDO +!!VH ENDDO +!!VH !-- update tendencies +!!VH PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) = ZTAERO(KIDIA:KFDIA,1:KLEV,1:NACTAERO) +! +! ENDIF ! LAERDRYDP + +ENDIF + +!!* 4. SEDIMENTATION OF AEROSOLS +!! ------------------------- +! +!IF (LAERSEDIM) THEN +! +!ZTAERI(KIDIA:KFDIA,1:KLEV,1:NACTAERO) = PTENC(KIDIA:KFDIA,1:KLEV,KAERO(1):KAERO(NACTAERO)) +! +!CALL TM5M7_SEDIMENT & +! & ( KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & +! & PTSPHY, PTP , PRSF1 , PRS1, & +! & RW_MODE, DENS_MODE, PCEN, & +! & PAERSDM, PTENC) +! +!! collect distributed fluxes - should really be given its own budget accumulator, and not combined with dry dep.. +! IF (LCHEM_DIA) THEN +! CALL CHEM_INEXT( KIDIA , KFDIA , KLON , KLEV , NACTAERO, NACTAERO , & +! & ZDP, PTSPHY, PTENC(:,:,KAERO(1):KAERO(NACTAERO)) , ZTAERI, PEXTRA(:,NCHEM+1:NCHEM+NACTAERO,IEXTR_DD)) +! ENDIF +! +! +!ELSE +!!-- If sedimentation is not called, tendencies after dry depo. stay the same. +! DO JL=KIDIA,KFDIA +! PAERSDM(JL,:)=0._JPRB +! ENDDO +!ENDIF + + +! Deallocate.. Here?? +!DO IMODE=1,NMOD +! DEALLOCATE(RW_MODE(IMODE)%d2) +! DEALLOCATE(DENS_MODE(IMODE)%d2) +!ENDDO + +!----------------------------------------------------------------------- +END ASSOCIATE +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_PHY2',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_PHY2 diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_sediment.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_sediment.F90 new file mode 100644 index 00000000..45f07235 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_sediment.F90 @@ -0,0 +1,360 @@ +SUBROUTINE TM5M7_SEDIMENT & + !---input + & ( KIDIA , KFDIA , KLON, KLEV, KTRAC, KAERO , & + & PTSPHY, PT , PAP , PAPH, & + !---prognostic fields + & RW_MODE, DENS_MODE, PCEN, & + !---output + & PFLUXAER, PTENC) + +!**** *TM5M7_SEDIMENT* - ROUTINE FOR PARAMETRIZATION OF TM5M7 AEROSOL SEDIMENTATION +! +! !DESCRIPTION: This module calculates sedimentation of aerosol particles. +! Also the deposition at the surface is calculated here since +! it uses similar routines. +! +! It is assumed that the distribution is described by nmodes log-normal +! distributions +! +! Each mode has a number and mass and a sigma_lognormal. Number and mass are +! related and the mean aerosol radius can thus be calculated for each mode. +! +! mass=pi*4./3.*radius**3.*number*exp(9./2.*ln2s) /1e18*density, with: +! +! density = density of aerosol type +! ln2s = (log(sigma_lognormal(mode)))**2 +! mass = mode mass +! number = mode number +! +! mode1 : accumulation +! mode2 : coarse +! mode3 : super coarse (ss) coarse +! +! For each mode a separate fall velocity is calculated according to the mass +! and number mean radii. Water take-up by seasalt particles is taken into +! account. This changes the density, radius, and sigma of the distribution. +! +! Also included is the deposition calculation. based on a lookup table +! calculated for a reference aerosol density (e.g. 1800 kg/m3) and a number of +! radii. This deposition curve is convoluted with the number/volume +! distribution of the aerosols. +! + +! Again, for SS the water takeup is accounted for, and the effects on density, +! sigma and radius are calculated. The density has effect on the impaction +! term is the depotion calculation. This can be modeled by a shift in the +! radius. Thus the radii of the lookup table are adapted for density +! differences when impaction becomes important. + +!** INTERFACE. +! ---------- +! *TM5M7_SEDIMENT* IS CALLED FROM *TM5M7_PHY2*. + +! INPUTS: +! ------- +! PTSPHY : TIMESTEP (s) +! PAP (KLON,KLEV) : LEVEL PRESSURE (Pa) +! PAPH (KLON,KLEV+1) : HALF-LEVEL PRESSURE (Pa) +! PCI (KLON) : FRACTION OF SEA ICE +! PLSM (KLON) : LAND-SEA MASK +! PT (KLON,KLEV) : LEVEL TEMPERATURE (K) +! PCEN (KLON,KLEV,KTRAC) : CONCENTRATION OF TRACERS (xx kg-1) + +! OUTPUTS: +! -------- +! PTENC (KLON,KLEV,KTRAC) : TENDENCY (xx kg-1 s-1) + +! EXTERNALS. +! ---------- +! NONE + +! MODIFICATIONS. +! ------------- + +! SWITCHES. +! -------- + +! MODEL PARAMETERS +! ---------------- + +!----------------------------------------------------------------------- +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK + +USE YOEAERSRC ,ONLY : YREAERSRC +USE YOEAERSNK ,ONLY : YREAERSNK +USE YOMCST ,ONLY : RG, RD,RNAVO +USE YOM_YGFL ,ONLY : YGFL +USE TM5M7_DATA, ONLY : NMOD, MODE_NM_SED, mode_tracers_sed, XMAIR,MODAL_DATA, & + & SIGMA_LOGNORMAL + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- + +!---input fields +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YGFL%NAERO) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PT(KLON,KLEV) ! Temp +REAL(KIND=JPRB) ,INTENT(IN) :: PAP(KLON,KLEV)! Mid-lev pres +REAL(KIND=JPRB) ,INTENT(IN) :: PAPH(KLON,KLEV+1) ! interface pres +!REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(KLON,KLEV) +!REAL(KIND=JPRB) ,INTENT(IN) :: PTAERI(KLON,KLEV) +TYPE(MODAL_DATA) ,INTENT(IN) :: RW_MODE(NMOD) +TYPE(MODAL_DATA) ,INTENT(IN) :: DENS_MODE(NMOD) + +REAL(KIND=JPRB) ,INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) +!---output fields +REAL(KIND=JPRB) ,INTENT(OUT) :: PFLUXAER(KLON,YGFL%NACTAERO) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) + + +!---local fields +REAL(KIND=JPRB) :: TEMP, PB, DP, ZVIS, RHO_AIR, TO_PASCAL,RADIUS,DPG,VT +REAL(KIND=JPRB) :: ZSEDFLX(KLON), ZAERONWM1(KLON), ZAERI(KLON,KLEV), & + & ZSOLAERS, ZSOLAERB, ZGDP, ZDTGDP, ZKK, & + & SIGMA, LNSIGMA,DENSITY,SLINNFAC, & + & ZRHO, ZAERONW +INTEGER(KIND=JPIM) :: JK, JL, JN, MODE, IMODE, INMODE +INTEGER(KIND=JPIM), PARAMETER :: ndp = 3 ! limit of the velocity to ndp times the layer thickness + ! iteration will account for a fall length through multiple layers + +REAL(KIND=JPRB) :: m_to_pa !factor from m/s --> Pa/s + +REAL(KIND=JPRB),DIMENSION(:,:),POINTER :: VS + +! Arrays to collect sedimentation velocities +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: VN_SEDIMENTATION +TYPE(MODAL_DATA), DIMENSION(NMOD), TARGET :: VM_SEDIMENTATION + + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SEDIMENT',0,ZHOOK_HANDLE) + + +m_to_pa = 7.24e16*RG*xmair*1e3/RNAVO !factor from m/s --> Pa/s + +!- PAERO in unit of xx kg-1 (mixing ratio) +!- ZAERONW in unit of xx kg-1 +!- ZSOLAERS, ZSOLAERB in xx kg-1 as m s-2/DeltaP xx m-2 = m s-2/(kg m-1 s-2) xx m-2 +!- ZSEDFLX in unit of xx m-2 +!- ZRHO in unit of kg m-3 +!- v[n|m]_sedimentation in unit of m s-1 speed + + +DO IMODE=1,NMOD + ALLOCATE(VN_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,KLEV)) + ALLOCATE(VM_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,KLEV)) + + VN_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=0.0_JPRB + VM_SEDIMENTATION(IMODE)%d2(KIDIA:KFDIA,1:KLEV)=0.0_JPRB +ENDDO + +! Loop over levels +do JK=2, KLEV + + + do JL=KIDIA, KFDIA + + if(JK == KLEV) then + temp = PT(JL,KLEV) ! at surface to temp box + else + temp = 0.5*(PT(JL,JK)+PT(JL,JK+1)) ! interpolate to bottom of box + endif + + pb = PAPH(JL,JK) ! pressure at bottom of box (Pa) + dp = PAPH(JL,JK)-PAPH(JL,JK-1) ! layer thickness + zvis = 0.0000014963*temp*sqrt(temp)/(temp+120.) ! viscosity (kg/ms) + rho_air = 7.24e16*pb/temp * xmair*1e3/RNAVO ! kg/m3 + to_pascal = m_to_pa*pb/temp ! convert from m/s ---> Pa/sec + + M7MODES: do mode = 1, nmod + + radius = rw_mode(mode)%d2(JL,JK) + + sigma = sigma_lognormal(mode) + lnsigma = log(sigma) + density = dens_mode(mode)%d2(JL,JK) + + slinnfac = exp(2.0*lnsigma*lnsigma) + + + ! for number: take first mode (Seinfeld, 1986, pg 286) + dpg = radius*2.0*exp(lnsigma*lnsigma) ! diameter in m + vt = TM5M7_fall1(pb,Dpg,zvis,temp,rho_air,density) + + + !VH vn_sedimentation(mode)%d2(JL,JK) = min(to_pascal*vt,ndp*dp) ! in Pa/sec downwards + vn_sedimentation(mode)%d2(JL,JK) = vt ! in m/sec downwards + + !VH if(JK == KLEV) then + !VH vn_sedimentation_mean%surf(JL,mode) = & + !VH vn_sedimentation_mean%surf(JL,mode) + vt + !VH endif + + ! for mass: the third moment + dpg = radius*2.0*exp(3*lnsigma*lnsigma) ! diameter in m + vt = TM5M7_fall1(pb,Dpg,zvis,temp,rho_air,density) + + + !VH vm_sedimentation(mode)%d2(JL,JK) = min(to_pascal*vt*slinnfac,ndp*dp) ! multiply with slinnfac + vm_sedimentation(mode)%d2(JL,JK) = vt*slinnfac ! multiply with slinnfac + + !VH if(JK == KLEV) then + !VH vm_sedimentation_mean%surf(JL,mode) = & + !VH vm_sedimentation_mean%surf(JL,mode) + vt*slinnfac + !VH endif + + enddo M7MODES + enddo ! JL +enddo ! LEVS + + + +! Compute corresponding tendencies +! ================= +! Loop over tracers +! ================= +do mode =1,nmod + !do inmode=0,mode_nm(mode) + do inmode=0,mode_nm_sed(mode) + + JN = mode_tracers_sed(inmode,mode) + + !------------- reset + NULLIFY(VS) + if (inmode == 0) then ! number or mass tracer + vs => vn_sedimentation(mode)%d2 + else + vs => vm_sedimentation(mode)%d2 + endif + + + !--initialisations of variables carried out from one layer to the next layer + !--actually not needed if (JK>1) test is on + ZSEDFLX(KIDIA:KFDIA)=0.0_JPRB + ZAERONWM1(KIDIA:KFDIA)=0.0_JPRB + + DO JK=1, KLEV + + DO JL=KIDIA, KFDIA + !--initialisations + ZSOLAERS=0.0 + ZSOLAERB=0.0 + ZGDP=RG/(PAPH(JL,JK+1)-PAPH(JL,JK)) + ZDTGDP=PTSPHY*ZGDP + + !- Starting point is input concentration field + + ZAERI(JL,JK) = PCEN(JL,JK,KAERO(JN)) + + ! (Or: apply intermediate tendencies??) + ! ZAERI(JL,JK) = PCEN(JL,JK,KAERO(JN)) + PTSPHY * PTAERI(JL,JK,KAERO(JN)) + ! with PTAERI containing the tendencies from dry deposition + + ! source from above + IF (JK>1) THEN + ZSEDFLX(JL)=ZSEDFLX(JL)*ZAERONWM1(JL) + ZSOLAERS=ZSOLAERS+ZSEDFLX(JL)*ZDTGDP + ENDIF + + ! sink to next layer + ZRHO=PAP(JL,JK)/(RD*PT(JL,JK)) + ZSEDFLX(JL)=VS(JL,JK)*ZRHO + ZSOLAERB=ZSOLAERB+ZDTGDP*ZSEDFLX(JL) + + !---implicit solver + ZAERONW=(ZAERI(JL,JK)+ZSOLAERS)/(1.0_JPRB+ZSOLAERB) + + !---new time-step AER variable needed for next layer + ZAERONWM1(JL)=ZAERONW + + !---tendency in unit of xx kg-1 s-1 + PTENC(JL,JK,KAERO(JN))=PTENC(JL,JK,KAERO(JN))+(ZAERONW-ZAERI(JL,JK))/PTSPHY + ! + ENDDO + ENDDO + + !---sedimentation flux to the surface + !---ZAERONWM1 now contains the surface concentration at the new timestep + !---PFLUXAER in unit of xx m-2 s-1 + DO JL=KIDIA,KFDIA + ZRHO=PAP(JL,KLEV)/(RD*PT(JL,KLEV)) + PFLUXAER(JL,JN)=ZRHO*ZAERONWM1(JL)*VS(JL,KLEV) + ENDDO + + enddo ! loop over tracers in mode +enddo ! loop over modes + + + +DO IMODE=1,NMOD + IF(ASSOCIATED(VN_SEDIMENTATION(IMODE)%d2)) DEALLOCATE(VN_SEDIMENTATION(IMODE)%d2) + IF(ASSOCIATED(VM_SEDIMENTATION(IMODE)%d2)) DEALLOCATE(VM_SEDIMENTATION(IMODE)%d2) +ENDDO + + + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SEDIMENT',1,ZHOOK_HANDLE) +CONTAINS + + + + ! !IROUTINE: TM5M7_FALL1 + ! + ! !DESCRIPTION: function to calculate the fall velocity from the particle + ! diameter, as a function of density, temperature and pressure. + !\\ + !\\ + ! !INTERFACE: + ! + REAL(KIND=JPRB) FUNCTION TM5M7_FALL1( press, zmd, zvis, t, zdensair, densaer_p) result(vt) + ! + ! !INPUT PARAMETERS: + ! + REAL(KIND=JPRB), INTENT(IN) :: press ! pressure in Pa (or bar?) + REAL(KIND=JPRB), INTENT(IN) :: zmd ! median radius of aerosol (m) + REAL(KIND=JPRB), INTENT(IN) :: zvis ! viscosity (kg/(sm)) + REAL(KIND=JPRB), INTENT(IN) :: t ! temperature (K) + REAL(KIND=JPRB), INTENT(IN) :: zdensair ! density air (kg/m3) + REAL(KIND=JPRB), INTENT(IN) :: densaer_p ! density aerosol particles (kg/m3) + ! + ! !REVISION HISTORY: + ! 2 Apr 2010 - P. Le Sager - + ! + ! !REMARKS: + ! Called in Sedimentation_Apply, only if m7 used. + ! + !EOP + !------------------------------------------------------------------------------ + !BOC + + REAL(KIND=JPRB) :: zlair + + ! ----------- start + if (zmd > tiny(zmd)) then + vt=2./9.*(densaer_p-zdensair) * RG/zvis*(zmd/2.)**2. + + zlair=0.066*(1.01325e5/press)*t/293.15*1e-6 + + !--- With cunnigham slip- flow correction (S&P, Equation 8.34): + + vt = vt * (1.+ 1.257*zlair/zmd*2. + 0.4*zlair/zmd*2. * exp(-1.1/(zlair/zmd*2.)) ) + else + vt = 0.0 + endif + + END FUNCTION TM5M7_FALL1 + + +END SUBROUTINE TM5M7_SEDIMENT diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 new file mode 100644 index 00000000..de405e3a --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src.F90 @@ -0,0 +1,512 @@ +SUBROUTINE TM5M7_SRC( & + & YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV, KTILES, KSTART, KSTEP ,KSTGLO, & + & KSW , KTRAC, KAERO, & + & PALB , PALBD, PAPHI , & + & PAERDEP, PAERLTS, PAERSCC, PAERGUST, PALTH , & + & PAPH , PAP , PCI , PCLAKE, PINJF, PBLH, PDELP, PGELAM, PGELAT, PGEMU, PFRTI, PHSDFOR, & + & PLSM , PSST , PQ , PRHO , PSNS , PT , PTL , PTSPHY, PZ0M, KCHEM, & + & PWIND, PWS1 ,PSOIL_TYPE, & + & PCVL, PCVH, KTVL, KTVH, & + & PLDAY, PAERFLX, PCFLX, PCEN , PTENC, PEMIDIAG, PSO2SRC,PSO4SRC, GPGAW) + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 03-Jun-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *tm5m7_src* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *TM5M7_SRC* IS CALLED FROM *TM5M7_PHY2" │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: │ +! │ Vicent Huijen (KNMI) - 2020-08-25 │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ + + + +! IFS model -------------------------------------------------------------------- + +USE GEOMETRY_MOD, ONLY : GEOMETRY +USE TYPE_MODEL, ONLY : MODEL +USE PARKIND1, ONLY : JPIM, JPRB, JPRD +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY : NULOUT, NULERR +USE YOMCST, ONLY : RA, RPI, RDAY, RG +USE YOMRIP0, ONLY : NINDAT, NSSSSS +USE YOEDUST, ONLY : YDUSTCLIM !(soiltype. soil ph ..ect) + +! M7 modules ------------------------------------------------------------------- + +USE TM5M7_DATA , ONLY : NMOD, MODE_NM, MODE_NM_SED, MODE_TRACERS_SED, & + & xmc, sigma_lognormal, pom_density, carbon_density, & + & mode_aii, mode_ais, mode_acs, mode_aci,iduai,iaii_n, & + & INO3_A, INH4,IMSA, issacs, isscos, iduaci, iducoi, & + & iaci_n, iacs_n, icoi_n, icos_n, mode_cos, mode_coi +USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, & + & rad_emi_ff_insol, rad_emi_ene_insol,rad_emi_ind_insol, & + & rad_emi_tra_insol, rad_emi_shp_insol,rad_emi_air_insol, & + & rad_emi_bf_insol, rad_emi_bb_insol, & + & rad_emi_ff_sol, rad_emi_ene_sol,rad_emi_ind_sol, & + & rad_emi_tra_sol, rad_emi_shp_sol,rad_emi_air_sol, & + & rad_emi_bf_sol, rad_emi_bb_sol, & + & frac_pom_sol_bf, frac_pom_sol_bb, frac_pom_sol_ff, & + & frac_bc_sol_bf, frac_bc_sol_bb, frac_bc_sol_ff +USE OIFS_TO_HAM, ONLY: ind_oifs_ham !% ind_gas_OIFS + +IMPLICIT NONE + +!----------------------------------------------------------------------- +!* 0.1 ARGUMENTS +! --------- + +TYPE(GEOMETRY), INTENT(IN) :: YDGEOMETRY +TYPE(MODEL), INTENT(INOUT) :: YDMODEL +INTEGER(KIND=JPIM), INTENT(IN) :: KLON, KIDIA, KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV, KTDIA, KSTGLO +INTEGER(KIND=JPIM), INTENT(IN) :: KTILES +INTEGER(KIND=JPIM), INTENT(IN) :: KSTEP, KSTART +INTEGER(KIND=JPIM), INTENT(IN) :: KSW +INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM), INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) + +REAL(KIND=JPRB), INTENT(IN) :: GPGAW(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) +REAL(KIND=JPRB), INTENT(IN) :: PAPHI(KLON,0:KLEV), PALTH(KLON,0:KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PAERDEP(KLON), PAERLTS(KLON), PAERSCC(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAERGUST(KLON), PHSDFOR(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV), PAPH(KLON,0:KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON), PGELAT(KLON), PGEMU(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PFRTI(KLON,KTILES) +REAL(KIND=JPRB), INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PINJF(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PBLH(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PDELP(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV), PRHO(KLON,KLEV), PSNS(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN) :: PTL(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWS1(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PSOIL_TYPE(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PTSPHY +REAL(KIND=JPRB), INTENT(IN) :: PZ0M(KLON) +INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) + +! RCHG -> try to understand what is 12 and 9 here. +REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) +REAL(KIND=JPRB), INTENT(INOUT) :: PCFLX(KLON,KTRAC) + +REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover +INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type + +REAL(KIND=JPRB), INTENT(INOUT) :: PCEN(KLON,KLEV,KTRAC) +REAL(KIND=JPRB), INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) +REAL(KIND=JPRB), INTENT(INOUT) :: PLDAY(KLON) +REAL(KIND=JPRB), INTENT(INOUT) :: PEMIDIAG(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB), INTENT(INOUT) :: PSO4SRC(KLON,KLEV),PSO2SRC(KLON,KLEV) + +!* 0.5 LOCAL VARIABLES +! --------------- + +REAL(KIND=JPRB) :: ZBCBF(KLON), ZBCFF(KLON), ZBCGF(KLON) ! BC related +REAL(KIND=JPRB) :: ZOMBF(KLON), ZOMFF(KLON), ZOMGF(KLON) ! OM related +INTEGER(KIND=JPIM) :: JAER, JK, JL, IMODE, INMODE, JN, II, JGAS +INTEGER(KIND=JPIM) :: IGLGLO, IHTST +! soiltype. soil ph ..etc +REAL(KIND=JPRB) :: ISOILTYPE(KLON) +REAL(KIND=JPRB) :: ISOILPH1(KLON), ISOILPH2(KLON), ISOILPH3(KLON), ISOILPH4(KLON), ISOILPH5(KLON), & + & IZ0AM(KLON), IPOTSRC(KLON), IAREA(KLON), ICULT(KLON) +REAL(KIND=JPRB) :: IZ0M(KLON), IFPAR(KLON) +REAL(KIND=JPRB) :: ILAI_MAX(KLON), ILAI_AVG(KLON) + +! TM5-M7 data + +! Arrays to collect emissions +TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_MASS +TYPE(MODAL_EMISSIONS), DIMENSION(NMOD), TARGET :: EMIS_NUMBER + +REAL(KIND=JPRB) :: ZAEROCLIS(KLON,KLEV,2) +REAL(KIND=JPRB) :: ZCFLX(KLON,KTRAC) +REAL(KIND=JPRB) :: ZFAERO(KLON,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) +REAL(KIND=JPRB) :: ZTAEROK(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NACTAERO) + +REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON) +REAL(KIND=JPRB) :: ZHDD, ZHSS +REAL(KIND=JPRB) :: ZDETAH(KLON,KLEV), ZETA(KLON,KLEV) , ZETAH(KLON,0:KLEV) + +!-- various sources +REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) +REAL(KIND=JPRB) :: ZWNDDU(KLON), ZWNDSS(KLON) +REAL(KIND=JPRB) :: ZDEGRAD +REAL(KIND=JPRB) :: ZRWPWP , ZRWSAT + +!-- volcano-related variables +INTEGER(KIND=JPIM) :: IYY, IMM, IDD, IMDATE +INTEGER(KIND=JPIM) :: IY0, IM0, ID0, INC, IMON(12) + +REAL(KIND=JPRB) :: ZGRDLON(KLON) , ZGELAT(KLON), ZGDLAT(KLON), ZGDLON(KLON) +REAL(KIND=JPRB) :: ZDLAT, ZDLON +REAL(KIND=JPRB) :: ZGRDLAT, ZGRDLAT2, ZGRDLON2, ZINCLAT, Z1GP + +!-- map +REAL(KIND=JPRB) :: ZLAT, ZLON + +!-- QnD oceanic DMS +REAL(KIND=JPRB) :: ZCOS0, ZSIN0, ZRAD2DEG +REAL(KIND=JPRB) :: ZGEMU(KLON), ZLATK(KLON) + + + +REAL(KIND=JPRB) :: FRAC_BF(KLON), EMIT(KLON,KLEV) + +INTEGER(KIND=JPIM) :: ISSO2, ISSO4 +REAL(KIND=JPRB) :: ZDELP + +!RCHG -> try to understand what is 5 here +REAL(KIND=JPRB) :: ZAERMAP(KLON,5) +#ifdef __PGI +REAL(KIND=JPRB) :: ERF +#else +INTRINSIC ERF +#endif + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!----------------------------------------------------------------------- + +#include "updcal.intfb.h" +#include "fcttim.func.h" + +#include "surf_inq.h" + +#include "tm5m7_src_ss.intfb.h" +#include "tm5m7_src_dust.intfb.h" +!#include "satur.intfb.h" +!#include "aer_volce.intfb.h" +!#include "aer_stratcl.intfb.h" + +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',0,ZHOOK_HANDLE) + +!----------------------------------------------------------------------- +ASSOCIATE(& + & YDCSGLEG => YDGEOMETRY%YRCSGLEG, & + & YDEPHY => YDMODEL%YRML_PHY_EC%YREPHY, & + & YDEAERMAP => YDMODEL%YRML_PHY_AER%YREAERMAP, & + & YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDCOMPO => YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC => YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDRIP => YDMODEL%YRML_GCONF%YRRIP) + +ASSOCIATE(& + & YAERO => YGFL%YAERO, NACTAERO => YGFL%NACTAERO, & + & NAERO => YGFL%NAERO, NDGLG => YDGEOMETRY%YRDIM%NDGLG, & + & RHGMT => YDRIP%RHGMT, RSTATI => YDRIP%RSTATI, & + & RSIDECA => YDEAERSRC%RSIDECA, NAERWND => YDEAERSRC%NAERWND, & + & RSIVSRA => YDEAERSRC%RSIVSRA, RCODECA => YDEAERSRC%RCODECA, & + & RCOVSRA => YDEAERSRC%RCOVSRA, & + & NLOENG => YDGEOMETRY%YRGEM%NLOENG, NGLOBALAT => YDGEOMETRY%YRMP%NGLOBALAT,& + & LVDFTRAC=> YDEPHY%LVDFTRAC, & + & YSURF => YDEPHY%YSURF, LAERCHEM => YGFL%LAERCHEM) + +ASSOCIATE(NDDUST => YDEAERSRC%NDDUST) + +!VH maybe 43r3, only?? +!& LAERODIU=>YDCOMPO%LAERODIU, YAERO=>YGFL%YAERO, LFIRE=>YDCOMPO%LFIRE, LINJ=>YDCOMPO%LINJ, & + +! N.B.: In ECMWF model conventions, flux going upward from the surface +! are negative +! All surface fluxes PCFLUX in kg m-2 s-1 +! PGEMU : SINLAT PGELAT(KLON) : LATITUDE (RADIANS) +! PGELAM : LONGITUDE (RADIANS) + +!----------------------------------------------------------------------- + +!* 0.1 TIME AND DATE OF THE MODEL +! -------------------------- +IY0=NCCAA(NINDAT) +IM0=NMM(NINDAT) +ID0=NDD(NINDAT) +INC=(NSSSSS + NINT(RSTATI)/NINT(RDAY)) +CALL UPDCAL(ID0, IM0, IY0, INC, IDD, IMM, IYY, IMON, -1) +IMDATE=IYY*10000+IMM*100+IDD +ZRAD2DEG = 180._JPRB/RPI +! +!* 0.2 A LENGTH OF DAY INDEX +! --------------------- +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + ZGEMU(JL)=YDCSGLEG%RMU(IGLGLO) ! sine of latitude + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO))*ZRAD2DEG + ZLATK(JL)=ZLAT + ZCOS0=1._JPRB + ZSIN0=0._JPRB + PLDAY(JL)=MAX( RSIDECA*ZGEMU(JL)& + & -RCODECA*RCOVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZCOS0& + & +RCODECA*RSIVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZSIN0& + & ,0.0_JPRB) ! PLDAY should be positive +ENDDO + +!----------------------------------------------------------------------- + +!* 0.3 CONSTANTS AND ACCESS TO DATA (remove?) +! ---------------------------- + +CALL SURF_INQ(YSURF,PRWPWP=ZRWPWP) +CALL SURF_INQ(YSURF,PRWSAT=ZRWSAT) + + + +!----------------------------------------------------------------------- + +!* 0.4 Time data +! ---------------------------- + +ZETAH(KIDIA:KFDIA,0)=0._JPRB +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZETA(JL,JK) =PAP(JL,JK) /PAPH(JL,KLEV) + ZETAH(JL,JK)=PAPH(JL,JK)/PAPH(JL,KLEV) + ENDDO +ENDDO + +ZDEGRAD= 180._JPRB/RPI ! radians to degrees +ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines +ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines +ZGRDLAT2=ZGRDLAT*0.55_JPRB + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + Z1GP=1.0_JPRB/REAL(NLOENG(IGLGLO),JPRB) + ZDLON=Z1GP*2.0_JPRB*RPI ! distance in radians between longitude points on a given latitude line + ZGRDLON(JL)=ZDLON + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO)) ! latitude in radians + + ZGLON(JL)=PGELAM(JL)*ZDEGRAD ! Lon in Degrees + ZGLAT(JL)=ZLAT*ZDEGRAD ! Lat in Degrees + ZGDLAT(JL)=ZDLAT ! Lat + ZGDLON(JL)=360._JPRB*Z1GP ! Lat spacing + + ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY + ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB +ENDDO +!VH IF (.NOT.LAERODIU) THEN +!VH ZDIURN(KIDIA:KFDIA)=1.0_JPRB +!VH ENDIF + + + +!----------------------------------------------------------------------- +!* 0.5 Array initializations +! ---------------------- + +IHTST=20 + +DO IMODE=1,NMOD + ALLOCATE(EMIS_NUMBER(IMODE)%d3(KIDIA:KFDIA,KLEV,MODE_NM(IMODE))) + ALLOCATE(EMIS_MASS(IMODE)%d3(KIDIA:KFDIA,KLEV,MODE_NM(IMODE))) + + EMIS_NUMBER(IMODE)%d3(KIDIA:KFDIA,1:KLEV,1:MODE_NM(IMODE))=0.0_JPRB + EMIS_MASS(IMODE)%d3(KIDIA:KFDIA,1:KLEV,1:MODE_NM(IMODE))=0.0_JPRB +ENDDO + + +ZFAERO (KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB +ZAEROK (KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PCEN (KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) +ZTAEROK(KIDIA:KFDIA, 1:KLEV, 1:NACTAERO) = PTENC(KIDIA:KFDIA, 1:KLEV, KAERO(1):KAERO(NACTAERO)) +PEMIDIAG(KIDIA:KFDIA, 1:NACTAERO) = 0.0_JPRB + +! RCHG: FIXME -> there were are recurrent sematic error ARRAY(:) = 0.0_JPRB is dangerous. +ZOMBF(KIDIA:KFDIA) = 0.0_JPRB +ZOMFF(KIDIA:KFDIA) = 0.0_JPRB +ZOMGF(KIDIA:KFDIA) = 0.0_JPRB +ZBCFF(KIDIA:KFDIA) = 0.0_JPRB +ZBCBF(KIDIA:KFDIA) = 0.0_JPRB +ZBCGF(KIDIA:KFDIA) = 0.0_JPRB +ZCFLX(KIDIA:KFDIA,:) = 0.0_JPRB + +!----------------------------------------------------------------------- + +!* 0.6 SURFACE WIND VARIABLE RELEVANT FOR SS AND DU EMISSIONS +! ------------------------------------------------------ + +IF (NAERWND == 0) THEN +!-- no gust accounted for + ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +ELSEIF (NAERWND == 1) THEN +!-- gust only for SS, 10-m wind for DU + ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +ELSEIF (NAERWND == 2) THEN +!-- gust only for DU, 10-m wind for SS + ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +ELSEIF (NAERWND == 3) THEN +!-- gust for both SS and DU + ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +ENDIF + +! correction to account for the decrease of mean wind and gusts with decreasing +! time step +IF (PTSPHY < 1000) THEN + ZWNDDU(KIDIA:KFDIA)=1.06_JPRB*ZWNDDU(KIDIA:KFDIA) + ZWNDSS(KIDIA:KFDIA)=1.08_JPRB*ZWNDSS(KIDIA:KFDIA) +ENDIF + +!----------------------------------------------------------------------- +!* 1.0 SEA SALT +! -------- + +!- INFO: Simplistic lifting from surface based on 10-m wind and land-sea mask +! (currently not used!) +! ZHSS=8434._JPRB/1000._JPRB + +! RCHG: PCI, PCLAKE, PLSM, PSST +CALL TM5M7_SRC_SS( KIDIA, KFDIA, KLON, KLEV, & + & PCI, PCLAKE, PLSM, PSST, ZWNDSS, & + & emis_mass, emis_number ,YDEAERSRC) + +!------------------------------------------------------------ +! 1.9 INTERPOLATION FIELDS DUST TEGEN ONLINE SCHEME +! --------- +IF (NDDUST == 8) THEN + CALL YDUSTCLIM%INTERPOLATION( & + KIDIA, KFDIA, KLON, & ! start/end, number of columns + PGELAT, PGELAM, & ! lat/lon in radians + ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & + IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT,IZ0M, IFPAR, IMM, ILAI_MAX, ILAI_AVG) +ENDIF + +!----------------------------------------------------------------------- +!* 2.0 DESERT DUST +! ----------- + +!INFO: Simplistic lifting from surface based on 10-m wind and surface albedo +! ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) -> RCHG non-used and non-sense + +! RCHG: define what is 1:12, 1:9 and 1:5 with a meaninful name +! +PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB +ZAERMAP(KIDIA:KFDIA,1:5)=0._JPRB +CALL TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, KIDIA, KFDIA, KLON, KLEV, KTILES, KSW,& + & PLSM, ZWNDDU, PSNS, PZ0M, & + & PAP(:,KLEV), PTL, PSOIL_TYPE, & + & PFRTI, PCVL, PCVH, KTVL, KTVH, & + & emis_mass, emis_number, PAERFLX, ZGLON, ZGLAT, & + & ZRWPWP, ZRWSAT, ZAERMAP, PALB, PALBD, PWS1, PHSDFOR, & + & IMM,ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & + & IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT,IZ0M, IFPAR, GPGAW, & + & ILAI_MAX, ILAI_AVG) +!----------------------------------------------------------------------- +!* 3.0 PARTICULATE ORGANIC MATTER +! --------------------------------------------------------- +! in compo_emission_apply +! +!----------------------------------------------------------------------- +!* 4.0 BLACK CARBON +! ------------ +! in compo_emission_apply +! +!---------------------------------------------------------------------- +! +! +! RCHG -> in the case of CY48R1 the emissions non-interactive (all except SS and DUST) +! are directly added as PCFLX and PTENC per tracer (remember there are 37 tracers) +! Now we meed to add SS and DUST into the correct tracer identifier. +! +! After PCFLUX and PTENC we also fix PEMIDIAG. Note that PEMIDIAG is only +! used to transfer to PAERSRC array which is transfered to PGFL object to +! store emissions. Probably we can directly store in PAERSRC array, but +! I keep current implementation. + +DO JL=KIDIA,KFDIA + PCFLX(JL,KAERO(iacs_n)) =PCFLX(JL,KAERO(iacs_n))+ emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(icos_n)) =PCFLX(JL,KAERO(icos_n))+ emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(issacs)) =PCFLX(JL,KAERO(issacs))+ emis_mass(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(isscos)) =PCFLX(JL,KAERO(isscos))+ emis_mass(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + PCFLX(JL,KAERO(iaci_n)) =PCFLX(JL,KAERO(iaci_n))+ emis_number(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(icoi_n)) =PCFLX(JL,KAERO(icoi_n))+ emis_number(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iduaci)) =PCFLX(JL,KAERO(iduaci))+ emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + PCFLX(JL,KAERO(iducoi)) =PCFLX(JL,KAERO(iducoi))+ emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + + ZCFLX(JL,KAERO(iacs_n)) = emis_number(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(icos_n)) = emis_number(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(issacs)) = emis_mass(mode_acs)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(isscos)) = emis_mass(mode_cos)%d3(JL,KLEV,4)*(-1._JPRB) + ZCFLX(JL,KAERO(iaci_n)) = emis_number(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + ZCFLX(JL,KAERO(icoi_n)) = emis_number(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + ZCFLX(JL,KAERO(iduaci)) = emis_mass(mode_aci)%d3(JL,KLEV,1)*(-1._JPRB) + ZCFLX(JL,KAERO(iducoi)) = emis_mass(mode_coi)%d3(JL,KLEV,1)*(-1._JPRB) + +ENDDO + + +IF (.NOT.LVDFTRAC) THEN + DO JL=KIDIA,KFDIA + PTENC(JL,KLEV, KAERO(iacs_n)) = PTENC(JL,KLEV, KAERO(iacs_n)) + emis_number(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(icos_n)) = PTENC(JL,KLEV, KAERO(icos_n)) + emis_number(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(issacs)) = PTENC(JL,KLEV, KAERO(issacs)) + emis_mass(mode_acs)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(isscos)) = PTENC(JL,KLEV, KAERO(isscos)) + emis_mass(mode_cos)%d3(JL,KLEV,4) * RG / PDELP(JL,KLEV) + + PTENC(JL,KLEV, KAERO(iaci_n)) = PTENC(JL,KLEV, KAERO(iaci_n)) + emis_number(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(icoi_n)) = PTENC(JL,KLEV, KAERO(icoi_n)) + emis_number(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iduaci)) = PTENC(JL,KLEV, KAERO(iduaci)) + emis_mass(mode_aci)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + PTENC(JL,KLEV, KAERO(iducoi)) = PTENC(JL,KLEV, KAERO(iducoi)) + emis_mass(mode_coi)%d3(JL,KLEV,1) * RG / PDELP(JL,KLEV) + ENDDO +ENDIF + + +DO JL=KIDIA,KFDIA + DO IMODE=1,NMOD ! loop in each mode + DO INMODE=0,MODE_NM_SED(IMODE) ! loop in aerosols species per mode + JN = MODE_TRACERS_SED(INMODE,IMODE) ! retrieve indentifier of each specie + PEMIDIAG(JL,KAERO(JN))= PEMIDIAG(JL,KAERO(JN)) + ZCFLX(JL,KAERO(JN))*(-1._JPRB) ! assign ZCFLX to emissions (we still not added dep. to PCFLX) + ENDDO + ENDDO +ENDDO + + +!----------------------------------------------------------------------- +!* 6.0 De-allocate arrays +! ------------ + +DO IMODE=1,NMOD + IF(associated(EMIS_NUMBER(IMODE)%d3)) DEALLOCATE(EMIS_NUMBER(IMODE)%d3) + IF(associated(EMIS_MASS(IMODE)%d3)) DEALLOCATE(EMIS_MASS(IMODE)%d3) +ENDDO + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC + diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 new file mode 100644 index 00000000..8b6a4cab --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust.F90 @@ -0,0 +1,1760 @@ +SUBROUTINE TM5M7_SRC_DUST( YDEPHY, YDEAERMAP, YDEAERSRC, & + & KIDIA, KFDIA, KLON, KLEV, KTILES, KSW, & + & PLSM , PWIND, PSNS, PZ0M, & + & SP, PTL, PSOIL_TYPE, & + & PFRTI, PCVL, PCVH, KTVL, KTVH, & + & EMIS_MASS, EMIS_NUMBER ,PAERFLX,PGLON, PGLAT, & + & PRWPWP,PRWSAT,PAERMAP,PALB,PALBD,PWS1,PHSDFOR,& + & IMM,ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & !Tegen scheme only - not all used yet + & IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT,IZ0M, IFPAR, GPGAW,& !Tegen scheme only - not all used yet + & ILAI_MAX,ILAI_AVG) !Tegen scheme only - not all used yet + +! RCHG -> Here a dependence is KLEV => it is that ok? + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 04-Jun-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *tm5m7_src_dust* - SOURCE TERMS FOR MINERAL DUST AEROSOLS │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *tm5m7_src_dust* is called from tm5m7_src │ +! │ │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ Online dust emissions based on Tegen/Vignati/Strunk │ +! │ │ +! │ Please read the section above for background information about the │ +! │ underlying approach. An improved and modified online implementation has │ +! │ been accomplished from which. It can be activated by setting │ +! │ │ +! │ input.emis.dust : ONLINE │ +! │ │ +! │ in the rc-file. An additional netcdf file is needed for some input │ +! │ parameters. The path to which needs to be defined in the key │ +! │ │ +! │ input.emis.dust.dir : │ +! │ /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc │ +! │ │ +! │ For every time step there will be particles emitted, scaled to monthly │ +! │ amounts (both mass and numbers) in order to keep compliance with │ +! │ assumption sabout the aerosol emissions in sedimentation.F90. │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Orginal version: T. van Noije et al. (KNMI) │ +! │ Nov 2011 - Achim Strunk - v0 │ +! │ Vincent Huijen (KNMI) adapted to OpenIFS │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ Jun. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ Apr. 2025 - BSC: Add Tegen dust scheme | +! │ | +! ╰────────────────────────────────────────────────────────────────────────────╯ + + +! --- IFS/OpenIFS modules ------------------------------------------------------ + +USE TYPE_MODEL,ONLY : MODEL +USE YOMLUN, ONLY : NULOUT +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMCST, ONLY : RPI + +! -- M7 modules ---------------------------------------------------------------- +USE TM5M7_DATA, ONLY: NMOD, MODE_ACI, MODE_COI, sigma, sigma_lognormal, & + & iacci,icoai +! +USE TM5M7_EMIS_DATA, ONLY: MODAL_EMISSIONS, & + & nsoilph, nfpar, & + & vkarman!, & + +USE YOEPHY , ONLY : TEPHY +USE YOEAERMAP, ONLY : TEAERMAP +USE YOEAERSRC, ONLY : TEAERSRC + +!------------------------------------------------------------------------------! +! 0.6 ARGUMENTS TEGEN ! +! ! +!------------------------------------------------------------------------------! + +! parameters for online dust calculations +INTEGER, PARAMETER :: ntraced=8 ! number of coarse-grained bins + ! in the original emission model +INTEGER, PARAMETER :: nbin=24 ! number of discretization points per bin +INTEGER, PARAMETER :: nclass=ntraced*nbin ! total number of discretization points +INTEGER, PARAMETER :: nats=12 ! number of soil types +INTEGER, PARAMETER :: nmode=4 ! number of particle size distributions in soils, + ! which distinguishes between clay, silt, + ! medium/fine sand, and coarse sand +INTEGER, PARAMETER :: nspe=nmode*3+2 ! for explanation, see below +REAL(KIND=JPRB), PARAMETER :: xmair=28.94 ! mass of air, g/mol +REAL(KIND=JPRB), PARAMETER :: xmdust=xmair +! Constants used in the parameterization of the efficient friction velocity ratio, +! see Eqs. (17-20) in MB95: +REAL(KIND=JPRB), PARAMETER :: aeff=0.35 +REAL(KIND=JPRB), PARAMETER :: xeff=10. +REAL(KIND=JPRB), PARAMETER :: u1fac=0.6 ! 0.7 in EC-Earth 3.2.3 +REAL(KIND=JPRB), PARAMETER :: ddcal=0.1 + +REAL(KIND=JPRB), PARAMETER :: cd=1.2507E-06 ! flux dimensioning parameter [g s^2/cm^4] +REAL(KIND=JPRB), PARAMETER :: z0_min=1.e-2 +REAL(KIND=JPRB), PARAMETER :: lai_lim=0.25 +REAL(KIND=JPRB), PARAMETER :: lai_lim2=0.5 +REAL(KIND=JPRB), PARAMETER :: d_thrsld=2.31e-6 ! threshold value +REAL(KIND=JPRB), PARAMETER :: Dmin=2.0210403762e-5 ! diameter (cm) at first discretization point +REAL(KIND=JPRB), PARAMETER :: Dmax=0.126667434757 ! diameter (cm) at last discretization point +REAL(KIND=JPRB), PARAMETER :: Dstep=0.04577551202 ! diameter increment in log-space +REAL(KIND=JPRB), PARAMETER :: grav = 9.80665 ! m/s2 +! Constants in the parameterization of the Reynolds number, +! see Eq. (5) in MB95: +REAL(KIND=JPRB), PARAMETER :: a_rnolds=1331.647 ! Reynolds constant +REAL(KIND=JPRB), PARAMETER :: b_rnolds=0.38194 ! Reynolds constant +REAL(KIND=JPRB), PARAMETER :: x_rnolds=1.561228 ! Reynolds constant +REAL(KIND=JPRB), PARAMETER :: roa=0.001227 ! reference air density (g/cm^3) + +REAL(KIND=JPRB) :: rho_air ! variable air density (g/cm^3) +REAL(KIND=JPRB), PARAMETER :: rgas =8.3144 +REAL(KIND=JPRB), PARAMETER :: airfac=1./rgas*xmair*1.e-6 ! factor for rho_air +REAL(KIND=JPRB) :: airdens_ratio, airdens_ratio2 +REAL(KIND=JPRB), PARAMETER :: umin=13.75 ! minimum threshold friction velocity (cm/s) +REAL(KIND=JPRB), PARAMETER :: ZZ=1000. ! wind measurement height (cm) +REAL(KIND=JPRB), PARAMETER :: ddust = 2.650 ! Density du [g cm-3] +REAL(KIND=JPRB), PARAMETER :: dust_density = ddust * 1.e3 + +INTEGER(KIND=JPIM), PARAMETER :: min_ai=1 +INTEGER(KIND=JPIM), PARAMETER :: max_ai=1 +! Boundaries for Coa. mode +INTEGER(KIND=JPIM), PARAMETER :: min_ci=2 +INTEGER(KIND=JPIM), PARAMETER :: max_ci=4 +REAL(KIND=JPRB), PARAMETER :: mf_acc_r1 = 0.313758 +REAL(KIND=JPRB), PARAMETER :: mf_acc_r2 = 0.684043 +REAL(KIND=JPRB), PARAMETER :: mf_coa_r1 = 0.00518309 +REAL(KIND=JPRB), PARAMETER :: mf_coa_r2 = 0.980634 + +REAL(KIND=JPRB), PARAMETER :: ratio_coa = mf_coa_r1/mf_coa_r2 +REAL(KIND=JPRB), PARAMETER :: ratio_acc = mf_acc_r2/mf_acc_r1 +REAL(KIND=JPRB), PARAMETER :: denom_acc_inv = 1./(mf_acc_r1-ratio_coa*mf_acc_r2) +REAL(KIND=JPRB), PARAMETER :: denom_coa_inv = 1./(mf_coa_r2-ratio_acc*mf_coa_r1) +REAL(KIND=JPRB), PARAMETER :: mf_acc_r12_inv = 1./(mf_acc_r1+mf_acc_r2) +REAL(KIND=JPRB), PARAMETER :: mf_coa_r12_inv = 1./(mf_coa_r1+mf_coa_r2) + +REAL(KIND=JPRB), PARAMETER :: mmr_ai=0.37E-4 ! cm +REAL(KIND=JPRB), PARAMETER :: mmr_ci=1.75E-4 + +!---------------------------------------------------------------- + +!----------------------------------------------------------------------- +!* 0.1 ARGUMENTS +! --------- +INTEGER(KIND=JPIM), INTENT(IN) :: IMM ! not used +TYPE(TEPHY), INTENT(IN) :: YDEPHY +TYPE(TEAERMAP), INTENT(INOUT) :: YDEAERMAP +TYPE(TEAERSRC), INTENT(IN) :: YDEAERSRC + +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM), INTENT(IN) :: KTILES +INTEGER(KIND=JPIM), INTENT(IN) :: KSW + +REAL(KIND=JPRB), INTENT(IN) :: GPGAW(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 +REAL(KIND=JPRB), INTENT(IN) :: PSNS(KLON) ! Snow depth +REAL(KIND=JPRB), INTENT(IN) :: PZ0M(KLON) ! Roughness length [m] +REAL(KIND=JPRB), INTENT(IN) :: SP(KLON) ! Surface pressure +REAL(KIND=JPRB), INTENT(IN) :: PTL(KLON) ! surface temperature +REAL(KIND=JPRB), INTENT(IN) :: PSOIL_TYPE(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PFRTI(KLON,KTILES) ! Tile fraction (0-1) +! 1 : Water 5 : Snow on low-veg + bare-soil +! 2 : Ice 6 : Dry snow-free high veg +! 3 : Wet skin 7 : snow under high-veg +! 4 : Dry snow-free low-veg 8 : bare soil +REAL(KIND=JPRB), INTENT(IN) :: PCVL(KLON), PCVH(KLON) ! Low/High vegetation cover +INTEGER(KIND=JPIM), INTENT(IN) :: KTVL(KLON), KTVH(KLON) ! Low/High vegetation type +! M7 +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_mass(NMOD) +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_number(NMOD) +REAL(KIND=JPRB), INTENT(INOUT) :: PAERFLX(KLON,12,9) !diagnostic array/not used. +REAL(KIND=JPRB), INTENT(IN) :: PGLON(KLON),PGLAT(KLON) +REAL(KIND=JPRB), INTENT(INOUT) :: PRWPWP, PRWSAT, PAERMAP(KLON,5) +REAL(KIND=JPRB), INTENT(IN) :: PALB(KLON), PALBD(KLON,KSW) +REAL(KIND=JPRB), INTENT(IN) :: PWS1(KLON),PHSDFOR(KLON) + +REAL(KIND=JPRB), INTENT(IN) :: ISOILPH1(KLON), ISOILPH2(KLON), ISOILPH3(KLON), ISOILPH4(KLON), ISOILPH5(KLON), & + & IZ0AM(KLON), IPOTSRC(KLON), IAREA(KLON), ICULT(KLON) +REAL(KIND=JPRB), INTENT(IN) :: IZ0M(KLON), IFPAR(KLON) +REAL(KIND=JPRB), INTENT(IN) :: ILAI_MAX(KLON) ,ILAI_AVG(KLON) +REAL(KIND=JPRB), INTENT(IN) :: ISOILTYPE(KLON) + +!* 0.5 LOCAL VARIABLES +! --------------- +REAL(KIND=JPRB) :: exp_Dstep, sqrt_2pi +INTEGER(KIND=JPIM), PARAMETER :: KBINDD=3 +INTEGER(KIND=JPIM) :: JL, ID, JAER, INBAER + +REAL(KIND=JPRB) :: FLUX_AI(KLON), FLUX_CI(KLON),FNUM_AI(KLON),FNUM_CI(KLON) +REAL(KIND=JPRB) :: FLUXTOT(NTRACED),FDUST(NTRACED) +REAL(KIND=JPRB) :: FLUXTYP(NCLASS) +REAL(KIND=JPRB) :: ZDEPTILE +REAL(KIND=JPRB) :: TV_DAT(20) ! Local grid box fractions (0-1) for each of + ! presumeably 20 IFS vegetation types +! RCHG -> Here it i simportant to explain what are 9 , 12 +! => PROBABLY related to PAERFLUX dimensions +REAL(KIND=JPRB) :: ZFLX_SDUST(KLON,9,12) +REAL(KIND=JPRB) :: ZSCC2(KLON), ZDEP2(KLON) +REAL(KIND=JPRB) :: ZLTS2(KLON), ZLTSMIN(KLON), ZLTSMAX(KLON) +REAL(KIND=JPRB) :: ZWND3(KLON) +REAL(KIND=JPRB) :: ZDUEMPOT(KLON,3) +REAL(KIND=JPRB) :: ZDEGRAD, ZFSWET, ZSWETN +REAL(KIND=JPRB) :: ZRWPWP, ZRWSAT +REAL(KIND=JPRB) :: ZEPSSNO, ZEPSARE +REAL(KIND=JPRB) :: ZREFSPD, ZRADREF, ZREFRAD +REAL(KIND=JPRB) :: ZAERDUB +REAL(KIND=JPRB) :: RDDUSRC(9) +LOGICAL :: LLDUST(KLON,12), LLPDUSTS(KLON) +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +LOGICAL :: TEGEN +CHARACTER(LEN=45) :: CLAERWND(0:3) +!---------------------------------------------------------------- +! SOIL CARACTERISTICS: +! ZOBLER texture classes: +!---------------------------------------------------------------- +!! nats =12 +!! nspe =nmode*3+2 = 14 +!! nmode=4 +INTEGER :: jp + +!!!!>>>>> +REAL(KIND=JPRB), DIMENSION(nats,nspe) :: solspe +!-- soil type 1 : Coarse +DATA (solspe(1,jp),jp=1,nspe)/ & + 0.0707, 2., 0.43 , & + 0.0158, 2., 0.4 , & + 0.0015, 2., 0.17 , & + 0.0002 ,2., 0. , & + 2.1E-06, 0.2/ +!-- soil type 2 : Medium +DATA (solspe(2,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0.37 , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.3 , & + 4.0e-6, 0.25/ +!-- soil type 3 : Fine +DATA (solspe(3,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0.33 , & + 0.0002, 2., 0.67 , & + !>>> TvN + ! 33% x 1e-5 + 67% x 1e-7 = 3.367e-6 cm^-1 + !1.E-07, 0.5/ + 3.4e-6, 0.5/ + !<<< TvN +!-- soil type 4 : Coarse Medium +DATA (solspe(4,jp),jp=1,nspe)/ & + 0.0707, 2., 0.1 , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.2 , & + 0.0002, 2., 0.2 , & + 2.7E-06, 0.23/ +!-- soil type 5 : Coarse Fine +DATA (solspe(5,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0.5 , & + 0.0015, 2., 0.12 , & + 0.0002, 2., 0.38 , & + !>>> TvN + ! 50% x 1e-6 + 12% x 1e-5 + 38% x 1e-6 = 2.08e-6 cm^-1 + !2.8E-06, 0.25/ + 2.1e-6, 0.25/ + !<<< TvN +!-- soil type 6 : Medium Fine +DATA (solspe(6,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0.27 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.48 , & + !>>> TvN + ! 27% x 1e-6 + 25% x 1e-5 + 48% x 1e-7 = 2.818e-6 cm^-1 + !1e-07, 0.36/ + 2.8e-6, 0.36/ + !<<< TvN +!-- soil type 7 : Coarse, Medium, Fine +DATA (solspe(7,jp),jp=1,nspe)/ & + 0.0707, 2., 0.23 , & + 0.0158, 2., 0.23 , & + 0.0015, 2., 0.19 , & + 0.0002, 2., 0.35 , & + 2.5E-06, 0.25/ +!-- soil type 8 : Organic +DATA (solspe(8,jp),jp=1,nspe)/ & + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5/ +!-- soil type 9 : Ice +DATA (solspe(9,jp),jp=1,nspe)/ & + 0.0707, 2., 0.25 , & + 0.0158, 2., 0.25 , & + 0.0015, 2., 0.25 , & + 0.0002, 2., 0.25 , & + 0., 0.5/ +!-- soil type 10 : Potential Lakes (additional) +! GENERAL CASE +DATA (solspe(10,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25/ +!-- soil type 11 : Potential Lakes (clay) +! GENERAL CASE +DATA (solspe(11,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0015, 2., 0. , & + 0.0002, 2., 1. , & + 1.E-05, 0.25/ +!-- soil type 12 : Potential Lakes Australia +DATA (solspe(12,jp),jp=1,nspe)/ & + 0.0707, 2., 0. , & + 0.0158, 2., 0. , & + 0.0027, 2., 1. , & + 0.0002, 2., 0. , & + 1.E-05, 0.25/ + +!!!!!!<<<<< +!------------CRITICAL ARRAYS------------- +REAL(KIND=JPRB) :: SOIL_TYPE(KLON) +REAL(KIND=JPRB) :: POT_SOURCE(KLON) ! Local potencial sources are calculated +REAL(KIND=JPRB) :: CULT(KLON) ! Local copy of cultivation +REAL(KIND=JPRB) :: Z0(KLON) ! Local copy of roughness lengthi +REAL(KIND=JPRB) :: FPAR(KLON) ! Local copy of fraction photochem/radiation +REAL(KIND=JPRB) :: SOILPH(KLON) ! Local copy of [THIS SHOULD BE 5 different types] + +REAL(KIND=JPRB) :: UTH ( NCLASS) +REAL(KIND=JPRB) :: SREL (NATS,NCLASS) +REAL(KIND=JPRB) :: SRELV(NATS,NCLASS) +REAL(KIND=JPRB) :: SU_SRELV(NATS,NCLASS) + +REAL(KIND=JPRB) :: SNOWCOVER(KLON), DESERT(KLON) +REAL(KIND=JPRB) :: LAI_EFF(KLON),UMIN2(KLON), ALPHA(KLON), C_EFF(KLON) +REAL(KIND=JPRB) :: AREA(KLON) + +INTEGER(KIND=JPIM) :: NN, ND, NS, KK, NM, NSI, NP +REAL(KIND=JPRB) :: DP, STOTAL,STOTALV +REAL(KIND=JPRB) :: su_class(nclass), su_classv(nclass), utest(nats) + +REAL(KIND=JPRB) :: VEGET, LAI_MAX, LAI_AVG, LAI_CUR, Z0S, DPD, FLUX_DIAM, CULTFAC1, DLAST +REAL(KIND=JPRB) :: AAA, BB, CCC, FF, FEFF, DBSTART, UTHP, WIND10M, USTAR +REAL(KIND=JPRB) :: XK, DDD, EE, FDP1, FDP2,temp_val +REAL(KIND=JPRB) :: SU, SUV, SU_LOC, SU_LOCV, XL, XM, XN, XNV +REAL(KIND=JPRB) :: FLUX_R1, FLUX_R2 + +REAL(KIND=JPRB) :: log_dp, log_mmd, log_stdv +REAL(KIND=JPRB), PARAMETER :: small_number = 1.0E-10 + +INTEGER(KIND=JPIM) :: ISTAT, REGION +INTEGER(KIND=JPIM) :: I, J, I_S1, I_S11, I_S111, IDUST, LAI_FLAG, MONTH, IVEG +INTEGER(KIND=JPIM) :: KKK, KFIRST, KKMIN +INTEGER(KIND=JPIM) :: I01, J01, I02, J02 +INTEGER(KIND=JPIM) :: I1, J1, I2, J2, ACCESS_MODE +! saving the status of being called +LOGICAL, SAVE :: initial = .TRUE. +#include "abor1.intfb.h" +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',0,ZHOOK_HANDLE) + +ASSOCIATE( NDUSRCP => YDEAERMAP%NDUSRCP, RDDUAER => YDEAERMAP%RDDUAER, & + & RDUSRCP => YDEAERMAP%RDUSRCP, NDDUST => YDEAERSRC%NDDUST, & + & NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME, DCAL => YDEAERSRC%DCAL, & + & NAERWND => YDEAERSRC%NAERWND) ! LE4ALB to NALBEDOSCHEME + +CLAERWND(0) = '10-M WIND AS PREDICTOR FOR SS AND DU ' +CLAERWND(1) = 'PREDICTORS: WIND GUST FOR SS, 10M-WIND FOR DU' +CLAERWND(2) = 'PREDICTORS: WIND GUST FOR DU, 10M-WIND FOR SS' +CLAERWND(3) = 'WIND GUST AS PREDICTORS FOR SS AND DU ' + +! =========================== INIT +!IF( initial ) THEN + + !--------------------------------------------------------------------------------------- + ! initializations : This should be done idealy once per day. + !--------------------------------------------------------------------------------------- + uth = 0. + srel = 0. ! fraction of the grid area correspondent to each soil population + srelV = 0. ! fraction of volume + su_srelV = 0. + utest = 0. + + !--------------------------------------------------------------------------------------- + ! Uth calculation + ! Threshold friction velocity dependent on the particle diameter + ! following Eqs. (3-5) in MB95. + !--------------------------------------------------------------------------------------- + nn = 0 + dp = Dmin + !dp = MAX(Dmin, 1.0E-6) ! avoid zero or negative dp (more robust than 1e-10) + + DO WHILE (dp <= Dmax + 1.0E-5) + + nn = nn + 1 + + ! ----------------------------------------------------------------------------------- + ! Protect BB calculation: avoid dp ** x_rnolds if dp <= 0 + ! ----------------------------------------------------------------------------------- + IF (dp > 0.0) THEN + BB = a_rnolds * (dp ** x_rnolds) + b_rnolds + ELSE + !BB = b_rnolds + CALL ABOR1('ABORT: dp is negative in BB caclulation') + END IF + ! remove the check of negative + ! ----------------------------------------------------------------------------------- + ! XK computation - safe sqrt + ! ----------------------------------------------------------------------------------- + IF (roa > 0.0 .AND. ddust > 0.0 .AND. grav > 0.0) THEN + XK = SQRT(MAX(0.0, ddust * grav * 100.0 * dp / roa)) + ELSE + CALL ABOR1('ABORT: roa or ddust or grav is Negative in XK calculation') + END IF + + ! ----------------------------------------------------------------------------------- + ! CCC computation - safe sqrt + ! ----------------------------------------------------------------------------------- + IF (dp > 0.0) THEN + CCC = SQRT(MAX(0.0, 1.0 + d_thrsld / (dp ** 2.5))) + ELSE + CALL ABOR1('ABORT: dp is negative in CCC caclulation') + END IF + + ! ----------------------------------------------------------------------------------- + ! Uth computation + ! ----------------------------------------------------------------------------------- + IF (BB < 10.0) THEN + ! Safe DDD calculation + temp_val = 1.928 * (BB ** 0.092) - 1.0 + IF (temp_val > 0.0) THEN + DDD = SQRT(temp_val) + IF (DDD /= 0.0) THEN + Uth(nn) = 0.129 * XK * CCC / DDD + ELSE + CALL ABOR1('ABORT:DDD is 0 negative Uth(nn)') + !Uth(nn) = 0.0 ! PRINT UTH is zeros ABORT! IDIALY NO IF ! OR SET IT TO UMIN =! ... + END IF + ELSE + CALL ABOR1('ABORT: negative BB is 0 negative Uth(nn)') + !Uth(nn) = 0.0 !PRINT IS ZEROS ? ! ABORT + END IF + ELSE + EE = -0.0617 * (BB - 10.0) + FF = 1.0 - 0.0858 * EXP(EE) + Uth(nn) = 0.12 * XK * CCC * FF + END IF + + ! ----------------------------------------------------------------------------------- + ! Advance dp + ! ----------------------------------------------------------------------------------- + dp = dp * EXP(Dstep) + + !IF (dp > Dmax+1e.-05) CALL ABOR1("[TM5M7_SRC_DUST_INIT] NCLASS inconsistent with [Dmin,Dmax]") + END DO + !THERE is BUG is the loop is not consistance with nn Uth has unidentified variables + !--------------------------------------------------------------------------------------- + ! surface calculation - calculation of the soil size distribution + ! Through all soil particle diameter the calculation of the relative contribution + ! in surface and volume of the soil population independently of the grid + !--------------------------------------------------------------------------------------- + ! ============================ +! Soil Types Loop +! ============================ + DO ns = 1, nats ! soil types + + Stotal = 0. + StotalV = 0. + su_class = 0. + su_classV = 0. + + kk = 0 + dp = Dmin + !dp = MAX(Dmin, 1.0E-10) + DO WHILE( dp <= Dmax + 1.0E-5 ) + kk = kk + 1 + su = 0. + suV = 0. + DO nm = 1, Nmode ! particle size populations in soils + nd = ((nm - 1) *3 ) + 1 ! index to mass median diameter + nsi = nd + 1 ! index to standard deviation + np = nd + 2 ! index to relative contribution + ! + ! based on soil type and contribution of population of the soil type the soil size + ! distribution population is calculated + ! + + !>>> TvN + ! Bug in the original code: nd should be np + ! Since solspe(ns,nd) is never zero + ! and the final result is proportional to solspe(ns,np), + ! the bug has no impact on the results. + !IF (solspe(ns,nd).EQ.0.) THEN + !IF (solspe(ns,np).EQ.0.) THEN + IF (solspe(ns,np).EQ.0. .or. solspe(ns,nsi).EQ.0. .or. solspe(ns,nd).EQ.0.) THEN + !<<< TvN + su_loc = 0. + su_locV=0. + ELSE + xk = solspe(ns,np)/(SQRT(2.* RPI)*LOG(solspe(ns,nsi))) + xl = ( (LOG(dp) - LOG( solspe(ns,nd ) ))**2 ) / & + (2.*(LOG( solspe(ns,nsi) ))**2 ) + xm = xk * EXP(-xl) ! value of the lognormal mass size distribution + ! dM/dln(dp) in Eq. (29) in MB95 + ! (Aerosol Sci. Technol., 1994) + xn = ddust*(2./3.)*(dp/2.) ! surface + ! cf. the denominator in Eq. (30) in MB95 + ! The factor 2 difference is irrelevant, + ! since only relative contributions are used. + xnV = 1. !volume + su_loc = (xm*Dstep/xn) ! Eq. (30) in MB95 + su_locV = (xm*Dstep/xnV) + END IF ! + su = su + su_loc + suV = suV + su_locV + END DO !Nmode + + su_class(kk) = su + su_classV(kk) = suV + Stotal = Stotal + su + StotalV = StotalV + suV + dp = dp * EXP(Dstep) + END DO !dp + + DO nn = 1,Nclass + IF (Stotal.EQ.0.)THEN + srel (ns,nn) = 0. + srelV(ns,nn) = 0. + ELSE + srel (ns,nn) = su_class(nn)/Stotal + srelV (ns,nn) = su_classV(nn)/StotalV + utest (ns ) = utest(ns)+srelV(ns,nn) + su_srelV(ns,nn) = utest(ns) + END IF + END DO !j=1,nclass + END DO !ns (soil type) + + initial = .FALSE. +!END IF ! =========================== INIT + +! ifs vegetation +! +!1) L ! Crops, Mixed Farming +!2) L ! Short Grass +!3) H ! Evergreen Needleleaf Trees +!4) H ! Deciduous Needleleaf Trees +!5) H ! Deciduous Broadleaf Trees +!6) H ! Evergreen Broadleaf Trees +!7) L ! Tall Grass +!8) ! Desert +!9) L ! Tundra +!10) L ! Irrigated Crops +!11) L ! Semidesert +!12) ! Ice Caps and Glaciers +!13) L ! Bogs and Marshes +!14) ! Inland Water +!15) ! Ocean +!16) L ! Evergreen Shrubs +!17) L ! Deciduous Shrubs +!18) H ! Mixed Forest/woodland +!19) H ! Interrupted Forest +!20) L ! Water and Land Mixtures +!PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB + +ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB + +DUSTOPT: If (NDDUST==8) then + + ! Make local copy: + uthp = 0._JPRB + SOIL_TYPE(KIDIA:KFDIA)= ISOILTYPE(KIDIA:KFDIA) + POT_SOURCE(KIDIA:KFDIA)= IPOTSRC(KIDIA:KFDIA) + FPAR(KIDIA:KFDIA) = IFPAR(KIDIA:KFDIA) + Z0(KIDIA:KFDIA) = IZ0M(KIDIA:KFDIA) + + ! calculation of snow cover from snow dept + ! Tegen et al. fraction (0-1) + snowcover(KIDIA:KFDIA) = PSNS(KIDIA:KFDIA) / 0.015 + WHERE( snowcover(KIDIA:KFDIA) > 1. ) snowcover(KIDIA:KFDIA) = 1. + + + !!Maria G Checking the decimal values ? + !DO JL = KIDIA, KFDIA + + ! IF (SOIL_TYPE(JL) > 1.0 .AND. SOIL_TYPE(JL) < 2.0) THEN + ! WRITE(NULOUT,*) 'Decimal soil type between 1 and 2:', SOIL_TYPE(JL), & + ! 'at lat r =', PGLAT(JL), 'lon r =', PGLON(JL) + + ! ELSE IF (SOIL_TYPE(JL) > 2.0 .AND. SOIL_TYPE(JL) < 3.0) THEN + ! WRITE(NULOUT,*) 'Decimal soil type between 2 and 3:', SOIL_TYPE(JL), & + ! 'at lat r =', PGLAT(JL), 'lon r =', PGLON(JL) + + ! ELSE IF (SOIL_TYPE(JL) > 4.0 .AND. SOIL_TYPE(JL) < 5.0) THEN + ! WRITE(NULOUT,*) 'Decimal soil type between 4 and 5:', SOIL_TYPE(JL), & + ! 'at lat r =', PGLAT(JL), 'lon r =', PGLON(JL) + + ! END IF + + !END DO + ! + ! + !--------------------------------------------------------------------------------------- + ! Prepare the flux calculation + !--------------------------------------------------------------------------------------- + ! + ! Calculations done on monthly fields + + ! default: no dust source due to + ! - vegetation + ! - not a desert pixel or + ! - no pure land grid cell + lai_eff(KIDIA:KFDIA) = 0. + + ! per grid box + DO JL=KIDIA,KFDIA + TV_DAT(:)=0. ! Fraction IFS land type in grid cell, between 0-1 + ! VH identify dominant ifs land use type. + DO ID=1,KTILES + ZDEPTILE=PFRTI(JL,ID) + IF (ZDEPTILE < 0.01) CYCLE !skip if not contributing + SELECT CASE(ID) + CASE(1) ! Water + TV_DAT(15)=TV_DAT(15)+ZDEPTILE + ! TV_DAT(14)=ZDEPTILE (alternative: inland water?) + CASE(2) ! ICE + TV_DAT(12)=TV_DAT(12)+ZDEPTILE + CASE(3) ! wet skin + IF (PCVL(JL) + PCVH(JL) < 0.5) THEN + TV_DAT(8)=TV_DAT(8)+ZDEPTILE + ELSE + TV_DAT(KTVL(JL))=TV_DAT(KTVL(JL))+PCVL(JL) + TV_DAT(KTVH(JL))=TV_DAT(KTVH(JL))+PCVH(JL) + ENDIF + CASE(4,5) ! Low veg, with/without snow + TV_DAT(KTVL(JL))=TV_DAT(KTVL(JL))+ZDEPTILE ! make sure to filter out snow-events below + CASE(6,7) ! high veg, with/without snow + TV_DAT(KTVH(JL))=TV_DAT(KTVL(JL))+ZDEPTILE ! make sure to filter out snow-events below + CASE(8) ! Bare soil + TV_DAT(8)= TV_DAT(8)+ZDEPTILE + END SELECT + ENDDO + + + !--------------------------------------------------------------------------------------- + ! Selection of potential dust sources areas + !--------------------------------------------------------------------------------------- + ! Preferential Sources = Potential lakes + + !>>> TvN + ! If monthly surface roughness is not available + ! use the annual mean value, if available. + ! Since the annual mean is calculated + ! based on all available months, + ! it has a much better spatial coverage + ! than the individual months. + IF( Z0(JL) <= 0. .AND. IZ0AM(JL) > 0. ) THEN + Z0(JL) = IZ0AM(JL) + !ELSE IF ( Z0(JL) <= 0. .AND. IZ0AM(JL) < 0. ) THEN + ! Z0(JL) = z0_min + ENDIF + + !<<< TvN + IF( pot_source(JL) > 0.5 ) THEN + ! if the potential lake area is > 50%, it is a pot. lake grid + SOIL_TYPE(JL) = 10. + !>>> TvN + ! Use minimum value for roughness length. + ! Since there are only few potential source areas + ! where the annual mean is not available, + ! this will only have a limited impact. + !IF( z0(JL,idate(2)) <= 0. ) z0(JL,idate(2)) = 0.001 !! if z0 is not valid or missing (cm), PhD thesis Marticorena p.85 + IF( Z0(JL) <= 0. ) Z0(JL) = z0_min + !<<< TvN + END IF + !--------------------------------------------------------------------------------------- + ! Calculation of the ratio: horizontal/vertical flux (alpha) + !--------------------------------------------------------------------------------------- + !--------------------------------------------------------------------------------------- + ! Test on the vegetation type + !--------------------------------------------------------------------------------------- + ! When cult=0, the cultivation field info is not used. Otherwise: cult(JL)=3 +!!$ cult(JL) = 0. + + desert(JL) = isoilph3(JL) + isoilph4(JL) + !desert(JL)=TV_DAT(8)+TV_DAT(11) + veget=0. + veget = veget + PFRTI(JL,4)+PFRTI(JL,6)+PFRTI(JL,7) ! dry low veg + dry high veg + snow under high veg + + ! default: no dust emissions + idust = 0 + ! dust emissions only when + ! 1) there is only land (almost) + ! 2) 'desert' is positive or vegetation active + IF( PLSM(JL) >= 0.99 .AND. (desert(JL) > 0.001 .OR. veget > TINY(veget)) ) & + idust = 1 + + ! here is dust uptake possible + IF( idust == 1 ) THEN + !--------------------------------------------------------------------------------------- + !-- Calculate effective surface for fpar < lai_lim (as proxy for + !-- veg. cover), shrubby vegetation is determined by max + !-- annual fpar, grassy by monthly fpar (Tegen et al.2002) + !--------------------------------------------------------------------------------------- + + ! so we start with no vegetation --> full area available + lai_eff(JL) = 1. + + !-- get max/mean fpar of the full year --> needed for shrub land + !lai_max = MAXVAL(ifpar(JL,1:12)) + !lai_avg = SUM(ifpar(JL,1:12)) / 12. + lai_max = ILAI_MAX(JL) + lai_avg = ILAI_AVG(JL) + lai_cur = IFPAR(JL) + + + ! --------------------------------------------- + ! 3 classes: grass, shrub, mixed{grass,shrub} + ! --------------------------------------------- + ! HERE + ! first: grass dominated (tv(2) and tv(7)) + ! current fpar determines available area + !VH IF( (tv_dat(iglbsfc,2)%data(JL,1) + tv_dat(iglbsfc,7)%data(JL,1)) > 50 ) THEN + !VH: over 50% tile fraction is low veg, with dominant veg type being agricultural land or range land: + IF ((TV_DAT(2) + TV_DAT(7)) > 0.5 ) THEN + + lai_eff (JL) = 1. - lai_cur / lai_lim + + ! second: shrub dominated (tv(16) and tv(17)) + ! if max(fpar) > 0.25 --> no dust + ! else max(fpar) determines area + ELSEIF( (tv_dat(16) + tv_dat(17)) > 0.5 ) THEN + + ! lai_eff is zero for lai_max > lai_min and + ! [0,1] for lai_max < lai_lim + lai_eff (JL) = 1. - lai_max / lai_lim + + ! third: mixtures of grass and shrub land + ! if mean(fpar) > 0.5 --> shrub dominated --> use max(fpar) for scaling + ! else grass dominated --> use current(fpar) for scaling + ELSE + + IF( lai_avg > lai_lim2 ) THEN + lai_eff (JL) = 1. - lai_max / lai_lim + ELSE + lai_eff (JL) = 1. - lai_cur / lai_lim + END IF + + END IF + + ! limit to valid range [0,1] + lai_eff(JL) = MAX( 0., MIN( 1., lai_eff(JL) ) ) + + END IF ! if idust=1 + + !--------------------------------------------------------------------------------------- + ! Lowering the threshold friction velocity depending on the presence of cultivations + !--------------------------------------------------------------------------------------- + ! Factors according to dsf increase seen in data ** + !--------------------------------------------------------------------------------------- + umin2(JL) = umin + ! + !--------------------------------------------------------------------------------------- + IF( icult(JL) <= 0.5 .AND. icult(JL) > 0.08 ) THEN + IF( desert(JL) > 0. .OR. tv_dat(16) > 0.5 .OR. tv_dat(17) > 0.5 ) & + umin2(JL) = umin * 0.93 + ! + !--------------------------------------------------------------------------------------- + IF( tv_dat(2) > 0.5 .OR. tv_dat(7) > 0.5 ) & + umin2(JL) = umin * 0.99 + END IF !cult=2 + + ! + !--------------------------------------------------------------------------------------- + IF( icult(JL) > 0.5 ) THEN + IF( ( desert(JL) > 0 ) .OR. ( tv_dat(16) > 0.5 ) .OR. ( tv_dat(17) > 0.5 ) ) & + umin2(JL) = umin * 0.73 + END IF !cult=1 + !--------------------------------------------------------------------------------------- + ! Daily z0 and efficient fraction feff + !--------------------------------------------------------------------------------------- + + i_s1 = INT( SOIL_TYPE(JL) ) ! soil type index for the calcl. of horiz. dust flux + IF( i_s1 == 0 ) i_s1 = 9 ! set it the same as ice if the soil type is not defined + !PAERFLX(JL,3,2)=i_s1 + ! Roughness length [cm] of the surface without obstacles, i.e. of the smooth surface: + Z0S = 0.001 !! en cm, these Marticorena p.85 ! optimum value for the calculation of energy loss + + + ! Soil-type dependent saltation efficiency, + ! i.e. the ratio between vertical and horizontal fluxes, + ! (see Eq. (42) in MB95; Eq. (3) in Heinold et al.): + + alpha(JL) = solspe(i_s1,nmode*3+1) + !PAERFLX(JL,3,4)=alpha(JL) !=2 on land + + ! for now moist is not included but when it is done then: + + !--------------------------------------------------------------------------------------- + ! Calculation of the threshold soil moisture (w') [Fecan, F. et al., 1999] + !--------------------------------------------------------------------------------------- + ! when moist is included !!!!!!!!!!!!!!!!!! + ! w_str(j,i,1) = 0.0014*(solspe(i_s1,nmode*3)*100)**2 + 0.17*(solspe(i_s1,nmode*3)*100) + ! W0 = 0.99 ! used by Bernd solspe(i_s1,nmode*3+2) + feff = 0. + ! * partition of energy between the surface and the elements of rugosity * + ! these pp 111-112 + + IF( Z0(JL) <= 0. ) THEN ! if there are no info on z0 and no potential sources + Z0(JL) = 1. ! then z0 is set to 1 and no dust can be produced + feff = 0. + ELSE + !>>> TvN + ! Use minimum value for roughness length. + ! VH convert PZ0M from [m] to [cm] + !z0(JL) = z0_min !max(z0_min,PZ0M(JL)*100._JPRB ) + Z0(JL) = max(z0_min,Z0(JL)) + !write(3000,*)z0(JL),z0_min + !<<< TvN + ! Eq. (20) in MB95: + AAA = LOG( z0(JL) / Z0S ) + BB = LOG( aeff * (xeff / Z0S)**0.8) + !write(5547,*)aeff,xeff,z0s + CCC = 1. - AAA/BB + ! * partition between Z01 and Z02 * which are z0 of larger stone which cannot be mobilized + FF = 1. ! we do not separate roughness length between soil which + ! gives dust and solid material which is not mobilised + ! total efficient friction velocity ratio: + feff = FF * CCC + !!PAERFLX(JL,6,1) = feff + !!PAERFLX(JL,6,2) = AAA + !!PAERFLX(JL,6,3) = BB + !!PAERFLX(JL,6,4) = CCC + ! restrict to [0,1] + feff = MIN( 1., feff ) + feff = MAX( 0., feff ) + END IF + + c_eff(JL) = feff ! scaling parameter for the threshold friction velocity + + ! due to energy loss + !--------------------------------------------------------------------------------------- + END DO ! JL + !--------------------------------------------------------------------------------------- + ! End of daily base calculations + +!VH END IF ! newday + + ! reset flux masses + flux_ai(KIDIA:KFDIA) = 0. + flux_ci(KIDIA:KFDIA) = 0. + + DO JL = KIDIA,KFDIA + + !-- initialisation of the fields + ! size: ntraced + fluxtot = 0. + fdust = 0. + + + !----- -------------------------------------------------------------------------- + ! Calculation of dust emission flux + ! dependent on the 3 hourly wind fields + !---------------------------------------------------------------------- + IF( c_eff(JL) > 0. ) THEN + + ! Calculation of ustar + + ! AS: initialise ustar (for those cases where if statement(s) are not fulfilled) + ustar = 0. + + IF( PLSM(JL) > 0. ) THEN + ! wind10m = SQRT(u10m_dat(iglbsfc)%data(JL,1)**2 + & + ! v10m_dat(iglbsfc)%data(JL,1)**2) * 100. ! cm/s + ustar = (vKarman * PWIND(JL)*100._JPRB) / ( log( ZZ / Z0(JL) ) ) ! cm/s + ENDIF + + IF( Ustar > 0 .AND. (Ustar > umin2(JL) / c_eff(JL)) ) THEN + + !>>> TvN + rho_air = SP(JL)/PTL(JL)*airfac ! g/cm3 + airdens_ratio = rho_air/roa + airdens_ratio2 = sqrt(roa/rho_air) + !<<< TvN + + !-- initialisation of the fields + ! size: ntraced + !dbmin = 0. + !dbmax = 0. + ! size: nclass + fluxtyp = 0. + + + ! soil type index for the calcl. of horiz. dust flux + i_s1 = INT( SOIL_TYPE(JL) ) + ! set it the same as ice + IF( i_s1 == 0 ) i_s1 = 9 + ! to separate from now on between saltation and mobilisation + i_s11 = i_s1 + ! to separate between mobilisation and saltation and dust particles + IF( i_s1 == 10 .OR. i_s1 == 12 ) i_s11 = 11 + kk = 0 + dp = Dmin + DO WHILE( dp <= Dmax+1E-5) + kk = kk+1 + uthp = uth(kk) * umin2(JL) / umin * u1fac !reduce saltation threshold for cultivated soils + !>>> TvN + ! Include correction factor for variable air density + uthp = uthp * airdens_ratio2 + !<<< TvN + + ! See Eq. (28) in MB95; Eq. (6) in Tegen et al.; Eq. (2) in Heinold et al. + ! Note that (1+R)^2 * (1-R) = (1+R) * (1-R^2) + fdp1 = (1.-(Uthp/(c_eff(JL) * Ustar))) ! component of the horiz. flux + fdp2 = (1.+(Uthp/(c_eff(JL) * Ustar)))**2. ! + + IF( fdp1 > 0 .AND. fdp2 > 0) THEN + + ! vertical flux dust weighted by the surface area relative to each soil type + flux_diam = srel(i_s1,kk) * fdp1 * fdp2 * cd * Ustar**3 * alpha(JL) + !>>> TvN + ! Include correction factor for variable air density + flux_diam = flux_diam * airdens_ratio + !<<< TvN + + !---------------------------------------------------------------------- + ! all particles even the small ones can be mobilised by saltation + !---------------------------------------------------------------------- + dbstart = dmin + + IF( dbstart >= dp ) THEN + fluxtyp(kk) = fluxtyp(kk) + flux_diam + ELSE + !---------------------------------------------------------------------- + ! loop over dislocated dust particle sizes + !---------------------------------------------------------------------- + dpd = dmin + kkk = 0 + kfirst = 0 + DO WHILE( dpd <= dp+1e-5 ) + kkk = kkk + 1 + IF( dpd >= dbstart ) THEN ! the particles produced by saltation are put + IF( kfirst == 0 ) kkmin = kkk ! in finer bins + kfirst = 1 + !---------------------------------------------------------------------- + ! scaling with relative contribution of dust size fraction + ! we take into account the volume contribution of the particle types: + ! all the particles from soil type 10 are put into the 11 soil type when + ! we are in the production region + !---------------------------------------------------------------------- + IF( kk > kkmin ) THEN + ! remember: i_s11 puts the mobilised + fluxtyp(kkk) = fluxtyp(kkk) + flux_diam * srelV(i_s11,kkk) / & + (su_srelV(i_s11,kk) - su_srelV(i_s11,kkmin) ) + ! particles in smaller bins + END IF !kk.gt.kmin + END IF !dpd.gt.dbstart + dpd = dpd * EXP(dstep) + END DO !dpd + !---------------------------------------------------------------------- + ! end of saltation loop + !---------------------------------------------------------------------- + END IF !dbstart.lt.dp + + END IF !fdp1 + + dp = dp * EXP(Dstep) + + END DO !dp + !---------------------------------------------------------------------- + ! assign fluxes to bins: flux is in g cm-2 s-1 for each bin + ! 192 sub-bins are put into 8 bins + !---------------------------------------------------------------------- + dp = dmin + dlast = dmin + nn = 1 + kk = 0 + DO WHILE( dp <= dmax+1e-5 ) + kk = kk+1 + ! add to total + IF( nn <= ntraced ) fluxtot(nn) = fluxtot(nn) + fluxtyp(kk) + + IF( MOD(kk,nbin) == 0 ) THEN + !dbmax(nn) = dp * 10000. * 0.5 !radius in um + !dbmin(nn) = dlast * 10000. * 0.5 + !dpk(nn) = SQRT( dbmax(nn) * dbmin(nn) ) + nn = nn+1 + dlast = dp + END IF + + dp = dp * EXP(Dstep) + + END DO !dp + + END IF !ustar + END IF !c_eff + + ! Masking the area covered by snow, vegetation and [...?...] + cultfac1 = 1. + + DO nn = 1, ntraced + ! fluxtot: g/cm2/sec + ! MASK: Effective area determined by cultfac1/snow + fdust(nn) = fluxtot(nn) * cultfac1 * (1.-snowcover(JL)) + + ! MASK: Effective area determined by fpar: + + fdust(nn) = fdust(nn) * lai_eff(JL) ! turn off vegetation limitation here! + ! TvN: an alternative approach based on surface roughness + ! is applied by Laurent et al. (JGR, 2006). + + + ! MASK: Soil moisture threshold, using w0 + ! when moisture is included !!!!!!!!!!!!!!!!!! + ! IF(qrsur(JL).GE.w0) THEN + ! fdust(JL,nn)=0. + ! END IF + !soil size distribution + ! Through all soil particle diameter the calculation of the relative contribution + ! in surface and volume of the soil population independently of the grid + END DO + ! ------------------------------------------------------------------------------ + ! Grouping into 2 modes: 1sec accumulation + ! + !>>> TvN + ! Accumulation + flux_r1 = 0. + DO nn = min_ai, max_ai + !flux_ai(JL) = flux_ai(JL) + fdust(nn) + flux_r1 = flux_r1 + fdust(nn) + END DO + + ! Coarse + flux_r2 = 0. + DO nn = min_ci, max_ci + !flux_ci(JL) = flux_ci(JL) + fdust(nn) + flux_r2 = flux_r2 + fdust(nn) + END DO + + ! The solution of the system of linear equations + ! (see comments above). + ! For special conditions, + ! the solution can give a negative mass flux + ! in either the accumulation or coarse mode. + ! In those case, all mass is put into + ! the other mode. + + !units : + ! + + flux_ai(JL) = flux_r1 - ratio_coa * flux_r2 + flux_ci(JL) = flux_r2 - ratio_acc * flux_r1 + IF (flux_ai(JL) .gt. 0. .AND. flux_ci(JL) .gt. 0.) THEN + flux_ai(JL) = flux_ai(JL) * denom_acc_inv + flux_ci(JL) = flux_ci(JL) * denom_coa_inv + ELSEIF (flux_ai(JL) .lt. 0.) THEN + flux_ai(JL) = 0. + flux_ci(JL) = (flux_r1 + flux_r2) * mf_coa_r12_inv + ELSEIF (flux_ci(JL) .lt. 0.) THEN + flux_ai(JL) = (flux_r1 + flux_r2) * mf_acc_r12_inv + flux_ci(JL) = 0. + ENDIF + !<<< TvN + + ! now scale the emissions + ! convert from g/cm2/s to g/m2/s to kg/m2/s + flux_ai(JL) = flux_ai(JL) * 1.E01 *DCAL + flux_ci(JL) = flux_ci(JL) * 1.E01 *DCAL + + !---------------------------------------------------------- + ! Ensure fluxes are non-negative + IF (flux_ai(JL) < 0.0_JPRB) THEN + flux_ai(JL) = 0.0_JPRB + END IF + IF (flux_ci(JL) < 0.0_JPRB) THEN + flux_ci(JL) = 0.0_JPRB + END IF + + + !------------------------------------------------------------------------------- + ! Calculating number flux (#/m2/sec) + ! (kg/m2/s) / g/cm3 *cm3 = (kg/s)/g *1e3 = #/m2/s = + ! Accumulation + fnum_ai(JL) = 1e3*flux_ai(JL) * 3. / (4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2) + ! Coarse + fnum_ci(JL) = 1e3*flux_ci(JL) * 3. / (4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2) + + IF (fnum_ai(JL) < 0.0_JPRB) THEN + fnum_ai(JL)= 0.0_JPRB + END IF + IF (fnum_ci(JL) < 0.0_JPRB) THEN + fnum_ci(JL)= 0.0_JPRB + END IF + ! ------------------------------ + ! accumulation mode + ! number + emis_number(mode_aci)%d3(JL,KLEV,1) = emis_number(mode_aci)%d3(JL,KLEV,1) +fnum_ai(JL) + + ! mass + emis_mass(mode_aci)%d3(JL,KLEV,1) = emis_mass(mode_aci)%d3(JL,KLEV,1) +flux_ai(JL) + ! ------------------------------ + ! coarse mode + ! number + emis_number(mode_coi)%d3(JL,KLEV,1) = emis_number(mode_coi)%d3(JL,KLEV,1) + fnum_ci(JL) + ! mass + emis_mass(mode_coi)%d3(JL,KLEV,1) = emis_mass(mode_coi)%d3(JL,KLEV,1)+flux_ci(JL) + ENDDO + +ELSE IF (NDDUST == 3 ) THEN ! case ECMWF formulation +!ZDDUAER(:) = 1.00_JPRB +!KBINDD=3 + +RDDUAER(:) = 0.0_JPRB +RDDUSRC(:)= 0.0_JPRB +NDUSRCP(:) = 1 +RDUSRCP(:,:) = 0.0_JPRB + +!* Default values for RDDUAER +RDDUAER(1)=1.0_JPRB +RDDUAER(2)=1.0_JPRB +RDDUAER(3)=0.5_JPRB +RDDUAER(4)=0.6_JPRB +RDDUAER(5)=0.6_JPRB +RDDUAER(6)=1.0_JPRB +RDDUAER(7)=1.0_JPRB +RDDUAER(8)=1.0_JPRB +RDDUAER(9)=1.0_JPRB +RDDUAER(10)=1.0_JPRB +RDDUAER(11)=1.0_JPRB +RDDUAER(12)=1.0_JPRB +RDDUAER(13)=0.0_JPRB +RDDUAER(14)=0.2_JPRB +RDDUAER(15)=0.5_JPRB +RDDUAER(16)=1.0_JPRB +RDDUAER(17)=1.0_JPRB +RDDUAER(18)=0.5_JPRB +RDDUAER(19)=0.5_JPRB +RDDUAER(20)=0.8_JPRB +RDDUAER(21)=1.2_JPRB +RDDUAER(22)=1.5_JPRB +RDDUAER(23)=1.5_JPRB +RDDUAER(24)=0.5_JPRB +RDDUAER(25)=1.0_JPRB +RDDUAER(26)=0.5_JPRB +RDDUAER(27)=1.0_JPRB +RDDUAER(28)=0.5_JPRB +RDDUAER(29)=1.0_JPRB +RDDUAER(30)=1.0_JPRB +RDDUAER(31)=0.1_JPRB +RDDUAER(32)=0.1_JPRB +RDDUAER(33)=0.3_JPRB +RDDUAER(34)=0.8_JPRB +RDDUAER(35)=0.5_JPRB +RDDUAER(36)=0.4_JPRB +RDDUAER(37)=0.6_JPRB + +!* default reference values for threshold speed and reference particle radius +! -- 1 N & S America, Europe +RDUSRCP(1,1) = 6.0_JPRB +RDUSRCP(1,2) = 5.0_JPRB +! -- 2 Russia, Urals +RDUSRCP(2,1) = 6.0_JPRB +RDUSRCP(2,2) = 5.0_JPRB +! -- 3 Africa, Sahara, S. Africa +RDUSRCP(3,1) = 6.0_JPRB +RDUSRCP(3,2) = 5.0_JPRB +! -- 4 Australasia +RDUSRCP(4,1) = 4.0_JPRB +RDUSRCP(4,2) = 5.0_JPRB +! -- 5 Asian deserts +RDUSRCP(5,1) = 3.5_JPRB +RDUSRCP(5,2) = 5.0_JPRB +! -- 6 dry lands of S.America +RDUSRCP(6,1) = 4.0_JPRB +RDUSRCP(6,2) = 5.0_JPRB +! -- 7 the rest (Japan, Greenland, Antarctica) +RDUSRCP(7,1) = 4.0_JPRB +RDUSRCP(7,2) = 5.0_JPRB +RDDUSRC(1)=0.3_JPRB +RDDUSRC(2)=0.8_JPRB +RDDUSRC(3)=5.5_JPRB +!-- default values are for use of 10-m wind as predictor for SS and DU +!RFCTDU = 1.0_JPRB +!RFCTSS = 1.0_JPRB +!* New defaults taken from previous namelist; stj - 27-10-2010 +!RFCTDUR = 1.0_JPRB +!RFCTSSR = 1.0_JPRB +!!$CLAERWND(0) = '10-M WIND AS PREDICTOR FOR SS AND DU ' +!!$CLAERWND(1) = 'PREDICTORS: WIND GUST FOR SS, 10M-WIND FOR DU' +!!$CLAERWND(2) = 'PREDICTORS: WIND GUST FOR DU, 10M-WIND FOR SS' +!!$CLAERWND(3) = 'WIND GUST AS PREDICTORS FOR SS AND DU ' + + + !* 0.6 EMPIRICAL EFFICIENCY FACTORS FOR SOURCES +! ---------------------------------------- +! N.B.: Security parameters +ZEPSISS=1.E-09_JPRB +ZEPSIDD=1.E-12_JPRB +ZEPSIRA=1.E-06_JPRB +ZEPSISS=0.E+00_JPRB +ZEPSIDD=0.E+00_JPRB +ZEPSIRA=0.E+00_JPRB +ZEPSSNO=1.E-03_JPRB +ZEPSARE=1.E-03_JPRB + +!PAERMAP(KIDIA:KFDIA,1:5) = 0._JPRB +DO JL=KIDIA,KFDIA + ZLAT=PGLAT(JL) + ZLON=PGLON(JL) + ZBNDA= 30._JPRB+(36._JPRB -ZLAT)*14._JPRB/24._JPRB + ZBNDB= 30._JPRB+(36._JPRB -ZLAT)*40._JPRB/16._JPRB + ZBNDC= 38._JPRB+(ZLON-124._JPRB)*12._JPRB/29._JPRB + ZBNDD= 32._JPRB-(ZLON-243._JPRB)* 6._JPRB/21._JPRB + +!-- Eastern border Canada/USA + ZBNDE= 49._JPRB + IF (ZLON > 268._JPRB .AND. ZLON < 277._JPRB) THEN + ZBNDE= 49._JPRB-(ZLON-268._JPRB)*7._JPRB/9._JPRB + ELSEIF (ZLON >= 277._JPRB .AND. ZLON < 285._JPRB) THEN + ZBNDE= 42._JPRB+(ZLON-277._JPRB)*2._JPRB/8._JPRB + ELSEIF (ZLON >= 285._JPRB .AND. ZLON < 310._JPRB) THEN + ZBNDE= 44._JPRB+(ZLON-285._JPRB)*3._JPRB/25._JPRB + ENDIF + +!-- limits Britain + ZLONGB=-9999._JPRB + IF (ZLON > 354._JPRB .AND. ZLON < 360._JPRB) THEN + ZLONGB=ZLON + ELSEIF (ZLON >= 0._JPRB .AND. ZLON < 3._JPRB) THEN + ZLONGB=ZLON+360._JPRB + ENDIF + ZBNDF= 47._JPRB+(ZLONGB-349._JPRB)*4.5_JPRB/14._JPRB + +!-- limits Ireland + ZBNDG= 61._JPRB-(ZLON-349._JPRB)*7._JPRB/6._JPRB + ZBNDH= 45._JPRB+(ZLON-349._JPRB)*9._JPRB/6._JPRB + +!-- Western border Brazil + IF (ZLAT <= 4._JPRB .AND. ZLAT > 2._JPRB) THEN + ZBNDI= 296._JPRB + ELSEIF (ZLAT <= 2._JPRB .AND. ZLAT > -4._JPRB) THEN + ZBNDI= 290._JPRB + ELSEIF (ZLAT <= -4._JPRB .AND. ZLAT > -7._JPRB) THEN + ZBNDI= 290._JPRB-(-4._JPRB-ZLAT)*4._JPRB/3._JPRB + ELSEIF (ZLAT <= -7._JPRB .AND. ZLAT > -11._JPRB) THEN + ZBNDI= 286._JPRB+(-7._JPRB-ZLAT)*4._JPRB/4._JPRB + ENDIF + + IF (ZLAT <= -11._JPRB .AND. ZLAT > -18._JPRB) THEN + ZBNDJ= 294._JPRB+(-11._JPRB-ZLAT)*8._JPRB/7._JPRB + ELSEIF (ZLAT <= -18._JPRB .AND. ZLAT > -27._JPRB) THEN + ZBNDJ= 302._JPRB+(-18._JPRB-ZLAT)*4._JPRB/9._JPRB + ELSEIF (ZLAT <= -27._JPRB .AND. ZLAT > -30._JPRB) THEN + ZBNDJ= 306._JPRB-(-27._JPRB-ZLAT)*3._JPRB/3._JPRB + ELSEIF (ZLAT <= -30._JPRB .AND. ZLAT >= -34._JPRB) THEN + ZBNDJ= 303._JPRB+(-30._JPRB-ZLAT)*4._JPRB/4._JPRB + ENDIF + +!-- Northern border India + IF (ZLON > 70._JPRB .AND. ZLON <= 90._JPRB) THEN + ZBNDK= 35._JPRB-(ZLON-70._JPRB)*0.5_JPRB + ENDIF + +!-- South border of Asian deserts + IF (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) THEN + ZBNDL= 25._JPRB+(ZLON-90._JPRB)*15._JPRB/45._JPRB + ENDIF + +!-- North limit of the Argentinian pampas + IF (ZLON > 285._JPRB .AND. ZLON <= 297._JPRB) THEN + ZBNDM= -42._JPRB+(ZLON-285._JPRB)*6._JPRB/12._JPRB + ENDIF + + IFF=0 + ITYPDU=0 + +!-- North America +! ITYPDU=1 +!----- Canada + IF ( ZLAT >= ZBNDE .AND.& + & (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=1 +!----- USA + ELSEIF ( (ZLAT >= ZBNDD .AND. ZLAT < ZBNDE )& + & .AND. (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=3 + ENDIF +!-- Alaska + IF ( (ZLAT < 72._JPRB .AND. ZLAT > 52._JPRB)& + & .AND. (ZLON > 190._JPRB .AND. ZLON <= 219._JPRB) ) THEN + IFF=2 + ENDIF + +!-- Central America + IF (ZLAT < ZBNDD .AND.& + & (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=4 + ENDIF + +!-- South America + IF ( ZLAT < 12._JPRB .AND.& + & (ZLON > 190._JPRB .AND. ZLON < 330._JPRB) ) THEN + IFF=5 + ENDIF +!-- Brazil + IF ( (ZLAT <= 4._JPRB .AND. ZLAT > 2._JPRB)& + & .AND. (ZLON >= 296._JPRB .AND. ZLON <= 300._JPRB) ) THEN + IFF=6 + ENDIF + IF (ZLAT <= 2._JPRB .AND. ZLAT > -11._JPRB) THEN + IF (ZLON >= ZBNDI .AND. ZLON < 330._JPRB) THEN + IFF=6 + ENDIF + ENDIF + IF (ZLAT <= -11._JPRB .AND. ZLAT >= -34._JPRB) THEN + IF (ZLON >= ZBNDJ .AND. ZLON < 330._JPRB) THEN + IFF=6 + ENDIF + ENDIF + +!-- Western Europe + IF ( ZLAT > 36._JPRB .AND. ( ZLON >= 330._JPRB .OR. ZLON <= 30._JPRB) ) THEN + IFF=10 + ENDIF + +!----- Iceland + IF ( (ZLAT < 67._JPRB .AND. ZLAT > 63._JPRB)& + & .AND. ( ZLON > 335._JPRB .AND. ZLON < 353._JPRB) ) THEN + IFF=7 + ENDIF +!----- Britain + IF ( (ZLAT < 63._JPRB .AND. ZLAT > ZBNDF)& + & .AND. ( ZLON > 354._JPRB .OR. ZLON < 3._JPRB) ) THEN + IFF=9 + ENDIF +!----- Ireland + IF ( (ZLAT < ZBNDG .AND. ZLAT > ZBNDH)& + & .AND. ( ZLON > 349._JPRB .AND. ZLON < 355._JPRB) ) THEN + IFF=8 + ENDIF + ITYPDU=1 + IF ( (IFF >= 1 .AND. IFF <= 10) .OR. IFF == 16) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=2 +!-- Russia to Urals + IF ( ZLON > 30._JPRB .AND. ZLON <= 70._JPRB ) THEN + IF ( ZLAT > 51._JPRB ) THEN + IFF=11 + ELSEIF ( ZLAT > 36._JPRB ) THEN + IFF=12 + ENDIF + ENDIF + ITYPDU=2 + IF ( IFF >= 11 .AND. IFF <= 12 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=3 +!-- Northern Sahara +! if ( ( zlat <= 36._JPRB .and. zlat >= 21._JPRB) & +! & .and. ( zlon >= 330._JPRB .or. zlon <= zbnda) ) then +! iff=13 +!-- Northern Sahara (West) + IF ( ( ZLAT <= 36._JPRB .AND. ZLAT >= 21._JPRB)& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON < 2._JPRB) ) THEN + IFF=36 +!-- Northern Sahara (East) + ELSEIF ( ( ZLAT <= 36._JPRB .AND. ZLAT >= 21._JPRB)& + & .AND. ( ZLON >= 2._JPRB .OR. ZLON <= ZBNDA) ) THEN + IFF=37 +!-- Southern Sahara (West) + ELSEIF ( ( ZLAT < 21._JPRB .AND. ZLAT >= 12._JPRB)& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON < 8._JPRB) ) THEN + IFF=34 +!-- Southern Sahara (East) + ELSEIF ( ( ZLAT < 21._JPRB .AND. ZLAT >= 12._JPRB)& + & .AND. ( ZLON >= 8._JPRB .AND. ZLON <= ZBNDA) ) THEN + IFF=35 +!-- Central Africa + ELSEIF ( ( ZLAT < 12._JPRB .AND. ZLAT >= -12._JPRB)& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON <= 60._JPRB) ) THEN + IFF=14 +!-- Southern Africa + ELSEIF ( ZLAT < -12._JPRB .AND. ZLAT >= -60._JPRB& + & .AND. ( ZLON >= 330._JPRB .OR. ZLON <= 60._JPRB) ) THEN + IFF=15 + ENDIF + ITYPDU=3 + IF ( (IFF >= 13 .AND. IFF <= 15) .OR. (IFF >= 34 .AND. IFF <= 37) ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=4 +!-- Australasia + IF (ZLON > 70._JPRB .AND. ZLON <= 190._JPRB) THEN + IFF=26 + +!-- Siberia + IF (ZLAT <= 90._JPRB .AND. ZLAT > 51._JPRB) THEN + IFF=16 + +!-- South Australasia +!---- Tropical Pacific Islands + ELSEIF ( ZLAT > -10.5_JPRB) THEN + IFF=27 +!---- Australia + ELSEIF ( ZLAT <= -10.5_JPRB .AND. ZLAT >= -60._JPRB) THEN + IFF=28 + ENDIF + ENDIF + ITYPDU=4 + IF ( IFF >= 26 .AND. IFF <= 28 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +! ITYPDU=5 +!-- Asian deserts + IF (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) THEN + IF (ZLAT <= 51._JPRB .AND. ZLAT > ZBNDL) THEN + IFF=17 + ENDIF + ENDIF + +!-- Saudi Arabia + IF ((ZLAT <= 36._JPRB .AND. ZLAT >= 12._JPRB)& + & .AND.( ZLON > ZBNDA .AND. ZLON < ZBNDB) ) THEN + IFF=18 + ENDIF +!-- Irak, Iran, Pakistan + IF ((ZLAT <= 36._JPRB .AND. ZLAT >= 20._JPRB)& + & .AND.( ZLON > ZBNDB .AND. ZLON < 70._JPRB) ) THEN + IFF=19 + ENDIF + +!-- Central Asia and India + IF ( ZLON > 70._JPRB .AND. ZLON <= 90._JPRB) THEN +!----- Central Asia: Taklamakan + IF (ZLAT <= 43._JPRB .AND. ZLAT >= ZBNDK) THEN + IFF=20 +!----- India + ELSEIF (ZLAT <= ZBNDK .AND. ZLAT > 7._JPRB) THEN + IFF=21 + ENDIF + ENDIF +!-- other Gobi(s) in South Mongolia and Central China + IF ( ZLAT <= 49._JPRB .AND. ZLAT > 35._JPRB) THEN + IF (ZLON > 90._JPRB .AND. ZLON <= 110._JPRB) THEN + IFF=22 + ELSEIF (ZLON > 110._JPRB .AND. ZLON <= 125._JPRB) THEN + IFF=23 + ENDIF + ENDIF + +!-- South China + IF (ZLON > 90._JPRB .AND. ZLON <= 135._JPRB) THEN + IF (ZLAT <= ZBNDL .AND. ZLAT > 7._JPRB) THEN + IFF=24 + ENDIF + ENDIF + ITYPDU=5 + IF ( IFF >= 17 .AND. IFF <= 24 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + + +! ITYPDU=7 +!-- Japan and S.Korea + IF ( (ZLON > 124._JPRB .AND. ZLON < 153._JPRB)& + & .AND. (ZLAT > 24._JPRB .AND. ZLAT < ZBNDC) ) THEN + IFF=25 + ENDIF + +!-- Greenland + IF (ZLAT > 50._JPRB) THEN + ZINCLAT=(90._JPRB-ZLAT)/40._JPRB*45._JPRB + ZLONW=270._JPRB +ZINCLAT + ZLONE=360._JPRB -ZINCLAT + IF ( ZLON > ZLONW .AND. ZLON < ZLONE ) THEN + IFF=29 + ENDIF + ENDIF + +!-- Antarctica + IF (ZLAT < -60._JPRB) THEN + IFF=30 + ENDIF + ITYPDU=7 + IF ( (IFF >= 29 .AND. IFF <= 30) .OR. IFF == 25 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + +!-- awaiting a proper recoding, new areas are set between iff=31 and 35 +! ITYPDU=6 + IF ( ZLON > 285._JPRB .AND. ZLON < 295._JPRB) THEN +!- Atacama desert and Salar de Uyuni + IF ( ZLAT < -16._JPRB .AND. ZLAT > -28._JPRB) THEN + IFF=31 + ENDIF +!- Salar de Pipanaco and other small ones + IF ( ZLAT <= -28._JPRB .AND. ZLAT > ZBNDM) THEN + IFF=32 + ENDIF + ENDIF +!- Argentinian pampas + IF (ZLON > 285._JPRB .AND. ZLON < 297._JPRB) THEN + IF ( ZLAT <= ZBNDM ) THEN + IFF=33 + ENDIF + ENDIF + ITYPDU=6 + IF ( IFF >= 31 .AND. IFF <= 33 ) THEN + NDUSRCP(IFF)=ITYPDU + ENDIF + + IF (IFF /= 0) THEN + PAERMAP(JL,1)=IFF*PLSM(JL) ! area index + PAERMAP(JL,3)=RDUSRCP(NDUSRCP(IFF),1) ! reference speed + PAERMAP(JL,4)=RDUSRCP(NDUSRCP(IFF),2) ! reference particule radius + DO JAER=1,KBINDD + !ZDUEMPOT(JL,JAER)=RDDUAER(IFF)*RDDUSRC(IFF,JAER)*PLSM(JL) ! dust emission potential factor (including land-sea mask) + ZDUEMPOT(JL,JAER)=RDDUAER(IFF)*RDDUSRC(JAER)*PLSM(JL) ! dust emission potential factor (including land-sea mask) + ENDDO + PAERMAP(JL,2)=ZDUEMPOT(JL,1) ! for diagnostics only + ELSE + !WRITE(NULOUT,FMT='(''aer_src: Unassigned grid for Lat,Lon='',2F8.2)') ZLAT,ZLON + PAERMAP(JL,:)=0._JPRB + ENDIF +ENDDO + + +!----------------------------------------------------------------------- + +!* 0.3 SURFACE WIND VARIABLE RELEVANT FOR SS AND DU EMISSIONS +! ------------------------------------------------------ + +!!$IF (NAERWND == 0) THEN +!!$!-- no gust accounted for +!!$ ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ELSEIF (NAERWND == 1) THEN +!!$!-- gust only for SS, 10-m wind for DU +!!$ ZWNDDU(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ELSEIF (NAERWND == 2) THEN +!!$!-- gust only for DU, 10-m wind for SS +!!$ ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PWIND(KIDIA:KFDIA) +!!$ELSEIF (NAERWND == 3) THEN +!!$!-- gust for both SS and DU +!!$ ZWNDDU(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA) = PAERGUST(KIDIA:KFDIA) +!!$ENDIF + +! correction to account for the decrease of mean wind and gusts with decreasing +! time step +!!$IF (PTSPHY < 1000) THEN +!!$ ZWNDDU(KIDIA:KFDIA)=1.06_JPRB*ZWNDDU(KIDIA:KFDIA) +!!$ ZWNDSS(KIDIA:KFDIA)=1.08_JPRB*ZWNDSS(KIDIA:KFDIA) +!!$ENDIF +ZRWPWP=PRWPWP +ZRWSAT=PRWSAT +!* 2.0 DESERT DUST +! ----------- + +!- Simplistic lifting from surface based on 10-m wind and surface albedo +ZHDD=MAX(1.0_JPRB,8434._JPRB/1000._JPRB) + +!PAERLIF(KIDIA:KFDIA,1:9)=0._JPRB +!PAERFLX(KIDIA:KFDIA,1:12,1:9)=0._JPRB + +ZFLX_SDUST(KIDIA:KFDIA,1:9,1:12)=0._JPRB + + !----------------------------------------------- + + +INBAER=0 +RAERDUB=1.E-11_JPRB + + !- ECMWF dust emission fluxes come in either 3- or 10-size bins + ! 0.03 - 0.55 - 0.9 - 20. + ! 0.03 - 0.06 - 0.12 - 0.24 - 0.48 - 0.96 - 1.92 - 3.84 - 7.68 - 15.36 - 30.72 + + !!-- for potential dust sources, select land points, snow-free, and zero ice, no wet skin cover + !! with fraction of bare soil > 10%, no high vegetation, possible low vegetation < 50% but + !! with soil moisture below moisture corresponding to twice the wilting point (0.171), and + !! a flatish surface (st.dev.orog < 50) with total albedo < 50% + + !-- for potential dust sources, select land points, snow-free, and zero ice, + ! no wet skin cover, with some fraction of bare soil, with test on soil + ! moisture, and a flatish surface (st.dev.orog < 50) with total albedo < 52% + + DO JL=KIDIA,KFDIA +!-- default values for non-land points + LLPDUSTS(JL)=.FALSE. + PAERMAP(JL,5)=0.0_JPRB + ZSCC2(JL)=0._JPRB + ZDEP2(JL)=0._JPRB + ZLTS2(JL)=0._JPRB + IF (PLSM(JL) >= 0.99_JPRB) THEN + ZREFSPD = PAERMAP(JL,3) + ZREFRAD = PAERMAP(JL,4) + ZRADREF = ZREFSPD * ZREFRAD**0.25_JPRB +!-- default min and max of LTS correspond to PWS1 = ZRWPWP and PSW1 = ZRWSAT + ZLTSMIN(JL) = 0.6_JPRB * ZRADREF ! ZFSWET = 0.6 + ZLTSMAX(JL) = 1.2_JPRB * ZRADREF ! ZFSWET = 1.2 + ZSWETN = MIN(1._JPRB, MAX(0.001_JPRB, (PWS1(JL)-ZRWPWP)/(ZRWSAT-ZRWPWP) ) ) + ZFSWET = 1.2_JPRB+0.2_JPRB*LOG10(ZSWETN) +!-- background lifting threshold speed (defined for all land points) + ZLTS2(JL) = MIN( ZLTSMAX(JL), MAX( ZLTSMIN(JL), ZFSWET * ZRADREF )) +!-- replace by simpler test on: +! absence of snow +! flatish surface +! total albedo < 0.52 (no permanent ice) +! type 8 fraction bare soil > 10% +! type 4 cover by dry snow-free low vegetated < 50% +! all other cover types < 0.1% + IF (PSNS(JL) < ZEPSSNO .AND. PHSDFOR(JL) <= 50._JPRB .AND. PALB(JL) < 0.52_JPRB .AND.& + & PFRTI(JL,2) < ZEPSARE .AND. PFRTI(JL,3) < ZEPSARE .AND.&! no ice, no wet skin + & PFRTI(JL,5) < ZEPSARE .AND. PFRTI(JL,6) < ZEPSARE .AND.&! no snow under bare soil-low veg, no dry high veg + & PFRTI(JL,7) < ZEPSARE .AND.&! no snow under high veg + & PFRTI(JL,8) > 0.1_JPRB .AND. PFRTI(JL,4) < 0.5_JPRB ) THEN + + LLPDUSTS(JL)=.TRUE. + + PAERMAP(JL,5)=RAERDUB * ZDUEMPOT(JL,1) ! for diagnostics only + ENDIF + ENDIF + ENDDO + +! ZFLX_SDUST is positive in kg m-2 s-1 +! but ECMWF conventions have PCFLX as a negative upward flux +! input parameters from climatology are: +! -- soil clay content (%) +! dust emission potential (kg s2 m-5) +! lifting thereshold speed (m s-1) +! + DO JAER=1,KBINDD + +!-- surface source of dust is assumed if LLPTDUSTS is true, and/or UVis albedo > 0.11 +! 10m wind > threshold = f(soil wetness, mean particle radius) + DO JL=KIDIA,KFDIA + LLDUST(JL,:)=.FALSE. + ZFLX_SDUST(JL,JAER,1:12)=0._JPRB + +!--------------------------------------------------------------------- +!-- ECMWF formulation + + IF (LLPDUSTS(JL)) THEN + ZDEP2(JL)= RAERDUB * ZDUEMPOT(JL,JAER) + ZSCC2(JL)= 20._JPRB + +!-- Present formulation in MACC (June'11, still kept June'13) +! use a formula of threshold wind velocity modified from Ginoux et al., 2001 +! based on 1st layer soil wetness and an averaged particle radius +!-- All of the above limes computed above + !PAERLIF(JL,JAER)=ZLTS2(JL) ! for diagnostics only + +!- compare surface 10-m wind with threshold wind velocity + + ZWND3(JL) = MAX(0._JPRB, (PWIND(JL)-ZLTS2(JL)) *PWIND(JL)*PWIND(JL) ) + +!- preferred approach: flux is based on MODIS-derived UVis_Alb (0.3-0.7 um) +! IF (LE4ALB) THEN + IF (NALBEDOSCHEME>0) THEN +! IF (PALBD(JL,1) >= 0.20_JPRB .AND. PALBD(JL,1) < 0.55_JPRB ) THEN + IF (PALBD(JL,1) >= 0.08_JPRB .AND. PALBD(JL,1) < 0.55_JPRB ) THEN + ZFLX_SDUST(JL,JAER,3)= ZDEP2(JL) * PALBD(JL,1) * ZWND3(JL) + ENDIF +!-- alternate approach, if MODIS-derived albedo not available, use total albedo + ELSE + ZFLX_SDUST(JL,JAER,3)= ZDEP2(JL) * PALB(JL) * ZWND3(JL) + + ENDIF + + LLDUST(JL,3)=.TRUE. + !PAERFLX(JL,3,JAER) = ZFLX_SDUST(JL,JAER,3) + !write(9504,*)ZFLX_SDUST(JL,JAER,3) + !if (NSTEP==2.or.NSTEP==3 )write(9501,*)JAER,ZDEP2(JL), ZDUEMPOT(JL,JAER),PALB(JL) + !write(9502,*)PALB(JL) + !write(9503,*)ZWND3(JL) + ENDIF + ENDDO +ENDDO + +!-- PCFLX in kg m-2 s-1 + +DO JAER=1,KBINDD + INBAER=INBAER+1 + DO JL=KIDIA,KFDIA + IF (LLDUST(JL,NDDUST) .AND. ZFLX_SDUST(JL,JAER,NDDUST) > 0._JPRB) THEN + ZFLX_SDUST(JL,JAER,NDDUST)=ZFLX_SDUST(JL,JAER,NDDUST) + ENDIF + !PCFLX(JL,KAERO(INBAER))=-ZFLX_SDUST(JL,JAER,NDDUST) * 1.E+00_JPRB + if (JAER<2) then + !---- + ! accumulation mode + ! number + emis_number(mode_aci)%d3(JL,KLEV,1) = emis_number(mode_aci)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3./(4.*RPI*ddust*mmr_ai**3) * EXP(4.5*LOG(sigma(iacci))**2)*1.E+3 + ! mass + emis_mass(mode_aci)%d3(JL,KLEV,1) = emis_mass(mode_aci)%d3(JL,KLEV,1)+ZFLX_SDUST(JL,JAER,NDDUST)!flux_ai(KIDIA:KFDIA) + else if(JAER>=2 )then + + ! ------------------------------ + ! coarse mode + ! number + emis_number(mode_coi)%d3(JL,KLEV,1) = emis_number(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST)* 3./(4.*RPI*ddust*mmr_ci**3) * EXP(4.5*LOG(sigma(icoai))**2)*1.E+3 + ! mass + emis_mass(mode_coi)%d3(JL,KLEV,1) = emis_mass(mode_coi)%d3(JL,KLEV,1) +ZFLX_SDUST(JL,JAER,NDDUST) + end if + ENDDO +END DO +END IF DUSTOPT + + +!-- if no vertical diffusion, distribute the flux in layers with scale height +!-- between half-levels IHTST-1 and KLEV +!!$ IF (.NOT.LVDFTRAC) THEN +!!$ DO JK=IHTST,KLEV +!!$ DO JL=KIDIA,KFDIA +!!$ ZDETAH(JL,JK) = ZETAH(JL,JK)***1.E+03ZHDD - ZETAH(JL,JK-1)**ZHDD +!!$ PTENC(JL,JK,KAERO(INBAER)) = PTENC(JL,JK,KAERO(INBAER))+PCFLX(JL,KAERO(INBAER))*ZDETAH(JL,JK) +!!$ ENDDO +!!$ ENDDO +!!$ ENDIF +!!$ ENDDO + + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC_DUST diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust_init.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust_init.F90 new file mode 100644 index 00000000..513d1c21 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_dust_init.F90 @@ -0,0 +1,231 @@ +SUBROUTINE TM5M7_SRC_DUST_INIT + +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ (updated 23-Jun-2024) │ +! │ Purpose : │ +! │ ------- │ +! │ *tm5m7_src_dust_init* - │ +! │ │ +! │ │ +! │ Interface : │ +! │ --------- │ +! │ *TM5M7_SRC_DUST_INIT* IS CALLED FROM *TM5M7_INIT" │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : Online dust emissions based on Tegen/Vignati/Strunk │ +! │ ------ │ +! │ │ +! │ Please read the section above for background information about the │ +! │ underlying approach. An improved and modified online implementation │ +! │ has been accomplished from which. It can be activated by setting │ +! │ │ +! │ input.emis.dust : ONLINE │ +! │ │ +! │ in the rc-file. An additional netcdf file is needed for some input │ +! │ parameters. The path to which needs to be defined in the key │ +! │ │ +! │ input.emis.dust.dir : │ +! │ /ms_perm/TM/TM5/emissions/other/Dust_online/onlinedust.nc │ +! │ │ +! │ For every time step there will be particles emitted, scaled to monthly │ +! │ amounts (both mass and numbers) in order to keep compliance with │ +! │ assumptions about the aerosol emissions in sedimentation.F90. │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ T. van Noije et al. (?) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ Nov 2011 - Achim Strunk - v0 │ +! │ Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS │ +! │ May. 2024 - R. Checa-Garcia: revision for CY48r1 and refactory │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ +! +USE PARKIND1, ONLY : JPIM , JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMCST, ONLY : RPI, RG + +USE TM5M7_DATA, ONLY : DDUST +USE TM5M7_EMIS_DATA, ONLY : nmode, nats, nclass, solspe, & + & UTH, SREL, SRELV, SU_SRELV, & + & DMIN, DMAX, DSTEP, A_RNOLDS, & + & B_RNOLDS, X_RNOLDS, ROA, D_THRSLD +IMPLICIT NONE + +!----------------------------------------------------------------------- +!* 0.1 ARGUMENTS (None -> shared via TM5M7_DATA and TM5M7_EMIS_DATA) +! --------- +! +!* 0.2 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: NN, ND, NS, KK, NM, NSI, NP +REAL(KIND=JPRB) :: BB, CCC, DDD, EE, FF, DP, XK, STOTAL,STOTALV +REAL(KIND=JPRB) :: SU, SUV, SU_LOC, SU_LOCV, XL, XM, XN, XNV +REAL(KIND=JPRB) :: su_class(nclass), su_classv(nclass), utest(nats) +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',0,ZHOOK_HANDLE) + +! --------------------------------------------- +! read input file ... CHECK HOW TO HANDLE THIS ... +! --------------------------------------------- + +!--------------------------------------------------------------------------------------- +! initializations +!--------------------------------------------------------------------------------------- +uth = 0._JPRB ! Threshold friction velocity +srel = 0._JPRB ! fraction of the grid area correspondent to each soil population +srelV = 0._JPRB ! fraction of volume +su_srelV = 0._JPRB +utest = 0._JPRB + +!--------------------------------------------------------------------------------------- +! (1) Uth calculation +! Threshold friction velocity dependent on the particle diameter (over a smooth surface) +! following Eqs. (3-5) in MB95. +! +! RCHG -> Althought MB consider 0.03 < Re <= 10 values smaller than 0.03 are impossible. +! +! code below can crash if Dmax is not consistent with NCLASS, it is possible that the best +! if NCLASS is large enough this is not a problem but then Uth will have undefined values +! probably the best way is a loop in NN +! +! dp = Dmin +! DO nn=1,NCLASS +! +! BB = a_rnolds * (dp ** x_rnolds) + b_rnolds +! XK = SQRT(ddust * RG *100. * dp / roa) ! grav should be in cm s-2 +! CCC = SQRT(1. + d_thrsld /(dp ** 2.5)) +! IF( BB < 10. ) THEN +! DDD = SQRT(1.928 * (BB ** 0.092) - 1.) +! Uth(nn) = 0.129 * XK * CCC / DDD +! ELSE +! EE = -0.0617 * (BB - 10.) +! FF = 1. -0.0858 * EXP(EE) +! Uth(nn) = 0.12 * XK * CCC * FF +! END IF +! dp = dp * EXP(Dstep) +! IF (dp > Dmax+1e.-05) CALL ABOR1("[TM5M7_SRC_DUST_INIT] NCLASS inconsistent with [Dmin,Dmax]") +! ENDDO +! +! +!--------------------------------------------------------------------------------------- +nn = 0 +dp = Dmin +DO WHILE( dp <= Dmax + 1E-05 ) + nn = nn + 1 + BB = a_rnolds * (dp ** x_rnolds) + b_rnolds + XK = SQRT(ddust * RG *100. * dp / roa) ! grav should be in cm s-2 + CCC = SQRT(1. + d_thrsld /(dp ** 2.5)) + IF( BB < 10. ) THEN + DDD = SQRT(1.928 * (BB ** 0.092) - 1.) + Uth(nn) = 0.129 * XK * CCC / DDD + ELSE + EE = -0.0617 * (BB - 10.) + FF = 1. -0.0858 * EXP(EE) + Uth(nn) = 0.12 * XK * CCC * FF + END IF + dp = dp * EXP(Dstep) +END DO + + +!--------------------------------------------------------------------------------------- +! (2) surface calculation - calculation of the soil size distribution +! Through all soil particle diameter the calculation of the relative contribution +! in surface and volume of the soil population independently of the grid +! RCHG -> probably here the soil mass size distribution is expressed as a sum of ln modes +! which is included in the solspe array where the number of modes is Nmode=4 +! (eq. 29 of MB95) +! solspe for each nats (soil type) has 4 modes and each mode j has +! MMDj (mass median diameter) +! sj (standard deviation) +! rj (relative contribution) +!--------------------------------------------------------------------------------------- +DO ns = 1, nats ! soil types + + Stotal = 0. + StotalV = 0. + su_class = 0. + su_classV = 0. + + kk = 0 + dp = Dmin + DO WHILE( dp <= Dmax + 1.0E-5 ) + kk = kk + 1 + su = 0. + suV = 0. + DO nm = 1, Nmode ! particle size populations in soils + nd = ((nm - 1) *3 ) + 1 ! index to mass median diameter + nsi = nd + 1 ! index to standard deviation + np = nd + 2 ! index to relative contribution + ! + ! based on soil type and contribution of population of the soil type + ! the soil size distribution population is calculated + ! + !>>> TvN + ! Bug in the original code: nd should be np + ! Since solspe(ns,nd) is never zero + ! and the final result is proportional to solspe(ns,np), + ! the bug has no impact on the results. + ! IF (solspe(ns,nd).EQ.0.) THEN + IF (solspe(ns,np).EQ.0. .or. solspe(ns,nsi).EQ.0. .or. solspe(ns,nd).EQ.0.) THEN + !<<< TvN + su_loc = 0. + su_locV=0. + ELSE + xk = solspe(ns,np)/(SQRT(2.* RPI)*LOG(solspe(ns,nsi))) + xl = ( (LOG(dp) - LOG( solspe(ns,nd ) ))**2 ) / & + & (2.*(LOG( solspe(ns,nsi) ))**2 ) + xm = xk * EXP(-xl) ! value of the lognormal mass size distribution + ! dM/dln(dp) in Eq. (29) in MB95 + ! (Aerosol Sci. Technol., 1994) + xn = ddust*(2./3.)*(dp/2.) ! surface + ! cf. the denominator in Eq. (30) in MB95 + ! The factor 2 difference is irrelevant, + ! since only relative contributions are used. + xnV = 1. !volume + su_loc = (xm*Dstep/xn) ! Eq. (30) in MB95 + su_locV = (xm*Dstep/xnV) + END IF ! + su = su + su_loc ! + suV = suV + su_locV + END DO !Nmode + + su_class(kk) = su + su_classV(kk) = suV + Stotal = Stotal + su ! Eq. (31) in MB95 + StotalV = StotalV + suV + dp = dp * EXP(Dstep) + END DO !dp + + DO nn = 1,Nclass + IF (Stotal.EQ.0.)THEN + srel (ns,nn) = 0. + srelV(ns,nn) = 0. + ELSE + srel (ns,nn) = su_class(nn)/Stotal + srelV (ns,nn) = su_classV(nn)/StotalV + utest (ns ) = utest(ns)+srelV(ns,nn) + su_srelV(ns,nn) = utest(ns) + END IF + END DO !j=1,nclass +END DO !ns (soil type) + + +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_DUST_INIT',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC_DUST_INIT + diff --git a/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 new file mode 100644 index 00000000..82f11141 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/tm5m7_src_ss.F90 @@ -0,0 +1,392 @@ +SUBROUTINE TM5M7_SRC_SS & + &( KIDIA, KFDIA, KLON, KLEV, & + & PCI , PCLAKE, PLSM , PSST, PWIND, & + & emis_mass, emis_number, & + & YDEAERSRC) + +!*** * TM5M7_SRC_SS* - SOURCE TERMS FOR SEA SALT AEROSOLS + +!** INTERFACE. +! ---------- +! *TM5M7_SRC_SS* IS CALLED FROM *TM5M7_SRC*. + +! AUTHOR. +! ------- +! +! T. van Noije et al. +! +! SOURCE. +! ------- +! !DESCRIPTION: Calculate emitted numbers and mass as function of the ten-meter +! wind speed as described in Vignati et al. (2010) and Gong +! (2003). Sea salt is emitted in both the soluble accumulation +! mode and the soluble coarse mode. +! +! Ref: Vignati et al. (2010) : Global scale emission and +! distribution of sea-spray aerosol: Sea-salt and organic +! enrichment, Atmos. Environ., 44, 670-677, +! doi:10.1016/j.atmosenv.2009.11.013 +! +! Gong (2003) : A parameterization of sea-salt aerosol source +! function for sub- and super-micron particles, Global +! Biogeochem. Cy., 17, 1097, doi:10.1029/2003GB002079 + +! MODIFICATIONS. +! -------------- +! +! ? ??? 2006 - EV and MK - changed for introducing the sea salt +! source function developed from Gong (2003) in two modes +! ? ??? ???? - AJS - switch from default aerocom emissions to Gong +! parameterisation if 'seasalt_emis_gong' is defined. +! 1 Sep 2010 - Achim Strunk - deleted procedures +! - removed with_seasalt-switch +! - introduced vertical splitting +! 25 Jun 2012 - Ph. Le Sager - adapted for lon-lat MPI domain decomposition +! April 2015 - T. van Noije - modified mode prefactors +! Sep 2020 - V. Huijnen: first (partial) introduction into OpenIFS +!----------------------------------------------------------------------- + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK + +USE YOMCST, ONLY : RPI +USE TM5M7_DATA, ONLY: NMOD, MODE_ACS, MODE_COS, sigma_lognormal, SS_DENSITY +USE TM5M7_EMIS_DATA, ONLY : MODAL_EMISSIONS, radius_ssa, radius_ssc + +USE MO_HAM_M7_EMI_SEASALT, ONLY: seasalt_emissions_gong_SST +USE MO_HAM, ONLY: nseasalt +USE YOEAERSRC, ONLY : TEAERSRC +IMPLICIT NONE + +!----------------------------------------------------------------------- + +!* 0.1 ARGUMENTS +! --------- +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +REAL(KIND=JPRB), INTENT(IN) :: PCI(KLON), PCLAKE(KLON), PLSM(KLON), PSST(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PWIND(KLON) ! 10m wind speed, see tm5m7_src.F90 +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_mass(NMOD) +TYPE(MODAL_EMISSIONS), INTENT(INOUT) :: emis_number(NMOD) +TYPE(TEAERSRC), INTENT(IN) :: YDEAERSRC + +!* 0.5 LOCAL VARIABLES +! --------------- + +INTEGER(KIND=JPIM) :: JL +REAL(KIND=JPRB) :: NORM, XSEA, AREA_FRAC, TT, T_SCALE, DENS, RG1, RG2 +REAL(KIND=JPRB) :: EMIS_FAC(KLON) +REAL(KIND=JPRB) :: NUMBER(KLON), MASS(KLON) + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPRB) :: SSCAL ! switch on/off seasalt emissions + +#include "abor1.intfb.h" +!----------------------------------------------------------------------- + +!----------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',0,ZHOOK_HANDLE) +ASSOCIATE(NOSEASALT => YDEAERSRC%NOSEASALT) +!ASSOCIATE(RSSFLX=>YDEAERSRC%RSSFLX) +IF (NOSEASALT) THEN + SSCAL=0.0_JPRB +ELSE + SSCAL=1.0_JPRB +END IF + +IF (NSEASALT==0) THEN + !>>> TvN + ! The parameterization of Gong (2003) + ! gives the particle number flux as a function + ! of the radius and the 10-m wind speed u_10: + ! dF/dr80 = f(u_10) x g(r80). + ! The dependence on wind speed is given by + ! the power law f(u_10) = u_10^3.41, + ! and does not affect the size distribution. + ! r80 is the radius at 80% humidity, + ! which is almost exactly 2.0 times the dry radius + ! (Lewis and Schwartz, Sea Salt Aerosol Production, 2004). + ! Note also that in Eq. (2) of Gong + ! B is defined in terms of log(10,r) not ln(r). + ! + ! The number mean radii defined in chem_param.F90, + ! i.e. 0.09 um for the accumulation mode, + ! and 0.794 for the coarse mode, + ! were obtained by fitting an accumulation + ! and coarse mode to the dF/dln(r), + ! with r the dry particle radius + ! (see presentation E. Vignati, 21 December 2005). + ! It was verified that the size distribution of Gong + ! can be reasonable well described using these mode radii. + ! + ! It is not totally clear how the corresponding prefactors + ! for the two modes were obtained. + ! One way to calculate these prefactors, + ! is to define two size ranges + ! and require that the numbers of particles emitted + ! in both ranges correspond to Gong + ! This procedure is similar to that used in emission_dust.F90, + ! but for particle number instead of mass. + ! Using ranges r1 and r2 for the dry particle radii + ! with r1 from 0.05 to 0.5 um and r2 from 0.5 to 5 um, + ! the resulting prefactors are 9.62013e-3 and 9.05658e-4 + ! for the accumulation and coarse mode, respectively. + ! These numbers are very close to the values + ! of 9e-3 and 9e-4, obtained by E. Vignati. + ! They are also insensitive to the + ! value used for the upper bound of r2. + ! (Using a value of 10 instead of 5 um, + ! the prefactors would be 9.62536e-3 and 8.91184e-3.) + ! + + norm=1E4 * 1._JPRB * 1._JPRB ! Conversion from #/cm2 to #/m2 + + !TB added zero init in case no sea + emis_fac(:) = 0.0_JPRB + + DO JL=KIDIA,KFDIA + +!VH norm = 1.e4 * dxy11(JL) * sec_month ! Used in TM5.. +!VH but dxy11 is not available.. use unity area and per sec. instead.. + + ! sea fraction + xsea=1.-PLSM(JL) + + ! sea salt is emitted only over sea without ice cover + area_frac = xsea * (1.-PCI(JL)) + !write(6566,*)area_frac,xsea,PCI(JL),PCLAKE(JL) + if (area_frac .LT. 1.e-10_JPRB .or. PCLAKE(JL)>0.0_JPRB) CYCLE + + emis_fac(JL) = norm * area_frac + + ! Wind speed dependence following W10 parameterization + ! of Salisbury et al. (JGR, 2013; GRL, 2014), + ! which replaces the dependence of Gong. + ! Salisbury et al. suggest that "at this stage ... + ! use of W10 is preferable to W37". + ! In TM5, W10 gives better results than W37, + ! which leads to high AOD values compared to MODIS C6, + ! at mid- and high latitudes. + ! The same is true for the wind dependence + ! proposed by Albert et al. (ACPD, 2015). + ! xwind = SQRT(u10m_dat(iglbsfc)%data(JL,1)**2+v10m_dat(iglbsfc)%data (JL,1)**2) + + ! Revert to original wind speed dependence of Monahan et al. (1986) + ! used by Gong (2003): + !emis_fac(JL) = emis_fac(JL) * W10_fac * xwind**W10_exp + emis_fac(JL) = emis_fac(JL) * PWIND(JL)**3.41 + ENDDO + !<<< TvN + + !=================== + ! Accumulation mode + !=================== + + ! emitted numbers + ! --------------- + DO JL=KIDIA,KFDIA + !>>> TvN + ! sea fraction + !xsea=1.-PLSM(JL) + + !xwind=SQRT(u10m_dat(iglbsfc)%data(JL,1)**2+v10m_dat(iglbsfc)%data (JL,1)**2) + + !number(JL) = 0.009*xwind**(3.4269)*1e4*dxy11(j)*xsea*(1.-ci_dat(iglbsfc)%data(JL,1))*sec_month ! #/gridbox/month + number(JL) = emis_fac(JL)*9.62013e-3 ! #/m2/sec + !TB emis_fac includes all the rest but first multiplier + !although dxy11 is not there, assumed 1 earlier, is that correct? + ! multiplier needs an explanation! + ! cm2->m2*land*ice*wind*prefacor (see above) + ! 1e4* (1-PLSM)*(1-pci)* pwind**3.41*9.602e-3 + + !Include temperature dependence following Salter et al. (ACP, 2015). + !We assume that the emissions in our accumulation mode + !follow the temperature dependence of the smallest mode described by Santer et al. + !In reality our mode is in between the smallest and middle mode of Santer et al., + !so the temperature dependence might also be. + !The corresponding third-order polynomial for the smallest mode + !decreases with temperature between -1 and about 15 degC, + !remains almost constant between 15 degC and 25 degC, + !and shows a very small decrease between 25 degC and 30 degC. + !The latter dependence seems an artefact of the fitting procedure, + !and is neglected here. + !As for the coarse mode, + !we rescale the polynomial of Salter et al. + !so that it goes through 1 at some reference temperature, + !which can currently be set to either 15 or 20 degC. + !Because of the small difference between 15 and 20 degC, + !it really doesn't matter which reference value + !is chosen for the accumulation mode. + !This temperature dependency is used to produce + !the pre-industrial aerosol climatology v4.0, + !which is used in all CMIP6 versions of EC-Earth3 that use MACv2-SP, + !and will therefore also be used in EC-Earth3-AerChem. + ! PSST in Kelvin + tt=max(-1.,PSST(JL)-273.15_JPRB) + + !For a reference temperature of 20 degC, use: + !if (tt .lt. 20.) then + ! t_scale = -8.88108055e-5*tt*tt*tt + 5.64728654e-3*tt*tt & + ! -0.118363619*tt + 1.81884421 + ! number(JL) = number(JL) * t_scale + !endif + !For a reference temperature of 15 degC, use: + if (tt .lt. 15.) then + t_scale = -8.75593266e-5*tt*tt*tt + 5.56770771e-3*tt*tt & + -0.116695696*tt + 1.79321393 + number(JL) = number(JL) * t_scale + endif + + !Using the above relation we still underestimate CDNC by a factor 2 to 4 + !over the Soutern Ocean. + !The enhancement factor from Salter et al. (2015) is only 1.9 at -1 degC, + !while earlier studies measured a stronger enhancement + !in the number of submicron particles as SST decreases + !from about 9 to -1 (or -1.3) degC + !(Salter et al., JGR, 2014, Bowyer et al., JGR, 1990; + !Zabori et al. (ACP, 2012a; 2012b) + !In these studies the enhancement at about -1 degC varies + !from ~3 (Salter et al.; Bowyer et al., 1990), + !~7 (Zabori et al., 2012b), to ~10 (Zabori et al., 2012a). + !As the studies don't provide an expression for the enhancement factor + !as a function of temperature, + !I have approximated it by a quadratic function + !which reaches 1 at t0=9 degC with a zero slope: + ![(F-1)/(t0-tmin)^2]*(t-t0)^2 + 1 + !where F is the enhancement factor at tmin=-1 degC. + !Using t0=9 and tmin=-1, the quadratic coefficient + !becomes (F-1)/100. + !I have implemented this expression for F=3, F=5, and F=7. + !With F=5 or F=7, the zonal mean AOD over the Southern Ocean + !is overestimated at high latitudes + !compared to observational estimates from AATSR. + !For v5.0 of the pre-industrial aerosol climatology + !we have therefore used F=3. + !tt=max(-1.,temperature(JL)) + !if (tt .lt. 9.) then + !F=3: + !t_scale = 0.02*(tt-9.)*(tt-9.) + 1.0 + !F=5: + !t_scale = 0.04*(tt-9.)*(tt-9.) + 1.0 + !F=7: + !t_scale = 0.06*(tt-9.)*(tt-9.) + 1.0 + !number(JL) = number(JL) * t_scale + !endif + !<<< TvN + END DO + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) + + ! For now fill in surface layer + emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) *SSCAL !#/m2/sec + !write(6565,*) number(KIDIA:KFDIA) + + ! emitted mass + ! ------------ + dens = ss_density*0.001 ! in g/cm3 + rg1 = radius_ssa*1e6 ! in micron + mass(KIDIA:KFDIA) = number(KIDIA:KFDIA)*RPI*4./3. *(rg1*1e-4)**3 & + & * EXP(9./2.*log(sigma_lognormal(3))**2)*dens*1e-3 ! kg/m2/sec + + + ! vertically distribute according to sector + ! CALL emission_vdist_by_sector( splittype, 'SS', region, emis_temp(region), emis3d, status ) + emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) *SSCAL !kg/m2/sec + + + !=================== + ! Coarse mode + !=================== + + ! emitted numbers + ! --------------- + DO JL=KIDIA,KFDIA + ! >>> TvN + ! sea fraction + !xsea=1.-lsmask_dat(iglbsfc)%data(JL,1)/100. + + !xwind=SQRT(u10m_dat(iglbsfc)%data(JL,1)**2+v10m_dat(iglbsfc)%data (JL,1)**2) + + !number(JL) = 0.0009*xwind**(3.4195)*dxy11(j)*1e4*xsea*(1.-ci_dat(iglbsfc)%data(JL,1))*sec_month !#/cm2/s-->#/gridbox/month + number(JL) = emis_fac(JL)*9.05658e-4 !#/cm2/s-->#/m2/sec + !TB + ! multiplier needs an explanation! + + !Include temperature dependence following Salter et al. (ACP, 2015). + !We assume that the emissions in our coarse mode + !follow the temperature dependence of the largest mode described by Santer et al. + !Indeed, the mode radii of these modes are close (0.794 vs. 0.75 micron). + !The corresponding second-order polynomial (valid between -1 and 30 degC) + !shows almost linear increase with temperature. + !The higher order terms are therefore irrelevant. + !We rescale the resulting linear function + !so that it goes through 1 at some reference temperature, + !which can currently be set to either 15 or 20 degC. + !The resulting expression is then used as + !an additional factor multiplying the expression from Gong. + !Gong uses the relation between whitecap coverage and wind speed + !from Monahan and Muircheartaigh (1980). + !It was derived from data in the Atlantic and Pacific Ocean, + !where most measurements were made at sea water temperatures + !between 20 and 30 degC: 46 out of 54 points in the Atlantic data set + !and all 36 points in the Pacific data set. + !Based on this, one would argue that a reference temperature + !in the range 20-25 degC would be most reasonable. + !As the emissions in the coarse mode increase with temperature, + !the smaller the reference temperature the higher the emissions. + !For example, the emissions will increase by 18.76% + !when the reference temperature is reduced from 20 to 15 degC. + !The resulting temperature dependence is somewhat weaker than + !the quasi-linear dependence obtained by Ovadnevaite et al. + ![ACP, 2014; see also Gantt et al., GMD, 2015, Eq. (2)]. + !The function proposed by Jaegle et al. (JGR, 2011) + !oscillates around or mostly below + !(reference temperature at 20 degC or 15 degC, resp.) + !our linear function up to about 20 degC, + !but increases more strongly at higher temperatures. + !For CMIP6 a reference temperature of 15 degC is used. + ! PSST in Kelvin + tt=min(30.,max(-1.0,PSST(JL)-273.15_JPRB)) + !For a reference temperature of 20 degC, use: + !t_scale = 0.03159982*tt + 0.36800362 + !For a reference temperature to 15 degC, use: + t_scale = 0.03752944*tt + 0.43705846 + number(JL) = number(JL) * t_scale + ! <<< TvN + ENDDO + + !VH: For now emitted at surface, to be fixed + emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = number(KIDIA:KFDIA) *SSCAL !#/grid/month + + + ! emitted mass + ! ------------ + dens = ss_density*0.001 ! im g/cm3 + rg2 = radius_ssc*1e6 ! in micron + mass(KIDIA:KFDIA) = number(KIDIA:KFDIA)*RPI*4./3. *(rg2*1e-4)**3 * EXP(9./2.*log(sigma_lognormal(4))**2)*dens*1e-3 ! kg/m2/sec + + !For now introduce emissions in surface layer. Should be fixed. + emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4) = mass(KIDIA:KFDIA) *SSCAL !kg/m2/sec + + ELSEIF (NSEASALT==8) THEN !HAM gong_SST + + CALL SEASALT_EMISSIONS_GONG_SST(KFDIA, KLON, 1,& + & PSST,PWIND, ss_density, PLSM, PCLAKE, PCI, & + & emis_mass(mode_acs)%d3(KIDIA:KFDIA,KLEV,4) , emis_mass(mode_cos)%d3(KIDIA:KFDIA,KLEV,4),& + & emis_number(mode_acs)%d3(KIDIA:KFDIA,KLEV,4), emis_number(mode_cos)%d3(KIDIA:KFDIA,KLEV,4),SSCAL) + ELSE + + CALL ABOR1('ABORT: IN TM5_SRC_SS, NSEASALT is NOT 0 or 8!') + + END IF + + ! RCHG -> In AER scheme there is a flag named LVDFTRAC that might be related with not vertical diffusion. In that case, + ! the tendencies seems to be re-scaled in vertical layers "manually". The flux themselves are not changed. + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_SRC_SS',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_SRC_SS + diff --git a/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 new file mode 100644 index 00000000..bed23464 --- /dev/null +++ b/ifs-source/arpifs/m7/phys_ec/yoe_aer_activ.F90 @@ -0,0 +1,951 @@ + MODULE YOE_AER_ACTIV + + !---inherited functions, types, variables and constants + USE PARKIND1, ONLY: JPIM, JPRB + USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK + !USE PHY_DIAG_MOD, ONLY: T_DIAG + + IMPLICIT NONE + + !---public member functions + PUBLIC AER_ACTIV + + !---private member functions + PRIVATE AER_ACTIV_MORALES_NENES_FULL + PRIVATE GET_HAMM7_AERO_PROP + PRIVATE ICE_CLOUD_PROP + + !---module types, variables and constants + + ! surface tension of pure water at 273.15K [J m-2] + !REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPSURFTEN = 0.075_JPRB + + ! standard deviation of updraft PDF + !REAL(KIND=JPRB), PARAMETER, PUBLIC :: PPDF_SIGMA = 0.8_JPRB + + ! Diagnostics + !TYPE(T_DIAG), POINTER, PUBLIC :: D_CDNC + !TYPE(T_DIAG), POINTER, PUBLIC :: D_REFF + !TYPE(T_DIAG), POINTER, PUBLIC :: D_LIQCLDT + +CONTAINS + SUBROUTINE AER_ACTIV(KIDIA, KFDIA, KTDIA, KLON, KLEV, KSTGLO, & + !& KLEVX, KFLDX, KFLDX2, & + & PAPH, PAP, PT, PQ, PQSAT, & + & PVERVEL, PA, PL, PI, & + & PLSM, PGELAM, PGEMU, & !PSLON, PGEMU, & + & PGFL, YDMODEL, PCDNCACT, PICNC, PREFFL, PREFFI, PSMAX, PDRYRSOLU, PXTM1, KTRAC, PSIGMA_W, & + & PFRACN, PPMINCDNC, PPDEFCDNC, PQLWC, LLIQCLD, LICECLD, PPREFFL_DEF, PPREFFI_DEF)!, PEXTRA, PEXTR2) + + ! *AER_ACTIV* is the interface to the cloud droplet activation scheme. + ! Four schemes are available, depending on the aerosol scheme used. + ! 1. Menon et al. for TM5 aerosols or Tegen climatological aerosols + ! 2. Abdul-Razzak & Ghan (2000) + ! 3. Fountoukis & Nenes (2005) + ! 4. Morales Betancourt & Nenes (2014) + ! 5. Morales Betancourt & Nenes (2014) with adsorption activation (Kumar et al., 2011), PDF integration with Gaussian-Legendre quadrature, explicit CCN spectra + ! 6. Same as 5. but with PDF sampling as in 2-4 + ! Schemes 2-6 currently require TM5 aerosols, + ! either via interactive coupling to TM5 or a prescribed pre-industrial climatology + + !---inherited functions, types, variables and constants + USE YOMCST, ONLY: RD, RPI, RG + USE TM5M7_DATA, ONLY: NSOL + USE MO_HAM, ONLY: NCLASS + USE TYPE_MODEL, ONLY: MODEL + + IMPLICIT NONE + + !---included functions from header files +#include "abor1.intfb.h" + !#include "ice_effective_radius.intfb.h" + + !---subroutine interface + ! + ! - Input arguments + ! --------------- + ! KIDIA : start of horizontal loop + ! KFDIA : end of horizontal loop + ! KLON : horizontal dimension + ! KLEV : vertical dimension + ! KSTGLO : offset of horizontal block in coupling arrays + ! KLEVX : vertical dimension, 3-D diagnostic fields + ! KFLDX : number of 3-D diagnostic fields + ! KFLDX2 : number of 2-D diagnostic fields + ! PAPH : pressure at half levels [Pa] + ! PAP : pressure at full levels [Pa] + ! PT : temperature [K] + ! PQ : specific humidity [kg/kg] + ! PQSAT : saturation specific humidity [kg/kg] + ! PVERVEL : large-scale vertical veloctiy [Pa/s] + ! PA : cloud fraction + ! PL : liquid water content + ! PI : ice content [kg/kg] + ! PLSM : land-sea mask + ! PGELAM : Longitude + ! PCLON : Cosine of longitude + ! PSLON : Sine of longitude + ! PGEMU : Sine of latitude + + ! - output arguments + ! ---------------- + ! The following are written to the appropriate PGFL: + ! CDNC : cloud droplet number concentration + ! ICNC : ice crystal number concentration + ! PRE_LIQ : liquid drop effective radius + ! PRE_ICE : ice crystal effective radius + ! PEXTRA : 3-D diagnostics + ! PEXTR2 : 2-D diagnostics + + TYPE(MODEL), INTENT(IN) :: YDMODEL + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! beginning of vertical block + INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels + INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO ! offset of horizontal block in coupling arrays + INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC ! number of tracers + + !INTEGER(KIND=JPIM), INTENT(IN) :: KLEVX + !INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX + !INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX2 + + REAL(KIND=JPRB), INTENT(IN) :: PAPH(KLON,KLEV+1) ! half level pressure + REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) ! full level pressure + REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) ! temperature + REAL(KIND=JPRB), INTENT(IN) :: PQ(KLON,KLEV) ! specific humidity + REAL(KIND=JPRB), INTENT(IN) :: PQSAT(KLON,KLEV) ! saturation specific humidity + REAL(KIND=JPRB), INTENT(IN) :: PVERVEL(KLON,KLEV) ! vertical velocity + + REAL(KIND=JPRB), INTENT(IN) :: PA(KLON,KLEV) ! cloud fraction + REAL(KIND=JPRB), INTENT(IN) :: PL(KLON,KLEV) ! cloud liquid water + REAL(KIND=JPRB), INTENT(IN) :: PI(KLON,KLEV) ! cloud ice + + REAL(KIND=JPRB), INTENT(IN) :: PLSM(KLON) ! land-sea mask + REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) ! longitude + !REAL(KIND=JPRB), INTENT(IN) :: PCLON(KLON) ! cosine of longitude + !REAL(KIND=JPRB), INTENT(IN) :: PSLON(KLON) ! sine of longitude + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) ! sine of latitude + REAL(KIND=JPRB), INTENT(IN) :: PDRYRSOLU(KLON,KLEV,NSOL) ! rdry of soluble modes [m] + REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! tracer mixing ratios + REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) ! sigma_w + REAL(KIND=JPRB), INTENT(IN) :: PPMINCDNC ! minimum CDNC [# cm-3] + REAL(KIND=JPRB), INTENT(IN) :: PPDEFCDNC ! default (background) CDNC [# cm-3] + REAL(KIND=JPRB), INTENT(IN) :: PQLWC(KLON,KLEV) ! LWC [kg kg-1] + LOGICAL, INTENT(IN) :: LLIQCLD(KLON,KLEV) ! logical for liquid cloud + LOGICAL, INTENT(IN) :: LICECLD(KLON,KLEV) ! logical for ice cloud + REAL(KIND=JPRB), INTENT(IN) :: PPREFFI_DEF ! default (background) ice eff rad [mu m] + REAL(KIND=JPRB), INTENT(IN) :: PPREFFL_DEF ! default (background) liq eff rad [mu m] + + REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNCACT(KLON,KLEV) ! cloud droplet number concentration [# cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) ! ice crystal number concentration [# cm-3] + REAL(KIND=JPRB), INTENT(INOUT) :: PREFFL(KLON,KLEV) ! liquid droplet effective radius [um] + REAL(KIND=JPRB), INTENT(INOUT) :: PREFFI(KLON,KLEV) ! ice effective radius [um] + REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation [%] + REAL(KIND=JPRB), INTENT(OUT) :: PFRACN(KLON,KLEV,NCLASS) ! fraction of activated particles per mode + + !---extra diagnostics + !REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTRA(KLON,KLEVX,KFLDX) + !REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTR2(KLON,KFLDX2) + + !---local variables + REAL(KIND=JPRB) :: ZRHO(KLON,KLEV) ! air density [kg/m3] + REAL(KIND=JPRB) :: ZSO4MASS(KLON,KLEV,NSOL) ! modal so4 mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZBCMASS(KLON,KLEV,NSOL) ! modal black carbon mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZOMMASS(KLON,KLEV,NSOL) ! modal organic matter mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZSSMASS(KLON,KLEV,NSOL) ! modal sea salt mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZDUMASS(KLON,KLEV,NSOL) ! modal dust mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZNO3MASS(KLON,KLEV) ! nitrate mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZMSAMASS(KLON,KLEV) ! MSA mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZAERONUM(KLON,KLEV,NSOL) ! aerosol number mixing ratio [#/kg] + REAL(KIND=JPRB) :: ZDRYRSOL(KLON,KLEV,NSOL) ! dry count median radius of soluble modes + REAL(KIND=JPRB) :: ZDRYRSOLOLD(KLON,KLEV,NSOL) ! dry count median radius of soluble modes eehol: not calculated here but in HAM + REAL(KIND=JPRB) :: ZSO4BULK(KLON,KLEV) ! bulk so4 mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZBCBULK(KLON,KLEV) ! bulk black carbon mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZOMBULK(KLON,KLEV) ! bulk organic matter mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZSSBULK(KLON,KLEV) ! bulk sea salt mass mixing ratio [kg/kg] + REAL(KIND=JPRB) :: ZDUBULK(KLON,KLEV) ! bulk dust mass mixing ratio [kg/kg] + !REAL(KIND=JPRB) :: ZW(KLON,KLEV,nw) ! updraft speed [m/s] + !REAL(KIND=JPRB) :: ZWPDF(KLON,KLEV,nw) ! updraft probability + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPRB) :: ZTMP(KLON,KLEV) ! interim for diagnostics + + REAL(KIND=JPRB) :: ZCDNC(KLON,KLEV) ! cloud droplet number concentration [#/cm-3] + REAL(KIND=JPRB) :: ZICNC(KLON,KLEV) ! ice crystal number concentration [#/cm-3] + REAL(KIND=JPRB) :: ZRE_LIQ(KLON,KLEV) ! liquid droplet effective radius [um] + REAL(KIND=JPRB) :: ZRE_ICE(KLON,KLEV) ! ice crystal effective radius [um] + REAL(KIND=JPRB) :: ZSMAX(KLON,KLEV) ! maximum supersaturation [%] + REAL(KIND=JPRB) :: ZNACT_TOT ! variables for modewise activated fraction calculations + REAL(KIND=JPRB) :: ZNACT_AS(KLON,KLEV) + REAL(KIND=JPRB) :: ZNACT_CS(KLON,KLEV) + REAL(KIND=JPRB) :: ZNACT_KS(KLON,KLEV) ! variables for modewise activated fraction calculations + REAL(KIND=JPRB) :: ZFRAC_KS,ZFRAC_AS,ZFRAC_CS ! variables for modewise activated fraction calculations + + LOGICAL :: LLIQCLDD(KLON,KLEV) ! true if liquid cloud is present (for activation calculations) + + LOGICAL :: LL1 + LOGICAL :: LBULK, LMODE ! fetch HAMM7 aerosols as bulk mass / per-mode mass + + LOGICAL :: LCALCINCLOUD = .TRUE. ! calculate activation only in-cloud (T) or everywhere (F) + REAL(KIND=JPRB) :: ZEPS ! epsilon(1.) + INTEGER(KIND=JPIM) :: ITOP ! highest level for water cloud + INTEGER(KIND=JPIM) :: JK, JL, JMOD ! loop indices + !INTEGER(KIND=JPIM) :: IX ! index to PEXTRA diagnostic + + REAL(KIND=JPRB), PARAMETER :: ZEPSEC = 1.E-14_JPRB ! taken from cloudsc.F90 + REAL(KIND=JPRB) :: ZTMPA + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV', 0, ZHOOK_HANDLE) + ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP) + ASSOCIATE(YCDNC=>YGFL%YCDNC, YICNC=>YGFL%YICNC, YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & + & LAERICESED=>YDECLDP%LAERICESED, LAERICEAUTO=>YDECLDP%LAERICEAUTO, & + & RLMIN=>YDECLDP%RLMIN, RAMIN=>YDECLDP%RAMIN, RTHOMO=>YDECLDP%RTHOMO, RNICE=>YDECLDP%RNICE) + + ! Init + PFRACN(KIDIA:KFDIA,:,:) = 0._JPRB + + !---air density + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZRHO(JL,JK)=PAP(JL,JK)/(RD*PT(JL,JK)) + IF (ZRHO(JL,JK) .LE. 1.E-12_JPRB) THEN + ZRHO(JL,JK)=1.E-12_JPRB + END IF + END DO + END DO + + !---background CDNC and Reff and ICNC and init ZSMAX + ZSMAX(KIDIA:KFDIA,1:KLEV) = 0._JPRB + ZCDNC(KIDIA:KFDIA,1:KLEV) = PPDEFCDNC + ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = PPREFFL_DEF + ZICNC(KIDIA:KFDIA,1:KLEV) = RNICE + ZRE_ICE(KIDIA:KFDIA,1:KLEV) = PPREFFI_DEF + + !---get aerosols from HAMM7 + LMODE = .TRUE. + LBULK = (LAERICESED .OR. LAERICEAUTO) ! .OR. NCLOUDACT==JP_ACT_MENON) + CALL GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & + & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & + & ZDRYRSOLOLD, ZAERONUM, & + & ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, ZDUMASS, & + & ZSO4BULK, ZBCBULK, ZOMBULK, ZSSBULK, ZDUBULK, & + & ZNO3MASS, ZMSAMASS) + + ZDRYRSOL(KIDIA:KFDIA,1:KLEV,:) = PDRYRSOLU(KIDIA:KFDIA,1:KLEV,:) + + IF (LCALCINCLOUD) THEN + !---find highest model level where there is cloud + DO JK=1,KLEV + IF (ANY(LLIQCLD(KIDIA:KFDIA,JK))) EXIT + END DO + ITOP=JK + LLIQCLDD(KIDIA:KFDIA,1:KLEV) = LLIQCLD(KIDIA:KFDIA,1:KLEV) + ELSE + ITOP=KTDIA + LLIQCLDD(KIDIA:KFDIA,1:KLEV) = .TRUE. + END IF + + IF (ITOP.LE.KLEV) THEN + + ! The new scheme either approximates the integral over the updraft velocity PDF + ! by Gauss-Legendre quadrature or uses a PPDEFsingle characteristic velocity. + ! PDF_UPDRAFT, NACTPDF, ZW and ZWPDF are not used. + CALL AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, ITOP, KLON, KLEV, LLIQCLDD, PT, PAP, ZRHO, & + & PVERVEL, ZSO4MASS, ZBCMASS, ZOMMASS, ZSSMASS, & + & ZDUMASS, ZNO3MASS, ZMSAMASS, ZAERONUM, ZDRYRSOL, & + & ZCDNC, ZSMAX, PGEMU, PSIGMA_W) !PSLON, PGEMU) + !& PGFL(:,:,YCDNC%MP9_PH), ZSMAX, PGEMU, PSIGMA_W) !PSLON, PGEMU) + !& PGFL(:,:,YCDNC%MP9_PH), KFLDX, PEXTRA, PSLON, PGEMU) + + !---limit CDNC to min PPMINCDNC, set default value for CDNC outside clouds + DO JK=KTDIA,KLEV + ZCDNC(KIDIA:KFDIA,JK)=MERGE( & + & MAX(ZCDNC(KIDIA:KFDIA,JK),PPMINCDNC), & + & PPDEFCDNC, LLIQCLD(KIDIA:KFDIA,JK) ) + END DO + + !---cloud liquid water: droplet effective radius is computed in radlswr now + !CALL LIQ_CLOUD_RE(KIDIA, KFDIA, KLON, ITOP, KLEV, LLIQCLD, PL, PA, ZRHO, PGFL) + + ! liquid effective radius + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ! effective radius calculated similarly as in radlswr.F90 + ! 2.387e-10 is 3/(4*pi*rho_liq*10^6) [10^6 for N in right units] + ZRE_LIQ(JL,JK) = 1.E+06_JPRB*(2.387e-10_JPRB*ZRHO(JL,JK)*PQLWC(JL,JK)/ZCDNC(JL,JK))**(1.0_JPRB/3.0_JPRB) + END DO + END DO + ZRE_LIQ(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),PPREFFL_DEF,LLIQCLD(KIDIA:KFDIA,1:KLEV)) + + END IF + + !---cloud ice: ICNC and effective radius for ice crystals + IF (LAERICESED .OR. LAERICEAUTO) THEN + CALL ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, ZRHO, PI, PA, PAP, & + & PQSAT, ZSO4BULK, ZBCBULK, ZDUBULK, PGFL, YDMODEL, ZRE_ICE, ZICNC) + END IF + + + !eehol: calculate modewise fraction of activated particles + !assume only KS, AS, CS modes to be activated + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZNACT_TOT = 1.0E6_JPRB * ZCDNC(JL,JK) / ZRHO(JL,JK) !calculate total number of activated particles in #/kg + IF ( ZAERONUM(JL,JK,4) > 1.E-9_JPRB ) THEN + ZFRAC_CS = MAX(ZNACT_TOT,0._JPRB) / ZAERONUM(JL,JK,4) + ELSE + ZFRAC_CS = 0._JPRB + ENDIF + PFRACN(JL,JK,4) = MAX(0._JPRB,MIN(ZFRAC_CS,1._JPRB)) !threshold between 0 and 1 + ZNACT_CS(JL,JK) = ZAERONUM(JL,JK,4) * PFRACN(JL,JK,4) !calculate activated number for CS mode + + IF ( ZAERONUM(JL,JK,3) > 1.E-9_JPRB ) THEN + ZFRAC_AS = MAX(ZNACT_TOT - ZNACT_CS(JL,JK),0._JPRB) / ZAERONUM(JL,JK,3) + ELSE + ZFRAC_AS = 0._JPRB + ENDIF + PFRACN(JL,JK,3) = MAX(0._JPRB,MIN(ZFRAC_AS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_AS(JL,JK) = ZAERONUM(JL,JK,3) * PFRACN(JL,JK,3) !calculate activated number for AS mode + + IF ( ZAERONUM(JL,JK,2) > 1.E-9_JPRB ) THEN + ZFRAC_KS = MAX((ZNACT_TOT - ZNACT_CS(JL,JK) - ZNACT_AS(JL,JK)),0._JPRB) / ZAERONUM(JL,JK,2) + ELSE + ZFRAC_KS = 0._JPRB + ENDIF + PFRACN(JL,JK,2) = MAX(0._JPRB,MIN(ZFRAC_KS, 1._JPRB)) !threshold between 0 and 1 + ZNACT_KS(JL,JK) = ZAERONUM(JL,JK,2) * PFRACN(JL,JK,2) !calculate activated number for KS mode + + PFRACN(JL,JK,2) = MERGE(PFRACN(JL,JK,2),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is liquid cloud + PFRACN(JL,JK,3) = MERGE(PFRACN(JL,JK,3),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is liquid cloud + PFRACN(JL,JK,4) = MERGE(PFRACN(JL,JK,4),0._JPRB,LLIQCLD(JL,JK)) !fraction only where there is liquid cloud + END DO + END DO + + + !eehol: diagnostics: + !--CDNC + PCDNCACT(KIDIA:KFDIA,1:KLEV) = 1.0E6_JPRB*ZCDNC(KIDIA:KFDIA,1:KLEV) ! CDNC [#/m3] + + !--ICNC + PICNC(KIDIA:KFDIA,1:KLEV) = ZICNC(KIDIA:KFDIA,1:KLEV) ! ICNC [#/cm3] + + !--Liq eff rad + PREFFL(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_LIQ(KIDIA:KFDIA,1:KLEV),PPREFFL_DEF,LLIQCLD(KIDIA:KFDIA,1:KLEV)) !eehol: output liq eff rad [um] + + !--Ice eff rad (only if there is ice cloud else minimum value) + PREFFI(KIDIA:KFDIA,1:KLEV) = MERGE(ZRE_ICE(KIDIA:KFDIA,1:KLEV),PPREFFI_DEF,LICECLD(KIDIA:KFDIA,1:KLEV)) + + !--Maximum supersaturation + PSMAX(KIDIA:KFDIA,1:KLEV) = ZSMAX(KIDIA:KFDIA,1:KLEV) !eehol: output maximum supersaturation [%] + + + END ASSOCIATE + END ASSOCIATE + + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV', 1, ZHOOK_HANDLE) + + END SUBROUTINE AER_ACTIV + + + + SUBROUTINE AER_ACTIV_MORALES_NENES_FULL(KIDIA, KFDIA, KTDIA, KLON, KLEV, LCLOUD, PT, PAP, PRHO, & + & PVERVEL, PSO4MASS, PBCMASS, POMMASS, PSSMASS, & + & PDUMASS,PNO3MASS, PMSAMASS, PAERONUM, PRDRY, PCDNC, PSMAX, PGEMU, PSIGMA_W) !, KFLDX, PEXTRA, PSLON, PGEMU) + + + ! *aer_activ_morales_nenes_full* calculates the number of activated aerosol + ! particles from the aerosol size-distribution, + ! composition and ambient supersaturation + ! + ! Author: + ! ------- + ! Twan van Noije, KNMI + ! Thanos Nenes, EPFL/FORTH + ! + ! References: + ! ----------- + ! Abdul-Razzak et al., JGR, 103, D6, 6123-6131, 1998 + ! Abdul-Razzak and Ghan, JGR, 105, D5, 6837-6844, 2000 (referred to as ARG) + ! Pruppbacher and Klett, Kluewer Ac. Pub., 1997 + ! Ghan et al., JAMES 3, M10001, 2011 + ! Nenes and Seinfeld, JGR, 108, D14, 4415, 2003 (referred to as NS) + ! Fountoukis and Nenes, JGR, 110, D11212, 2005 (referred to as FN) + ! Morales Betancourt and Nenes, GMD, 7, 2345-2357, 2014 (referred to as MN) + ! Kumar et al., ACP, 9, 2517-2532, 2009 + ! Seinfeld and Pandis, Atmospheric Chemistry and Physics, Second Edition (referred to as SP) + ! Morales and Nenes, JGR, D18220, 2010 + + USE YOMCST, ONLY: RG, RPI + USE YOMLUN, ONLY: NULOUT + USE TM5M7_DATA, ONLY: NMOD, NSOL, DDUST, DNACL, & + & DOC, DBC, DH2SO4, DNA2SO4, DNH4NO3, DMSA, & + & NH4NO3_FACTOR, Kap_su,Kap_pom,Kap_soa, & + & Kap_bc,Kap_ss,Kap_du,Kap_na2so4,Kap_msa, & + & Kap_no3, WSO4, WH2SO4, WNACL, WNA2SO4, & + & WH2O, WDAIR + USE MO_HAM_M7CTL, ONLY: CMR2RAM, SIGMA, SIGMALN + USE MO_KIND, ONLY: THRESHOLD + USE ND_PARAM, ONLY: CCNSPEC, PDFACTIV, NDPARAM + + IMPLICIT NONE + + !---subroutine interface + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KLON + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV + !INTEGER(KIND=JPIM), INTENT(IN) :: KFLDX + + LOGICAL, INTENT(IN) :: LCLOUD(KLON,KLEV) + + REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PVERVEL(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] + REAL(KIND=JPRB), INTENT(IN) :: PAERONUM(KLON,KLEV,NSOL) + REAL(KIND=JPRB), INTENT(IN) :: PRDRY(KLON,KLEV,NSOL) + !REAL(KIND=JPRB), INTENT(IN) :: PEXTRA(KLON,KLEV,KFLDX) + !REAL(KIND=JPRB), INTENT(IN) :: PSLON(KLON), PGEMU(KLON) + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) + REAL(KIND=JPRB), INTENT(IN) :: PSIGMA_W(KLON,KLEV) !eehol: input sigma_w from outside [m/s] + + ! Output: + REAL(KIND=JPRB), INTENT(INOUT) :: PCDNC(KLON,KLEV) ! # cm-3 + REAL(KIND=JPRB), INTENT(INOUT) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % + + !---local data + INTEGER(KIND=JPIM) :: JL, JK, JMOD, JW + + REAL(KIND=JPRB) :: ZN(KLON,KLEV,NSOL) ! aerosol number concentration for each mode [m-3] + ! with the mode number median radius + REAL(KIND=JPRB) :: ZVOL(KLON) ! total dry particle volume + REAL(KIND=JPRB) :: ZKAPPA(KLON,KLEV,NSOL) ! volume-weighted kappa + REAL(KIND=JPRB) :: ZWLARGE(KLON,KLEV) ! large-scale velocity (m/s) + !REAL(KIND=JPRB) :: PSMAX(KLON,KLEV) ! maximum supersaturation in % + + REAL(KIND=JPRB) :: ZSSMASS(KLON) ! Sea salt MMR + REAL(KIND=JPRB) :: ZDUMASS(KLON) ! Dust MMR + REAL(KIND=JPRB) :: ZNO3MASS(KLON) ! Nitrate MMR + REAL(KIND=JPRB) :: ZMSAMASS(KLON) ! MSA MMR + + REAL(KIND=JPRB) :: NSO4(KLON), NH2SO4(KLON) ! Particle numbers [kmol/kg air] + REAL(KIND=JPRB) :: NNACL(KLON), NNA(KLON), NCL(KLON), NNA2SO4(KLON) + + ! Miscellaneous + REAL(KIND=JPRB) :: ZEPS + REAL(KIND=JPRB) :: Z4PIOVER3 + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + ! Variables to interface with Nenes routines + TYPE(NDPARAM) :: BOX + REAL(KIND=JPRB) :: TPI(NSOL-1), DPGI(NSOL-1), SIGI(NSOL-1), AKKI(NSOL-1) + REAL(KIND=JPRB) :: TPARC, PPARC, WPARC, SG(NSOL-1), NACT, SMAX + + REAL(KIND=JPRB), PARAMETER :: A = 2.25 ! Default FHH adsorption parameters (in the case of FHH-AT) + REAL(KIND=JPRB), PARAMETER :: B = 1.20 ! See Kumar et al., (2011) ACP + REAL(KIND=JPRB), PARAMETER :: ACCOM = 1.0 ! Accommodation coefficient + + ! Standard deviation of the updraft velocity distribution (m/s) + ! For the moment it is set to a constant value of 0.8 m/s, + ! as we did for the other activation schemes. + ! In reality it depends on turbulence characteristics. + ! Several parameterizations have been proposed + ! (see e.g., Hoose et al., 2010; Zheng et al., GRL, 2016) + ! A common approach is to use TKE or, alternatively, + ! the vertical diffusion coefficient + ! (see module VDIFLCZ in sinvect directory). + !REAL(KIND=JPRB), PARAMETER :: SIGW = 0.6_JPRB + REAL(KIND=JPRB) :: SIGW ! sigma_w is input now + + ! Logical switch to use a single characteristic velocity + ! instead of Gauss-Legendre quadrature. + LOGICAL, PARAMETER :: CHAR_VELOCITY = .FALSE. + + INTEGER(KIND=JPIM) :: MODEI(NSOL-1) + + !--- executable procedure + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL',0,ZHOOK_HANDLE) + + !--- 0) Initializations: + + PCDNC(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB + PSMAX(KIDIA:KFDIA,KTDIA:KLEV) = 0._JPRB + + ZEPS=THRESHOLD !EPSILON(1._JPRB) + + ZWLARGE(KIDIA:KFDIA,KTDIA:KLEV) = -1._JPRB* PVERVEL(KIDIA:KFDIA,KTDIA:KLEV) / & + & (RG*PRHO(KIDIA:KFDIA,KTDIA:KLEV)) + + !---miscellaneous + Z4PIOVER3 = 4._JPRB*RPI/3._JPRB + + !---per-mode calculations: + ! soluble mode number and critical supersaturation, ignore nucleation mode (mode 1) + DO JMOD=2, NSOL + DO JK=KTDIA,KLEV + DO JL=KIDIA,KFDIA + IF (LCLOUD(JL,JK)) THEN + + !---total volume per mode [m-3 / kg(air)], used for kappa calculation + ZVOL(JL) = Z4PIOVER3 * PAERONUM(JL,JK,JMOD) * & + & (CMR2RAM(JMOD)*PRDRY(JL,JK,JMOD))**3 + + !--- Number per unit volume [# m-3] for each mode: + ZN(JL,JK,JMOD) = PAERONUM(JL,JK,JMOD)*PRHO(JL,JK) + + !---sea salt and dust do not exist in mode 2: + ZSSMASS(JL) = MERGE(0._JPRB, PSSMASS(JL,JK,JMOD), JMOD==2) + ZDUMASS(JL) = MERGE(0._JPRB, PDUMASS(JL,JK,JMOD), JMOD==2) + + !---ammonium-nitrate and MSA do not exit in mode 2 and 4: + ZNO3MASS(JL) = MERGE(0._JPRB, PNO3MASS(JL,JK), JMOD==2 .OR. JMOD==4) + ZMSAMASS(JL) = MERGE(0._JPRB, PMSAMASS(JL,JK), JMOD==2 .OR. JMOD==4) + + NNA(JL) = ZSSMASS(JL) / WNACL + NCL(JL) = NNA(JL) + NSO4(JL) = PSO4MASS(JL,JK,JMOD) / WSO4 + NNA2SO4(JL) = MIN(NNA(JL)/2._JPRB, NSO4(JL)) + NNA(JL) = NNA(JL) - 2._JPRB*NNA2SO4(JL) + NNACL(JL) = MIN(NCL(JL), NNA(JL)) + NCL(JL) = NNACL(JL) + NH2SO4(JL) = NSO4(JL) - NNA2SO4(JL) + + ! PLS - TODO: SAFE DIVISION + IF (ZVOL(JL) .GE. ZEPS) THEN !eehol: total volume per mode need to be above treshold to avoid div by zero + !---mode kappa = volume-weighted sum of component kappa's + ZKAPPA(JL,JK,JMOD) = ( (Kap_ss * NNACL(JL) * WNACL / (DNACL*1.E3_JPRB)) + & + & (Kap_na2so4 * NNA2SO4(JL) * WNA2SO4 / (DNA2SO4*1.E3_JPRB)) + & + & (Kap_su * NH2SO4(JL) * WH2SO4 / (DH2SO4*1.E3_JPRB)) + & + & (Kap_bc * PBCMASS(JL,JK,JMOD) / (DBC*1.E3_JPRB)) + & + & (Kap_pom * POMMASS(JL,JK,JMOD) / (DOC*1.E3_JPRB)) + & + & (Kap_du * ZDUMASS(JL) / (DDUST*1.E3_JPRB)) + & + & (Kap_no3 * ZNO3MASS(JL) * NH4NO3_FACTOR / (DNH4NO3*1.E3_JPRB)) + & + & (Kap_msa * ZMSAMASS(JL) / (DMSA*1.E3_JPRB)) ) / & + & ZVOL(JL) + + !---defensive step: minimum kappa to avoid divide by zero errors + ZKAPPA(JL,JK,JMOD) = MAX(ZKAPPA(JL,JK,JMOD), 0.04_JPRB) + ZKAPPA(JL,JK,JMOD) = MIN(ZKAPPA(JL,JK,JMOD), 1.2_JPRB) + ELSE + ZKAPPA(JL,JK,JMOD) = 0.04_JPRB ! if total volume per mode is too small, use minimum kappa + END IF + END IF + END DO + END DO + END DO + + !--- 2) Calculate maximum supersaturation and cloud droplet number concentration, + ! averaged over the updraft velocity PDF + + DO JK=KTDIA, KLEV + DO JL=KIDIA,KFDIA + IF (LCLOUD(JL,JK)) THEN + + DO JMOD=2,NSOL + !Shift mode index + MODEI(JMOD-1) = 1 ! Kohler mode + TPI(JMOD-1) = PAERONUM(JL,JK,JMOD) * PRHO(JL,JK) ! Number concentration (#/m3) + DPGI(JMOD-1) = 2._JPRB * PRDRY(JL,JK,JMOD) ! Modal diameter (m) + SIGI(JMOD-1) = SIGMA(JMOD) ! Geometric dispersion (sigma_g) + AKKI(JMOD-1) = ZKAPPA(JL,JK,JMOD) ! Hygroscopicity parameter (kappa) + END DO + TPARC = PT(JL,JK) ! Temperature (K) + PPARC = PAP(JL,JK) ! Pressure (Pa) + + ! Convert aerosol data into CCN, fill BOX object + CALL CCNSPEC (TPI,DPGI,SIGI,MODEI,TPARC,PPARC,NSOL-1,AKKI,A,B,ACCOM,BOX) + + ! xxx To be done: + ! Save CCN spectra for supersaturations: + ! S = 0.05, 0.1, 0.2, 0.3, 0.5, 1.0 % + ! New routine needs as input TPI, SG, S and returns CCN(S) + ! which needs to be put into the output as 6 3-D fields + + !eehol: give sigma_w a value depending on the input variable + SIGW = MAX(0.1_JPRB,PSIGMA_W(JL,JK)) ! threshold sigma to min value + + ! Calculate activated droplet number + IF (CHAR_VELOCITY) THEN + ! Use characteristic updraft velocity (m/s) + ! from Morales and Nenes (2010) + WPARC = 0.79*SIGW + ! Call activation for a single velocity + ! equal to the characteristic velocity + CALL PDFACTIV (WPARC,0._JPRB,NACT,SMAX,BOX) + ELSE + ! Call activation for velocity PDF (SIGW is non-zero) + ! with WPARC set equal to the large-scale velocity (m/s) + WPARC = ZWLARGE(JL,JK) + CALL PDFACTIV (WPARC,SIGW,NACT,SMAX,BOX) + ENDIF + + ! convert CDNC to # cm-3 + PCDNC(JL,JK) = 1.E-6_JPRB * NACT + + ! convert Smax to % + PSMAX(JL,JK) = 100._JPRB * SMAX + END IF ! LCLOUD + END DO !jl + END DO !jk + + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.AER_ACTIV_MORALES_NENES_FULL',1,ZHOOK_HANDLE) + + END SUBROUTINE AER_ACTIV_MORALES_NENES_FULL + + + + SUBROUTINE GET_HAMM7_AERO_PROP(KIDIA, KFDIA, KLON, KTDIA, KLEV, KSTGLO, LMODE, LBULK, & + & PAPH, PGELAM, PGEMU, PXTM1, KTRAC, & + & PDRYRSOL, PAERONUM, & + & PSO4MASS, PBCMASS, POMMASS, PSSMASS, PDUMASS, & + & PSO4BULK, PBCBULK, POMBULK, PSSBULK, PDUBULK, & + & PNO3MASS, PMSAMASS) + + !---inherited functions, types, variables and constants + USE YOMCST, ONLY: RPI + USE TM5M7_DATA, ONLY: NSOL + + !---aerosols variables and indices + USE MO_HAM, ONLY: & + SIZECLASS, & ! Aerosol classes in HAM + AEROCOMP ! Aerosol compounds by size class in HAM + USE MO_HAM_M7CTL, ONLY: INUCS, IAITS, IACCS, ICOAS, & + IAITI, IACCI, ICOAI, & + ISO4NS, ISO4KS, ISO4AS, ISO4CS, & + IBCKS, IBCAS, IBCCS, IBCKI, & + IOCKS, IOCAS, IOCCS, IOCKI, & + ISSAS, ISSCS, & + IDUAS, IDUCS, IDUAI, IDUCI + + !USE YOERAD, ONLY: LCMIP6_PI_AEROSOLS, NRADFR + !USE YOE_AERO_M7_DATA + !USE YOE_PI_AERO + !USE YOMCT3, ONLY: NSTEP + + IMPLICIT NONE + + !---subroutine interface + ! *GET_HAMM7_AERO_PROP* is called from AER_ACTIV before the activation calculations + ! + ! INPUT: + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA ! beginning of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA ! end of horizontal block + INTEGER(KIND=JPIM), INTENT(IN) :: KLON ! horizontal dimension + INTEGER(KIND=JPIM), INTENT(IN) :: KTDIA ! highest level with liquid cloud + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV ! number of model vertical levels + INTEGER(KIND=JPIM), INTENT(IN) :: KSTGLO ! offset of horizontal block in coupling arrays + INTEGER(KIND=JPIM), INTENT(IN) :: KTRAC ! number of tracers + + LOGICAL, INTENT(IN) :: LMODE ! Per-mode data requested + LOGICAL, INTENT(IN) :: LBULK ! Bulk aerosol masses requested + + REAL(KIND=JPRB), INTENT(IN) :: PAPH(KLON,KLEV+1) ! half-level pressure + REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) ! longitude + REAL(KIND=JPRB), INTENT(IN) :: PGEMU(KLON) ! sine of latitude + REAL(KIND=JPRB), INTENT(IN) :: PXTM1(KLON,KLEV,KTRAC) ! tracer mixing ratios + + ! OUTPUT: + REAL(KIND=JPRB), INTENT(OUT) :: PDRYRSOL(KLON,KLEV,NSOL) ! [M] + REAL(KIND=JPRB), INTENT(OUT) :: PAERONUM(KLON,KLEV,NSOL) ! [#/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSO4MASS(KLON,KLEV,NSOL) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PBCMASS(KLON,KLEV,NSOL) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: POMMASS(KLON,KLEV,NSOL) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSSMASS(KLON,KLEV,NSOL) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDUMASS(KLON,KLEV,NSOL) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSO4BULK(KLON,KLEV) ! [KG(SO4)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PBCBULK(KLON,KLEV) ! [KG(BC)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: POMBULK(KLON,KLEV) ! [KG(OM)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PSSBULK(KLON,KLEV) ! [KG(SS)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PDUBULK(KLON,KLEV) ! [KG(DU)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PNO3MASS(KLON,KLEV) ! [KG(NO3)/KG(AIR)] + REAL(KIND=JPRB), INTENT(OUT) :: PMSAMASS(KLON,KLEV) ! [KG(MSA)/KG(AIR)] + + !---local data + REAL(KIND=JPRB) :: NSO4, NH2SO4, NNACL, NNA, NCL, NNA2SO4 ! Particle numbers [kmol/kg air] + REAL(KIND=JPRB) :: ZDRYVOL2, ZDRYVOL3, ZDRYVOL4 ! Volume per particle [m3/#] + REAL(KIND=JPRB) :: ZDUMMY(KLON,KLEV) ! For fields we don't use in subroutine call + REAL(KIND=JPRB) :: Z4PIOVER3 + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + INTEGER(KIND=JPIM) :: JL, JK, IBL, IL, IK + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.GET_HAMM7_AERO_PROP', 0, ZHOOK_HANDLE) + + !---Aerosols masses and numbers + ! NOTE: PXTM1 indices need to go according to HAM indices and not OIFS! + IF (LMODE) THEN + DO JK=KTDIA,KLEV + DO JL=KIDIA,KFDIA + + !---nucleation mode is ignored + + !---Aitken soluble mode: SU, OM, BC + PSO4MASS(JL,JK,2) = PXTM1(JL,JK,AEROCOMP(ISO4KS)%IDT) !SO4 Ait sol + POMMASS(JL,JK,2) = PXTM1(JL,JK,AEROCOMP(IOCKS)%IDT) !OC Ait sol + PBCMASS(JL,JK,2) = PXTM1(JL,JK,AEROCOMP(IBCKS)%IDT) !BC Ait sol + + !---accumulation soluble mode: SU, OM, BC, SS, DU + PSO4MASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(ISO4AS)%IDT) !SO4 acc sol + POMMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(IOCAS)%IDT) !OC acc sol + PBCMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(IBCAS)%IDT) !BC acc sol + PSSMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(ISSAS)%IDT) !SS acc sol + PDUMASS(JL,JK,3) = PXTM1(JL,JK,AEROCOMP(IDUAS)%IDT) !DU acc sol + + !---coarse soluble mode: SU, OM, BC, SS, DU + PSO4MASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(ISO4CS)%IDT) !SO4 coa sol + POMMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(IOCCS)%IDT) !OC coa sol + PBCMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(IBCCS)%IDT) !BC coa sol + PSSMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(ISSCS)%IDT) !SS coa sol + PDUMASS(JL,JK,4) = PXTM1(JL,JK,AEROCOMP(IDUCS)%IDT) !DU coa sol + + !---Nitrate and MSA - TODO Currently not used in HAM... need to be added later! + PNO3MASS(JL,JK) = 0._JPRB + PMSAMASS(JL,JK) = 0._JPRB + + PAERONUM(JL,JK,2) = PXTM1(JL,JK,SIZECLASS(IAITS)%IDT_NO) !Ait sol + PAERONUM(JL,JK,3) = PXTM1(JL,JK,SIZECLASS(IACCS)%IDT_NO) !acc sol + PAERONUM(JL,JK,4) = PXTM1(JL,JK,SIZECLASS(ICOAS)%IDT_NO) !coa sol + + END DO + END DO + END IF + + ! bulk masses, if requested + IF (LBULK) THEN + DO JK=KTDIA,KLEV + DO JL=KIDIA,KFDIA + PSO4BULK(JL,JK) = PSO4MASS(JL,JK,2) + & + & PSO4MASS(JL,JK,3) + & + & PSO4MASS(JL,JK,4) + POMBULK(JL,JK) = POMMASS(JL,JK,2) + & + & POMMASS(JL,JK,3) + & + & POMMASS(JL,JK,4) + PBCBULK(JL,JK) = PBCMASS(JL,JK,2) + & + & PBCMASS(JL,JK,3) + & + & PBCMASS(JL,JK,4) + PSSBULK(JL,JK) = PSSMASS(JL,JK,3) + & + & PSSMASS(JL,JK,4) + PDUBULK(JL,JK) = PDUMASS(JL,JK,3) + & + & PDUMASS(JL,JK,4) + END DO + END DO + END IF + + IF (LHOOK) CALL DR_HOOK('YOE_AER_ACTIV.GET_HAMM7_AERO_PROP', 1, ZHOOK_HANDLE) + + END SUBROUTINE GET_HAMM7_AERO_PROP + + + + + SUBROUTINE ICE_CLOUD_PROP(KIDIA, KFDIA, KLON, KLEV, PT, PRHO, PI, PA, PAP, & + & PQSAT, PSO4MASS, PBCMASS, PDUMASS, PGFL, YDMODEL, PRE_ICE, PICNC) + + ! This subroutine is mainly a copy/paste of the ice phase microphysics + ! implemented in the subroutine aer_cld.F90 + + !---inherited functions, types, variables and constants + USE YOMCST, ONLY: RPI, RTT, RETV, RLSTT, RLVTT + !USE YOECLDP, ONLY: RNICE, PPRHO_ICE, RCLDMAX + !USE YOE_AERO_M7_DATA, ONLY: NSOL + USE TM5M7_DATA, ONLY: NSOL + !USE YOM_YGFL, ONLY: YGFL, YICNC, YRE_ICE + USE YOETHF , ONLY : R2ES ,R3LES ,R3IES ,R4LES ,& + & R4IES ,R5LES ,R5IES ,R5ALVCP ,R5ALSCP ,& + & RALVDCP ,RALSDCP ,RTWAT ,& + & RTICE ,RTICECU ,& + & RTWAT_RTICE_R ,RTWAT_RTICECU_R,& + & RKOOP1 ,RKOOP2 + USE TYPE_MODEL, ONLY: MODEL + + IMPLICIT NONE + + !---subroutine interface + ! *ICE_CLD_PROP* is called from AER_ACTIV + ! + ! Input: + TYPE(MODEL), INTENT(IN) :: YDMODEL + INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA + INTEGER(KIND=JPIM), INTENT(IN) :: KLON + INTEGER(KIND=JPIM), INTENT(IN) :: KLEV + + REAL(KIND=JPRB), INTENT(IN) :: PT(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PRHO(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PI(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PA(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PAP(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PQSAT(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PSO4MASS(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PBCMASS(KLON,KLEV) + REAL(KIND=JPRB), INTENT(IN) :: PDUMASS(KLON,KLEV) + + ! Input and output: + REAL(KIND=JPRB), INTENT(INOUT) :: PGFL(KLON,KLEV,YDMODEL%YRML_GCONF%YGFL%NDIM) + REAL(KIND=JPRB), INTENT(INOUT) :: PICNC(KLON,KLEV) + REAL(KIND=JPRB), INTENT(INOUT) :: PRE_ICE(KLON,KLEV) + + + !---local data + INTEGER(KIND=JPIM) :: JL,JK + + REAL(KIND=JPRB) :: ZICENUCLEI + REAL(KIND=JPRB) :: ZICNC + REAL(KIND=JPRB) :: ZRE_ICE + REAL(KIND=JPRB) :: ZQS ! saturation + REAL(KIND=JPRB) :: ZS0 + REAL(KIND=JPRB) :: ZTEMPC + REAL(KIND=JPRB) :: ZSO4MASS + REAL(KIND=JPRB) :: ZBCMASS + REAL(KIND=JPRB) :: ZDUMASS + REAL(KIND=JPRB) :: ZMAERMEAN_SO4 + REAL(KIND=JPRB) :: ZMAERMEAN_BC + REAL(KIND=JPRB) :: ZMAERMEAN_DU + REAL(KIND=JPRB) :: ZNICEHOMO + REAL(KIND=JPRB) :: ZSO + REAL(KIND=JPRB) :: ZSVP + REAL(KIND=JPRB) :: ZSCRITHOMO + REAL(KIND=JPRB) :: ZWTOT + REAL(KIND=JPRB) :: ZRHO_ICE + REAL(KIND=JPRB) :: ZRICE_CRIT + REAL(KIND=JPRB) :: ZNCRIT_GIERENS, ZNCRIT_REN + REAL(KIND=JPRB) :: ZCLD + REAL(KIND=JPRB) :: ZZEPSEC + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('ICE_CLD_PROP', 0, ZHOOK_HANDLE) + ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP) + ASSOCIATE(YICNC=>YGFL%YICNC, YRE_ICE=>YGFL%YRE_ICE, & + & RNICE=>YDECLDP%RNICE, RCLDMAX=>YDECLDP%RCLDMAX) + + ! move to cldp module + ZWTOT=0.1_JPRB ! governs critical N + + ! Table of column/annual mean mass of aerosol + ! converted to microgram per m**3 + ! ZMAERMEAN_SO4=1.02E-09_JPRB*1.E9_JPRB + ZMAERMEAN_SO4=0._JPRB + ! ZMAERMEAN_SS=2.12E-10_JPRB*1.E9_JPRB + ZMAERMEAN_DU=1.01E-09_JPRB*1.E9_JPRB + ZMAERMEAN_BC=3.05E-11_JPRB*1.E9_JPRB + + ZZEPSEC=1.E-10_JPRB + + ZRHO_ICE=900.0_JPRB + + !--------------------------------------------------------------------- + ! Turn aerosol mass into a Ice Number concentration for ice processes + !--------------------------------------------------------------------- + DO JK=1,KLEV + DO JL=KIDIA,KFDIA + + !---aerosol masses in ug m-3 + ! ZSO4MASS = PSO4MASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB + ZSO4MASS = 0._JPRB + ZBCMASS = PBCMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB + ZDUMASS = PDUMASS(JL,JK)*PRHO(JL,JK)*1.E9_JPRB + + ! 0.01_JPRB is "default" value from + ! Demott et al. Ice SS=55% or Meyers et al. 1992 JAS, ISS=25% + ! In a prognostic scheme this will be function of clear sky humidity + + ! By relating IN to Aerosol mass we are assuming that the mode of the + ! Aerosol size distribution lies in the accumulation or coarse mode + + ! The relationship will implicitly introduce the exponential height + ! dependence that Sassen (1992) and K and Curry (1998) explicitly + ! introduced to their parameterizations. + + ZICENUCLEI=0.01_JPRB*& + & (ZSO4MASS + ZBCMASS + ZDUMASS) & + & /(ZMAERMEAN_SO4 + ZMAERMEAN_BC +ZMAERMEAN_DU) + ZICENUCLEI=MAX(ZICENUCLEI,0.0_JPRB) + + ! T in oC + ZTEMPC=PT(JL,JK)-RTT + + ! Re form for ice crystals from Liou and Oort 1994 + ! used to derive Re(ice) as in Lohmann JC 2002 + ZNICEHOMO=0.0_JPRB + ZRE_ICE=0.5_JPRB*(326.3_JPRB+ZTEMPC* & + & (12.42_JPRB + ZTEMPC*(0.197_JPRB + ZTEMPC*0.0012_JPRB))) + ZRE_ICE=MAX(ZRE_ICE,0.0_JPRB) + + ! effect Re to volume mean from S Moss or Lohmann and Kaercher papers 200? + ! ZRE_ICE on both LHS and RHS ?? + ZRE_ICE=(MAX(SQRT(5.113E6_JPRB+2.809E3_JPRB*ZRE_ICE**3.0_JPRB)-2.261E3_JPRB,0.0_JPRB))**(1.0_JPRB/3.0_JPRB) + ZRE_ICE=MAX(ZRE_ICE,1.0_JPRB) ! diameter minimum 1.0 microns + + ! more default values if not applying + ZICNC=RNICE ! place as default + + ZQS=PQSAT(JL,JK) + ZQS=MIN(0.5_JPRB,ZQS) + ZQS=ZQS/(1.0_JPRB-RETV*ZQS) + + IF (PT(JL,JK)<238._JPRB .AND. PI(JL,JK)>ZZEPSEC) THEN + ZS0=1.3_JPRB + ZSCRITHOMO=2.349_JPRB-PT(JL,JK)/259.0_JPRB !ren form of Koop 2000 + ZSVP=MAX(ZZEPSEC,ZQS*PAP(JL,JK)/0.622_JPRB) + + ! Klaus Gierens critical ice nuclei: Gierens (2003) + ZNCRIT_GIERENS=2.81E11_JPRB*(10.0_JPRB**(4.0_JPRB-0.02_JPRB*PT(JL,JK)))**0.75_JPRB& + &*(ZWTOT**1.5_JPRB)*PAP(JL,JK)**1.5_JPRB/& + &(PT(JL,JK)**5.415_JPRB*(1.5_JPRB*ZSVP)**0.5_JPRB*(ZSCRITHOMO-ZS0)**0.75_JPRB) + ZNCRIT_GIERENS=ZNCRIT_GIERENS/1.E6_JPRB ! cm**-3 + + ! Ren and Mackensie QJRMS 2005 critical ice nuclei + ZNCRIT_REN=5.4E10_JPRB*(ZWTOT**1.5_JPRB)*PAP(JL,JK)**1.5_JPRB*& + & (ZSCRITHOMO/(ZSCRITHOMO-1.0_JPRB))**1.5_JPRB/ & + & (PT(JL,JK)**5.415_JPRB*(1.5_JPRB*ZSVP)**0.5_JPRB) + ZNCRIT_REN=ZNCRIT_REN/1.E6_JPRB ! cm**-3 + + ! from Re derive the number concentration - here ice density is 900 kg/m**3 + ! Re is in microns, 1e18 factor + ZCLD=PI(JL,JK)/MAX(PA(JL,JK),ZZEPSEC) + ZCLD=MIN(MAX(ZCLD,0.0_JPRB),RCLDMAX) + IF (ZCLD>ZZEPSEC) THEN + ZNICEHOMO=0.75_JPRB*PRHO(JL,JK)*ZCLD/(RPI*ZRHO_ICE*1.0E-18_JPRB*ZRE_ICE**3.0_JPRB) + ENDIF + ZNICEHOMO = ZNICEHOMO/1.E6_JPRB ! cm**-3 + + ! following Ren and Mackensie, 2005, linearly interpolate to get Ice number + IF (ZICENUCLEI YGFL%NACTAERO, YAERO => YGFL%YAERO, & + & NAERO => YGFL%NAERO, LAERCHEM => YGFL%LAERCHEM, & + & AERO_SCHEME => YDCHEM%YRCOMPO%AERO_SCHEME, & + & CHEM_SCHEME => YDCHEM%YRCHEM%CHEM_SCHEME, & + & NAEROOPT => YDERAD%NAEROOPT ) + + +!* Init aerosol scheme +! --------------- + +SELECT CASE (TRIM(AERO_SCHEME)) + + CASE ("aer") + + ! Setup of 'aer' configuration is done in su_aerw.F90 + IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',1,ZHOOK_HANDLE) + RETURN + + CASE ("hamm7") + + ! Initialization of tm5m7 aerosol tracer indices is handled in hamm7_init + + ! Initialize various dust properties + CALL TM5M7_SRC_DUST_INIT + + ! Define wavelengths (only if using TM5 code to calculate aerosols properties) + IF (NAEROOPT == 1) THEN + + IF (CHEM_SCHEME == "SimChem") THEN + CALL PHOTOLYSIS_INI + ENDIF + + nwdep = nbands_trop + count(lmid.ne.lmid_gridA) + wav_grid = 0 + wav_gridA = 0 + allocate(photo_wavelengths(nwdep)) + + JL=1 + do JI=1,nbands_trop + if (lmid(JI)==lmid_gridA(JI)) then + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL + JL=JL+1 + else + photo_wavelengths(JL) = wave(lmid(JI))*1.e4 ! cm to um + photo_wavelengths(JL+1) = wave(lmid_gridA(JI))*1.e4 ! cm to um + wav_grid(JI) = JL + wav_gridA(JI) = JL+1 + JL=JL+2 + endif + enddo + allocate(wdep(nwdep)) + wdep(:)%wl = photo_wavelengths + wdep(:)%split = .false. + wdep(:)%insitu = .false. + + CALL TM5M7_OPTICS_INIT(NWDEP,WDEP) + + if (allocated(photo_wavelengths)) deallocate(photo_wavelengths) + if (allocated(wdep)) deallocate(wdep) + + ENDIF + + ! A.Laakso: Taken from ecearth_optics (TM5-ECEARTH3) + ! HAM aerosol optics are using these too + NASWBAND=YDERAD%NTSW + if (allocated(ASWBAND)) deallocate(ASWBAND) + allocate(ASWBAND(YDERAD%NTSW)) + ASWBAND(13)%wl = 0.257_JPRB + ASWBAND(12)%wl = 0.313_JPRB + ASWBAND(11)%wl = 0.398_JPRB + ASWBAND(10)%wl = 0.530_JPRB + ASWBAND( 9)%wl = 0.697_JPRB + ASWBAND( 8)%wl = 0.973_JPRB + ASWBAND( 7)%wl = 1.269_JPRB + ASWBAND( 6)%wl = 1.447_JPRB + ASWBAND( 5)%wl = 1.767_JPRB + ASWBAND( 4)%wl = 2.040_JPRB + ASWBAND( 3)%wl = 2.308_JPRB + ASWBAND( 2)%wl = 2.752_JPRB + ASWBAND( 1)%wl = 3.407_JPRB + ASWBAND(14)%wl = 5.254_JPRB + + ASWBAND(:)%split = .false. + ASWBAND(:)%insitu = .false. + + CALL TM5M7_OPTICS_INIT(NASWBAND,ASWBAND) + + !LW wavenumbers for ham optics + ALWWN1 = (/ & !< Spectral band lower boundary in wavenumbers + & 10._JPRB, 350._JPRB, 500._JPRB, 630._JPRB, 700._JPRB, 820._JPRB, & + & 980._JPRB,1080._JPRB,1180._JPRB,1390._JPRB,1480._JPRB,1800._JPRB, & + & 2080._JPRB,2250._JPRB,2380._JPRB,2600._JPRB/) + ALWWN2 = (/ & !< Spectral band upper boundary in wavenumbers + & 350._JPRB, 500._JPRB, 630._JPRB, 700._JPRB, 820._JPRB, 980._JPRB, & + & 1080._JPRB,1180._JPRB,1390._JPRB,1480._JPRB,1800._JPRB,2080._JPRB, & + & 2250._JPRB,2380._JPRB,2600._JPRB,3250._JPRB/) + + CASE DEFAULT + + ! Option not implemented + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME)) + +END SELECT + +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('TM5M7_INIT',1,ZHOOK_HANDLE) +END SUBROUTINE TM5M7_INIT diff --git a/ifs-source/arpifs/m7_nonused/mo_constants.F90 b/ifs-source/arpifs/m7_nonused/mo_constants.F90 new file mode 100644 index 00000000..c9a6f005 --- /dev/null +++ b/ifs-source/arpifs/m7_nonused/mo_constants.F90 @@ -0,0 +1,25 @@ +MODULE mo_constants +!- Description: +! +! This module contains basic constants and derived constants +! +!- Author: +! +! M. Giorgetta, MPI, April 1999 +! I. Kirchner, MPI, December 2000, time control +! L. Kornblueh, MPI, January 2001, cleanup + USE mo_kind, ONLY: dp + +! eehol: added pointers to constants + USE RTTOV_CONST, ONLY: & + api => PI, & + argas => RGC, & + avo => NA + + IMPLICIT NONE +! Universal constants + !REAL(dp), PARAMETER :: api = 3.14159265358979323846_dp ! pi !<--eehol + REAL(dp), PARAMETER :: asqrt2 = 1.41421356237309504880_dp + !REAL(dp), PARAMETER :: argas = 8.314409_dp ! universal gas constant (R) in J/K/mol !<--eehol + !REAL(dp), PARAMETER :: avo = 6.02214e23_dp ! Avogadro constant in 1/mol !<--eehol +END MODULE mo_constants diff --git a/ifs-source/arpifs/m7_nonused/mo_convert_concentrations.F90 b/ifs-source/arpifs/m7_nonused/mo_convert_concentrations.F90 new file mode 100644 index 00000000..396db687 --- /dev/null +++ b/ifs-source/arpifs/m7_nonused/mo_convert_concentrations.F90 @@ -0,0 +1,197 @@ +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!> +!! \filename +!! mo_convert_concentrations.f90 +!! +!! \brief +!! Contains subroutines and functions to convert initial concentrations to pxtm1 and then pxtm1 back +!! to concentrations and mixing ratios. In addition, the gas conversion to mixing ratio +!! is done in a different routine as it is calculated for different time steps. +!! +!! +!! \author Eemeli Holopainen (FMI) +!! +!! \responsible_coder +!! Eemeli Holopainen, eemeli.holopainen@fmi.fi +!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +MODULE mo_convert_concentrations + + PUBLIC :: conc2mmr + PUBLIC :: mmr2conc + +CONTAINS + + SUBROUTINE conc2mmr(kproma,kbdim,klev, & + ktrac,pxtm1,paerml,paernl,prhoa) + + USE mo_kind, ONLY : dp + + USE mo_species, ONLY: & + speclist + + USE mo_ham_species, ONLY: & + id_so4 + + USE mo_ham, ONLY: naerocomp, aerocomp, subm_aerounitconv, subm_aero_idx, & + sizeclass, mw_so4, nclass, immr2molec + + USE mo_physical_constants, ONLY: avo + + USE mo_exception, ONLY: finish, message, message_text + + IMPLICIT NONE + + INTEGER, PARAMETER :: nmod = 7 + + !-- input output variables -------- + INTEGER, INTENT(IN) :: & + kproma, & + kbdim, & + klev, & ! number of vertical levels + ktrac + + REAL(dp), INTENT(IN) :: prhoa(kbdim,klev), & ! air mass density [kg m-3] + paerml(kbdim,klev,naerocomp), & + paernl(kbdim,klev,nclass) + + REAL(dp), INTENT(INOUT) :: & + pxtm1(kbdim,klev,ktrac) ! tracer mass/number mixing ratio + + + !-- local variables -------- + + INTEGER :: ii, jj, kk + INTEGER :: jt, jn ,jl, jk, jspec ! for indexing + + REAL(dp):: zfac, & + zfacm, & + zfacn, & + zfac1, & + zqunitfac, & + zmvsu + + + zmvsu = (speclist(id_so4)%moleweight/1000.)/avo/speclist(id_so4)%density + + !--- Factor to transform mass SO4 in kg into molecules per kg: + zfacm = 6.022e+20_dp/mw_so4 + + !--- Factor to transform kg into micro gram: + + zfac = 1.e09_dp + + !--- Factor to transform N/m**3 into N/cm**3: + + zfacn = 1.0e-06_dp + + !--- Calculate mixing ratios from paerml + DO jn=1, naerocomp + jt = aerocomp(jn)%idt ! get tracer id + jspec = aerocomp(jn)%spid ! get species id + jl = subm_aero_idx(jspec) ! get index to subm_aerospec list + !!mgs=old code!! IF (aerocomp(jn)%species%m7unitconv == immr2molec) THEN + IF (jl <= 0) THEN + WRITE(message_text,*) 'SUBM_AERO_IDX Mapping error !! No index for jspec=',jspec + CALL finish('ham_subm_interface', message_text) + END IF + IF (subm_aerounitconv(jl) == immr2molec) THEN + zfac1 = zfacm + ELSE + zfac1 = zfac + END IF + + pxtm1(1:kproma,:,jt) = paerml(1:kproma,:,jn)/ (zfac1*prhoa(1:kproma,:)) + + END DO + + !--- Calculate particle numbers from paernl + + DO jn=1, nclass + jt = sizeclass(jn)%idt_no + !paernl(1:kproma,:,jn) = paernl(1:kproma,:,jn)*1.e-6_dp !eehol: convert 1/m3 to 1/cm3 + pxtm1(1:kproma,:,jt) = paernl(1:kproma,:,jn) / (zfacn*prhoa(1:kproma,:)) + END DO + + END SUBROUTINE conc2mmr + + SUBROUTINE mmr2conc(kproma,kbdim,klev, & + ktrac,pxtm1,paerml,paernl,prhoa) + + USE mo_kind, ONLY : dp + + !USE mo_ham_salsactl, ONLY: fn2b + + USE mo_ham, ONLY: naerocomp, aerocomp, subm_aerounitconv, subm_aero_idx, & + sizeclass, mw_so4, nclass, immr2molec + + USE mo_exception, ONLY: finish, message, message_text + + !-- input output variables -------- + + INTEGER, INTENT(in) :: & + kproma, & + kbdim, & + klev, & ! number of vertical levels + ktrac + + REAL(dp), INTENT(INOUT) :: & + paerml(kbdim,klev,naerocomp), & + paernl(kbdim,klev,nclass) + + REAL(dp), INTENT(IN) :: & + pxtm1(kbdim,klev,ktrac), & ! tracer mass/number mixing ratio + prhoa(kbdim,klev) ! air mass density [kg m-3] + + !-- local variables -------- + + REAL(dp):: zfac, & + zfacm, & + zfacn, & + zfac1, & + zqunitfac, & + zmvsu + + INTEGER :: jt, jn ,jl, jk, jspec ! for indexing + + + !--- Factor to transform mass SO4 in kg into molecules per kg: + zfacm = 6.022e+20_dp/mw_so4 + + !--- Factor to transform kg into micro gram: + + zfac = 1.e09_dp + + !--- Factor to transform N/m**3 into N/cm**3: + + zfacn = 1.0e-06_dp + + !--- Calculate mixing ratios from pxtm1 + DO jn=1, naerocomp + jt = aerocomp(jn)%idt ! get tracer id + jspec = aerocomp(jn)%spid ! get species id + jl = subm_aero_idx(jspec) ! get index to subm_aerospec list + !!mgs=old code!! IF (aerocomp(jn)%species%m7unitconv == immr2molec) THEN + IF (jl <= 0) THEN + WRITE(message_text,*) 'SUBM_AERO_IDX Mapping error !! No index for jspec=',jspec + CALL finish('ham_subm_interface', message_text) + END IF + IF (subm_aerounitconv(jl) == immr2molec) THEN + zfac1 = zfacm + ELSE + zfac1 = zfac + END IF + + paerml(1:kproma,:,jn) = pxtm1(1:kproma,:,jt)*(zfac1*prhoa(1:kproma,:)) + + END DO + + !--- Calculate particle numbers from pxtm1 + + DO jn=1, nclass + jt = sizeclass(jn)%idt_no + paernl(1:kproma,:,jn) = zfacn*prhoa(1:kproma,:)*pxtm1(1:kproma,:,jt)!*1.e6_dp !eehol: convert 1/cm3 to 1/m3 + END DO + + END SUBROUTINE mmr2conc +END MODULE mo_convert_concentrations diff --git a/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 b/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 index 8f06617c..70e28676 100644 --- a/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 +++ b/ifs-source/arpifs/mgrids/advection/mgrids_advection_module.F90 @@ -57,7 +57,7 @@ module mgrids_advection_module !! Notify if mgrids_advection is active ( implementation != null ) procedure, public :: execute !! Execute mgrids_advection - procedure, public :: final + procedure, public :: cleanup !! Cleanup mgrids_advection end type @@ -131,7 +131,7 @@ module subroutine execute( & !------------------------------------------------------------------------------ interface - module subroutine final(this) + module subroutine cleanup(this) class(mgrids_advection) :: this end subroutine end interface diff --git a/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 b/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 index 322e21f9..58f25623 100644 --- a/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 +++ b/ifs-source/arpifs/mgrids/advection/mgrids_advection_submodule.F90 @@ -67,7 +67,7 @@ module function mgrids_advection_create( & contains subroutine setup_no_advection() - call this%final() + call this%cleanup() end subroutine subroutine setup_mgrids_sladv() @@ -197,7 +197,7 @@ module subroutine execute( & !------------------------------------------------------------------------------ -module subroutine final(this) +module subroutine cleanup(this) class(mgrids_advection) :: this if( associated( this%implementation ) ) then call this%implementation%final() diff --git a/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 b/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 index dd7c812f..78b23f81 100644 --- a/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 +++ b/ifs-source/arpifs/module/model_mod_model_ini_phys.F90 @@ -113,7 +113,7 @@ MODULE SUBROUTINE MODEL_INI_PHYS(SELF, YDFIELDS, YDTIME) ENDIF CALL SETRIP0(YDTIME) -CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS%YRSURF,SELF,NSTEP, & +CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS,SELF,NSTEP, & & SELF%YRML_GCONF%YRRIP%TDT,SELF%YRML_GCONF%YRRIP%TSTEP,.TRUE.) IF (SELF%YRML_PHY_EC%YREPHY%LEPHYS.OR. & & (SELF%YRML_PHY_MF%YRPHY%LMPHYS.AND.SELF%YRML_PHY_MF%YRPHY%LRAYFM)) THEN diff --git a/ifs-source/arpifs/module/model_mod_model_step.F90 b/ifs-source/arpifs/module/model_mod_model_step.F90 index 1f1c09a4..77a46605 100644 --- a/ifs-source/arpifs/module/model_mod_model_step.F90 +++ b/ifs-source/arpifs/module/model_mod_model_step.F90 @@ -98,7 +98,7 @@ MODULE SUBROUTINE MODEL_STEP(SELF, YDFIELDS, YDTIME, KSECS, YDERRMOD_FIELDS, LDC ! Set time-step and update time of the model CALL SETRIPSTEP(SELF%YRML_GCONF%YRRIP%TSTEP, YDTIME, KSECS) -CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS%YRSURF,SELF,NSTEP, & +CALL UPDTIM(YDFIELDS%GEOM,YDFIELDS,SELF,NSTEP, & & SELF%YRML_GCONF%YRRIP%TDT,SELF%YRML_GCONF%YRRIP%TSTEP,LLCLUPD) CALL DATE_AND_TIME(CLDAT(1),CLTIMEOD,CLDAT(3),IVALUES) diff --git a/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 b/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 index 152dd8ce..d85c817e 100644 --- a/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 +++ b/ifs-source/arpifs/module/model_physics_aerosol_mod.F90 @@ -16,7 +16,8 @@ MODULE MODEL_PHYSICS_AEROSOL_MOD USE YOEAERSNK, ONLY : TEAERSNK USE YOEAERSRC, ONLY : TEAERSRC USE YOEAERVOL, ONLY : TEAERVOL - USE YOEDBUG, ONLY : TEDBUG + USE YOEAEROP, ONLY : TEAERM7,TEAEROCMIPSTRAT + USE YOEDBUG, ONLY : TEDBUG IMPLICIT NONE TYPE MODEL_PHYSICS_AEROSOL_TYPE @@ -28,6 +29,8 @@ MODULE MODEL_PHYSICS_AEROSOL_MOD TYPE(TEAERSRC) :: YREAERSRC !! sources TYPE(TEAERVOL) :: YREAERVOL !! volcanic aerosols TYPE(TEDBUG) :: YREDBUG !! aerosol debugging help + TYPE(TEAERM7) :: YREAEROPT !! M7 aerosol optical properties + TYPE(TEAEROCMIPSTRAT):: YREAEROSTRAT !! cmip6 and cmip7 stratospheric aerosols CONTAINS diff --git a/ifs-source/arpifs/module/par_gfl.F90 b/ifs-source/arpifs/module/par_gfl.F90 index a5c21714..8e958d47 100644 --- a/ifs-source/arpifs/module/par_gfl.F90 +++ b/ifs-source/arpifs/module/par_gfl.F90 @@ -40,14 +40,14 @@ MODULE PAR_GFL INTEGER(KIND=JPIM), PARAMETER :: JPCHEM=220 INTEGER(KIND=JPIM), PARAMETER :: JPGHG_ASSIM=2 INTEGER(KIND=JPIM), PARAMETER :: JPCHEM_ASSIM=6 -INTEGER(KIND=JPIM), PARAMETER :: JPAERO=42 +INTEGER(KIND=JPIM), PARAMETER :: JPAERO=52 INTEGER(KIND=JPIM), PARAMETER :: JPFORC=1100 INTEGER(KIND=JPIM), PARAMETER :: JPERA40=14 INTEGER(KIND=JPIM), PARAMETER :: JPSLDIA=7 INTEGER(KIND=JPIM), PARAMETER :: JPEZDIAG=50 INTEGER(KIND=JPIM), PARAMETER :: JPCH4S=1 INTEGER(KIND=JPIM), PARAMETER :: JPNOGW=2 -INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=38 +INTEGER(KIND=JPIM), PARAMETER :: JPAEROUT=50 INTEGER(KIND=JPIM), PARAMETER :: JPAEROCLIM=3 INTEGER(KIND=JPIM), PARAMETER :: JPUVP=2 INTEGER(KIND=JPIM), PARAMETER :: JPPHYS=9 diff --git a/ifs-source/arpifs/module/parfpos.F90 b/ifs-source/arpifs/module/parfpos.F90 index b7bb6fd3..9b954a0a 100644 --- a/ifs-source/arpifs/module/parfpos.F90 +++ b/ifs-source/arpifs/module/parfpos.F90 @@ -46,6 +46,7 @@ MODULE PARFPOS ! JPOS3DF : Maximum number of 3D dynamic fields ! JPOS2DF : Maximum number of 2D dynamic fields ! JPOSDYN : Maximum number of dynamic fields +! JPOSTRAC: [FIXME: missing definition] ! JPOSGHGFLX : Maximum number of post-processable greenhouse gases ! JPOSGHG : Maximum number of post-processable greenhouse gases ! JPOSAERO: Maximum number of post-processable aerosols @@ -88,9 +89,10 @@ MODULE PARFPOS INTEGER(KIND=JPIM), PARAMETER :: JPOSSCVA=6 INTEGER(KIND=JPIM), PARAMETER :: JPOSGHG=3 INTEGER(KIND=JPIM), PARAMETER :: JPOSGHGFLX=6 +INTEGER(KIND=JPIM), PARAMETER :: JPOSTRAC=10 INTEGER(KIND=JPIM), PARAMETER :: JPOSCHEM=150 INTEGER(KIND=JPIM), PARAMETER :: JPOSCHEMFLX=50 -INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO=42 +INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO=50 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERO2=2*JPOSAERO INTEGER(KIND=JPIM), PARAMETER :: JPOSAERODIAG=8 INTEGER(KIND=JPIM), PARAMETER :: JPOSAEROCLIM=3 @@ -103,7 +105,7 @@ MODULE PARFPOS INTEGER(KIND=JPIM), PARAMETER :: JPOSAERLISI_VAR=6 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERLISI_WVL=3 INTEGER(KIND=JPIM), PARAMETER :: JPOSAERLISI=JPOSAERLISI_VAR*JPOSAERLISI_WVL -INTEGER(KIND=JPIM), PARAMETER :: JPOSAEROUT=38 +INTEGER(KIND=JPIM), PARAMETER :: JPOSAEROUT=50 INTEGER(KIND=JPIM), PARAMETER :: JPOSAOD=9 INTEGER(KIND=JPIM), PARAMETER :: JPOSPM=3 INTEGER(KIND=JPIM), PARAMETER :: JPOSUVP=2 @@ -122,6 +124,10 @@ MODULE PARFPOS ! + 1 totpreciprate + 20 for snowML (4*5 snowML GA) INTEGER(KIND=JPIM), PARAMETER :: JPOSFSU=28 INTEGER(KIND=JPIM), PARAMETER :: JPOSSFX=1000 + +! RCHG -> Not sure about this way of of programming where numbers are +! added without definition of what the are. This limit the generalization +! of the code, the ability to tests and the readability. INTEGER(KIND=JPIM), PARAMETER :: & & JPOSSGP=180+JPOSVX2+JPOSFSU+JPOSGHGFLX+JPOSCHEM+3*JPOSCHEMFLX+(JPOSAERO*JPOSAERODIAG)+ & & (JPOSAERO_WVL_DIAG*JPOSAERO_WVL_DIAG_TYPES)+JPOSEMIS2D+JPOSEMIS2DAUX+ & diff --git a/ifs-source/arpifs/module/surface_fields_mix.F90 b/ifs-source/arpifs/module/surface_fields_mix.F90 index e2e081f0..fe65c0bd 100644 --- a/ifs-source/arpifs/module/surface_fields_mix.F90 +++ b/ifs-source/arpifs/module/surface_fields_mix.F90 @@ -335,6 +335,7 @@ MODULE SURFACE_FIELDS_MIX ! Indices to start/end albedo climatology coefficients currently in use INTEGER(KIND=JPIM) :: IALSTART, IALEND TYPE(TYPE_SURF_MTL_2D), POINTER :: YFP1 =>NULL() ! surface orography in the 2nd part of FULLPOS-927 + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSO2DD=>NULL() ! sulphate dry dep velocity TYPE(TYPE_SURF_MTL_2D), POINTER :: YDMSO =>NULL() ! oceanic DMS TYPE(TYPE_SURF_MTL_2D), POINTER :: YURBF =>NULL() ! Urban fraction @@ -343,6 +344,7 @@ MODULE SURFACE_FIELDS_MIX TYPE(TYPE_SURF_MTL_2D), POINTER :: YAERDEP=>NULL() ! dust emission potential TYPE(TYPE_SURF_MTL_2D), POINTER :: YAERLTS=>NULL() ! dust lifting threshold speed TYPE(TYPE_SURF_MTL_2D), POINTER :: YAERSCC=>NULL() ! dust soil clay content + TYPE(TYPE_SURF_MTL_2D), POINTER :: YSOILTYPE ! TM5M7 soil type information TYPE(TYPE_SURF_MTL_2D), POINTER :: YDSF =>NULL() ! dust source function TYPE(TYPE_SURF_MTL_2D), POINTER :: YDSZ =>NULL() ! dust size distribution modulation TYPE(TYPE_SURF_MTL_2D), POINTER :: YCHEMFLXO(:)=>NULL() ! total chemistry flux (emissions + deposition) @@ -1234,10 +1236,27 @@ SUBROUTINE SETUP_SFLP2(YDSC,YD,KGRIB,CDNAME,PDEFAULT,KTRAJ,KREQIN) INTEGER(KIND=JPIM) :: IPTR REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!INTEGER(KIND=JPIM) :: PKGRIB +!CHARACTER(LEN=16) :: PCDNAME !------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('SURFACE_FIELDS_MIX:SETUP_SFLP2',0,ZHOOK_HANDLE) +!if (present(KGRIB)) THEN +! PKGRIB=KGRIB +! else +! PKGRIB=-1234 +! endif + +! if (present(CDNAME)) THEN +! PCDNAME=CDNAME +! else +! PCDNAME='no-cdname' +!endif + +!WRITE(NULOUT,*) '[SETUP_SFLP2 SUBROUTINE]',PKGRIB, PCDNAME + + IPTR = YDSC%IPTR IF(IPTR > JPMAXSFLDS-1) THEN ! We are about to set the last element which is generally used as a diff --git a/ifs-source/arpifs/module/tm5_photolysis.F90 b/ifs-source/arpifs/module/tm5_photolysis.F90 index 789b9c3c..c0348dfb 100644 --- a/ifs-source/arpifs/module/tm5_photolysis.F90 +++ b/ifs-source/arpifs/module/tm5_photolysis.F90 @@ -149,6 +149,8 @@ MODULE TM5_PHOTOLYSIS REAL(KIND=JPRB), DIMENSION(2), PARAMETER :: WL_GLOMAP = (/ & & 320., 542. /) +!M7 related +INTEGER(KIND=JPIM),DIMENSION(NBANDS_TROP) :: WAV_GRID, WAV_GRIDA INTEGER(KIND=JPIM),DIMENSION(7),PARAMETER :: & & LINI = (/1, 18, 31, 40, 48, 61, 78 /), & @@ -608,4 +610,266 @@ MODULE TM5_PHOTOLYSIS & (/.253817E+01 ,.253817E+01 ,.254719E+01 ,.254719E+01 ,.254719E+01 ,.253815E+01,.250875E+01/) +! Logical to test whether photolysis data has been initialized +LOGICAL :: LL_TM5_PHOTO_INI = .FALSE. + + +contains + + +! Initialize new photolysis routine +! ----------------------------------------------------------- +SUBROUTINE PHOTOLYSIS_INI +!USE TM5_PHOTOLYSIS , ONLY : WAVE_FULL, DWAVE_FULL, WAVE, DWAVE, MAXWAV, & +! & NWAV_NO2,NWAV_CO,NWAV_HNO3,NWAV_O3,NWAV_PAN,NWAV_H2O2,NWAV_N2O5,NWAV_CH2O,& +! & NWAV_NO3,NWAV_ACET, & +! & CS_RAY, PHI0, RD, FLUX, NTEMP_MAX, & +! & XS_O3_LOOK,XS_HNO3_LOOK,XS_PAN_LOOK,QY_O3_LOOK,XS_H2O2_LOOK, & +! & XS_N2O5_LOOK,XS_NO2_LOOK,QY_NO2_LOOK,QY_CO_LOOK,XS_NO3_LOOK, XS_CH2O_LOOK, & +! & A1_ACET,A2_ACET,A3_ACET,A4_ACET, & +! & SCA,ABS_EFF, GFAC, EXT , PN_REF + +USE YOMLUN , ONLY : NULOUT +USE PARKIND1 , ONLY : JPIM ,JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + +IMPLICIT NONE + +! Local parameters +INTEGER(KIND=JPIM), PARAMETER :: IUTMP=77 +INTEGER(KIND=JPIM) :: IK, IWAV, JL +REAL(KIND=JPRB) :: ZWL,ZX +LOGICAL :: LLFILEOK +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!TM5 photolysis info file +CHARACTER(LEN=27) :: CL_TM5_PHOTO_LOOKUP='tropo_look_up_cbmhybrid.dat' +!TM5 extraterrestrial flux: +CHARACTER(LEN=21) :: CL_TM5_EXTRATERRESTRIAL='OMI.data.extraterrest' +!TM5 aerosol: +CHARACTER(LEN=18) :: CL_TM5_AEROSOL='aerosol_reduce.dat' +#include "abor1.intfb.h" + +IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',0,ZHOOK_HANDLE) + +DO IK=1,13 + WAVE_FULL(IK)=1._JPRB/(56250._JPRB-500._JPRB*IK) +ENDDO + +DO IK=14,45 + WAVE_FULL(IK)=1._JPRB/(49750._JPRB-(IK-13)*500._JPRB) +ENDDO + +DO IK=46,68 + WAVE_FULL(IK)=(266._JPRB+(IK-13))*1.E-7_JPRB +ENDDO + +DO IK=69,71 + WAVE_FULL(IK)=(320.5_JPRB+2.*(IK-68))*1.E-7_JPRB +ENDDO +DO IK=72,176 + WAVE_FULL(IK)=(325._JPRB+5._JPRB*(IK-71))*1.E-7_JPRB +ENDDO + +DO IK=2,MAXWAV-1 + DWAVE_FULL(IK)=0.5_JPRB*(WAVE_FULL(IK+1)-WAVE_FULL(IK-1)) +ENDDO +DWAVE_FULL(1) = DWAVE_FULL(2) +DWAVE_FULL(MAXWAV) = DWAVE_FULL(MAXWAV-1) +! select a subset from the full spctral grid to remove the first band +WAVE=WAVE_FULL(14:135) +DWAVE=DWAVE_FULL(14:135) + + +!--------------------------------------------------------------------- +! Rayleigh scattering cross sections +! emp. formula of Nicolet plan. space sci.32, 1467f (1984) +!--------------------------------------------------------------------- + +DO IK=1,MAXWAV + ZWL=WAVE(IK)*1.E4_JPRB + ZX=0.389*ZWL+0.09426_JPRB/ZWL-0.3228_JPRB + CS_RAY(IK)=4.02E-28_JPRB/ZWL**(4._JPRB+ZX) +ENDDO + +!--------------------------------------------------------------------- +! QUANTUM YIELD OF METHYGLYOXAL S. KOCH and G. K. MOORTGAT +! J Phys Chem, 102, 9142-9153, 1998. +! +! JEW: the qy_ch3cocho array has been reduced to 52 bins to represent the pressure. +! dep. spectral bins ONLY !! +!--------------------------------------------------------------------- + +! Calculate co-efficients for METHYGLYOXAL qy outside loop +PHI0 = 1. +RD = 0. + +! for wave < 380nm qy is essentially = 1.0. +DO IK = 1,39 + IF(IK<32) THEN + PHI0(IK) = 1 + ELSEIF(IK>=32) THEN + PHI0(IK) = 8.15E-9_JPRB * EXP(7131._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) + ENDIF + RD(IK) = 7.34E-9_JPRB * EXP(8793._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) +ENDDO + +DO IK = 40,52 + PHI0(IK) = 3.63E-7_JPRB * EXP(5693._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) + RD(IK) = 1.93E4_JPRB*EXP(-5639._JPRB/WAVE(IK+37_JPIM)*1.E-7_JPRB) +ENDDO + +!-------------------------------------------------------------- +! Read and store temperature dependent cross-section values +!-------------------------------------------------------------- +LLFILEOK=.FALSE. +INQUIRE(FILE=TRIM(CL_TM5_PHOTO_LOOKUP),EXIST=LLFILEOK ) +IF(.NOT. LLFILEOK)THEN + WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) + CALL ABOR1('tm5_chem_ini: photo inputfile does not exist.') +ELSE + WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_PHOTO_LOOKUP) + OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & + & FILE=TRIM(CL_TM5_PHOTO_LOOKUP)) + +READ(IUTMP,*) +READ(IUTMP,*) +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_O3_LOOK(IWAV,IK),IWAV=1,MAXWAV) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_HNO3_LOOK(IWAV,IK),IWAV=1,NWAV_HNO3) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_H2O2_LOOK(IWAV,IK),IWAV=1,NWAV_H2O2) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_N2O5_LOOK(IWAV,IK),IWAV=1,NWAV_N2O5) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_CH2O_LOOK(IWAV,IK),IWAV=1,NWAV_CH2O) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_PAN_LOOK(IWAV,IK),IWAV=1,NWAV_PAN) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (XS_NO3_LOOK(IWAV,IK),IWAV=1,NWAV_NO3) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*) (QY_O3_LOOK(IWAV,IK),IWAV=1,NWAV_O3) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(QY_NO2_LOOK(IWAV,IK),IWAV=1,NWAV_NO2) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(QY_CO_LOOK(IWAV,IK),IWAV=1,NWAV_CO) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A1_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A2_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A3_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +READ(IUTMP,*) +DO IK=1,NTEMP_MAX + READ(IUTMP,*)(A4_ACET(IWAV,IK),IWAV=1,NWAV_ACET) +ENDDO +CLOSE(IUTMP) + +ENDIF + +! put constants in correct units + +A1_ACET=A1_ACET*1E-18_JPRB +A2_ACET=A2_ACET*1E-17_JPRB +A4_ACET=A4_ACET*1E-15_JPRB + +!-------------------------------------------------------------- +! Read and store temperature dependent cross-section values +! +!----- extraterrestrial flux from input file ------------------ +LLFILEOK=.FALSE. +INQUIRE(FILE=TRIM(CL_TM5_EXTRATERRESTRIAL),EXIST=LLFILEOK ) +IF(.NOT. LLFILEOK)THEN + WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) + CALL ABOR1('tm5_chem_ini: extraterrestrial inputfile does not exist.') +ELSE + WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_EXTRATERRESTRIAL) + OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & + & FILE=TRIM(CL_TM5_EXTRATERRESTRIAL)) + READ(IUTMP,*) + READ(IUTMP,*) FLUX + CLOSE(IUTMP) +ENDIF + + +!************************************************************************** +! aerosol data from: "Models for Aerosols of the Lower Atmosphere +! and the Effects of Humidity Variations on their Optical Properties +! E. P. Shettle and R. W. Fenn (1979), Environmental Research Paper +! No. 676 +!************************************************************************** +LLFILEOK=.FALSE. +INQUIRE(FILE=TRIM(CL_TM5_AEROSOL),EXIST=LLFILEOK ) +IF(.NOT. LLFILEOK)THEN + WRITE(NULOUT,*) 'ERROR tm5_chem_ini: Cannot read TM5 file '//TRIM(CL_TM5_AEROSOL) + CALL ABOR1('tm5_chem_ini: aerosol inputfile does not exist.') +ELSE + WRITE(NULOUT,*) 'INFO tm5_chem_ini: Opening TM5 file '//TRIM(CL_TM5_AEROSOL) + OPEN(IUTMP,FORM='FORMATTED',ACTION='READ',STATUS='OLD', & + & FILE=TRIM(CL_TM5_AEROSOL)) + DO JL = 1,4 + READ(IUTMP,*) + DO IK = 1,8 + READ(IUTMP,*) + READ(IUTMP,'(6(1X,F7.5))')(EXT(IWAV,IK,JL),IWAV=1,MAXWAV) + READ(IUTMP,'(6(1X,F7.5))')(ABS_EFF(IWAV,IK,JL),IWAV=1,MAXWAV) + READ(IUTMP,'(6(1X,F7.5))')(GFAC(IWAV,IK,JL),IWAV=1,MAXWAV) + DO IWAV=1,MAXWAV + SCA(IWAV,IK,JL) = EXT(IWAV,IK,JL) - ABS_EFF(IWAV,IK,JL) + ENDDO + ENDDO + ENDDO + CLOSE(IUTMP) + + DO IWAV=1,MAXWAV + DO IK=1,8 + DO JL=1,4 + SCA(IWAV,IK,JL) = SCA(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB + ABS_EFF(IWAV,IK,JL) = ABS_EFF(IWAV,IK,JL)/PN_REF(JL)*1.E-5_JPRB + ENDDO + ENDDO + ENDDO + +ENDIF + +!VH - file format(6(1X,F7.5)) + +WRITE(NULOUT,*) 'INFO tm5_chem_ini: Finished reading TM5 photolysis input files ' + + +IF (LHOOK) CALL DR_HOOK('TM5_CHEM_INI:PHOTOLYSIS_INI',1,ZHOOK_HANDLE) +END SUBROUTINE PHOTOLYSIS_INI + + END MODULE TM5_PHOTOLYSIS diff --git a/ifs-source/arpifs/module/yoeaeratm.F90 b/ifs-source/arpifs/module/yoeaeratm.F90 index 107816fc..75112719 100644 --- a/ifs-source/arpifs/module/yoeaeratm.F90 +++ b/ifs-source/arpifs/module/yoeaeratm.F90 @@ -62,11 +62,13 @@ MODULE YOEAERATM REAL(KIND=JPRB) :: REPSCAER LOGICAL :: LAERCLIMG, LAERCLIMZ, LAERCLIST, LAERDRYDP, LAERHYGRO, LAERLISI -LOGICAL :: LAERNGAT , LAERSEDIM, LAERSURF , LAERELVS , LAER6SDIA,LAERSEDIMSS +LOGICAL :: LAERNGAT , LAERSCAV, LAERSEDIM, LAERSURF , LAERELVS , LAER6SDIA,LAERSEDIMSS LOGICAL :: LAERGTOP , LAERRAD , LAERCCN , LAEROPT(9),LAERINIT , LAERVOL -LOGICAL :: LAERCSTR , LAERDIAG1, LAERDIAG2, LAERRRTM , LAERUVP -LOGICAL :: LAEREXTR , LAERGBUD , LAERPRNT +LOGICAL :: LAERCSTR , LAERDIAG1, LAERDIAG2, LAERRRTM , LAERUVP, LUVINDX +LOGICAL :: LAEREXTR , LAERGBUD , LAERPRNT, LAERCALIP LOGICAL :: LAERNITRATE +LOGICAL :: LAERSOA_CHEM +LOGICAL :: LAERSCAV_CHEM LOGICAL :: LSEASALT_RH80 LOGICAL :: LAERDUSTSOURCE LOGICAL :: LAERDUSTSIZEVAR diff --git a/ifs-source/arpifs/module/yoeaerop.F90 b/ifs-source/arpifs/module/yoeaerop.F90 index 49bded7a..0c8fb6d4 100644 --- a/ifs-source/arpifs/module/yoeaerop.F90 +++ b/ifs-source/arpifs/module/yoeaerop.F90 @@ -10,7 +10,7 @@ MODULE YOEAEROP -USE PARKIND1 ,ONLY : JPRB +USE PARKIND1 ,ONLY : JPRB, JPIM IMPLICIT NONE @@ -48,7 +48,6 @@ MODULE YOEAEROP REAL(KIND=JPRB) :: ALFL_SS(12,16,3), ASYL_SS(12,16,3), OMGL_SS(12,16,3) REAL(KIND=JPRB) :: ALFL_SU(12,16) , ASYL_SU(12,16) , OMGL_SU(12,16) - ! ------------------------------------------------------------------ ! 9 refers to up to 9 bins (3 operationally for SS and DD) ! 20 to 19 SW channel radiances + 1 channel at 10 micron @@ -69,5 +68,39 @@ MODULE YOEAEROP ! OMG is pizero, the single scattering albedo ND ! RALI is the lidar ratio ND ! ------------------------------------------------------------------ + +!CMIP6/7 Stratospheric aerosols +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NLAT = 36 +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NSB = 14 +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NTB = 16 +INTEGER(KIND=JPIM), PARAMETER :: STRATO_CMIP_NMONTH = 3 +REAL(KIND=JPRB), DIMENSION(STRATO_CMIP_NLAT):: STRATO_CMIP_LAT +REAL(KIND=JPRB), DIMENSION(STRATO_CMIP_NSB) :: STRATO_CMIP_SB +REAL(KIND=JPRB), DIMENSION(STRATO_CMIP_NTB) :: STRATO_CMIP_TB +INTEGER(KIND=JPIM) :: STRATO_CMIP_NALT, STRATO_FIRSTYEAR, STRATO_LASTYEAR, STRATO_CMIP_NTIME + +REAL(KIND=JPRB) :: CHECK_SUN_MEAN = -9999._JPRB, CHECK_EARTH_MEAN = -9999._JPRB + +TYPE:: TEAEROCMIPSTRAT + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:) :: STRATO_CMIP_ALT + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: AOD_SUN, AAOD_SUN, REFAOD_SUN + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) :: AAOD_EARTH + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: AOD_SUN_MEAN, AAOD_SUN_MEAN, REFAOD_SUN_MEAN + REAL(KIND=JPRB), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: AAOD_EARTH_MEAN + ! Stratospheric aerosol optical properties + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_AOD(:,:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_AAOD(:,:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_REFAOD(:,:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: STRAT_AAOD_LW(:,:,:,:,:) +END TYPE TEAEROCMIPSTRAT + +! M7 aerosol optical properties +TYPE:: TEAERM7 + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AOD(:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7SSA(:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7ASYM(:,:,:,:) + REAL(KIND=JPRB), ALLOCATABLE, PUBLIC :: M7AODLW(:,:,:,:) +END TYPE TEAERM7 + END MODULE YOEAEROP diff --git a/ifs-source/arpifs/module/yoeaersnk.F90 b/ifs-source/arpifs/module/yoeaersnk.F90 index 33300310..e8ed809b 100644 --- a/ifs-source/arpifs/module/yoeaersnk.F90 +++ b/ifs-source/arpifs/module/yoeaersnk.F90 @@ -23,6 +23,7 @@ MODULE YOEAERSNK ! ------------------------------------------------------------------ TYPE :: TEAERSNK +LOGICAL :: LDRYDEPVEL_DYN INTEGER(KIND=JPIM):: NDRYDEPVEL_DYN INTEGER(KIND=JPIM) :: NDRYDEP REAL(KIND=JPRB) :: R_R, R_S diff --git a/ifs-source/arpifs/module/yoeaersrc.F90 b/ifs-source/arpifs/module/yoeaersrc.F90 index 6db0c76c..0b4c25dd 100644 --- a/ifs-source/arpifs/module/yoeaersrc.F90 +++ b/ifs-source/arpifs/module/yoeaersrc.F90 @@ -24,6 +24,9 @@ MODULE YOEAERSRC TYPE :: TEAERSRC INTEGER(KIND=JPIM) :: NDDUST, NSSALT, NAERWND, NDMSO, NPIST,NSO4SCHEME +REAL(KIND=JPRB) :: DCAL +LOGICAL :: GUSTS,NOSEASALT + LOGICAL :: LEPAERO, LAEROMIN, LOCNDMS REAL(KIND=JPRB) :: RGELAV, RGEMUV, RDGLAV, RDGMUV @@ -71,7 +74,11 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) IDEPTHLOC = KDEPTH+2 -WRITE(KOUTNO,*) REPEAT(' ',KDEPTH ) // 'model%yrml_phy_aer%yreaersrc : ' + +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'GUSTS = ', SELF%GUSTS +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'DCAL = ', SELF%DCAL +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NOSEASALT = ', SELF%NOSEASALT +WRITE(KOUTNO,*) REPEAT(' ',KDEPTH ) // 'MODEL%YRML_PHY_AER%YREAERSRC : ' WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NDDUST = ', SELF%NDDUST WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NSSALT = ', SELF%NSSALT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERWND = ', SELF%NAERWND diff --git a/ifs-source/arpifs/module/yoedust.F90 b/ifs-source/arpifs/module/yoedust.F90 new file mode 100755 index 00000000..2330b104 --- /dev/null +++ b/ifs-source/arpifs/module/yoedust.F90 @@ -0,0 +1,505 @@ +MODULE YOEDUST + +USE PARKIND1, ONLY: JPIM, JPRB +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY: NULOUT + +IMPLICIT NONE + +SAVE +! ------------------------------------------------------------------ +!*** *YOEDUST* - ECE4 CLIMATOLOGIAL FIELD FOR DUST EMISSION SCHEME ! +! Called in tm5m7_src_dust.F90 +! info: +! This module reads and interpolates climatological ! +! surface fields that used in Dust emission Scheme +! Tegen et al., 2002. +! +! : Marios Chatziparaschos +! Barcelona Supercomputing Center +! : 26/06/2025 +! -----------------------------------------------------------------!- + +INTEGER(KIND=JPIM), PARAMETER :: IMONTH = 12 +INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180 +INTEGER(KIND=JPIM), PARAMETER :: ILON = 360 + +TYPE :: TEAERC_DUST +!- based on SURFACE 2D (lat,lon) 1x1 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: CULT,POTSRC !,SOILTYPE +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: CULT1, SOILTYPE1,POTSRC1 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: SOILTYPE12 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: SOILTYPE123 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: AREA,SOILPH +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: SOILPH1,SOILPH2,SOILPH3,SOILPH4,SOILPH5 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: LAI_MAX, LAI_AVG +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: Z0AM +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: SOILTYPE + +!latitude and logitude in Degrees +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:) :: LATD,LOND + +! in radians +REAL(KIND=JPRB) :: LAT1 = 0.0_JPRB, LON1 = 0.0_JPRB +REAL(KIND=JPRB) :: DLAT = 0.0_JPRB, DLON = 0.0_JPRB +INTEGER(KIND=JPIM) :: NLAT = 0, NLON = 0, NLEV = 0, NMON = 0, NAER = 0 + +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:,:) :: Z0M +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:,:) :: FPAR +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:,:) :: FPAR1 +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: FPAR2 +!lon,lat,month + +! Number of the Grouped fields for 2d-3d, numb-month +INTEGER(KIND=JPIM) :: N3D = 0, N2D = 0, N4D = 0, NMONTH=0 +!Grouped of 2D species (lon, lat, species) +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:,:,:) :: SPECIES3D +REAL(KIND=JPRB),ALLOCATABLE, DIMENSION(:,:,:,:) :: SPECIES4D + +!NOT-USED-NOR-ALLOCATED ! INTERPOLATED ARRAYS - Currently neither used nor allocated +!NOT-USED-NOR-ALLOCATED REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: TCULT, TSOILTYPE, TPOTSRC +!NOT-USED-NOR-ALLOCATED REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: TAREA, TSOILPH, TZ0AM +!NOT-USED-NOR-ALLOCATED REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: TSOILPH1, TSOILPH2, TSOILPH3, TSOILPH4, TSOILPH5 +!NOT-USED-NOR-ALLOCATED REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: TZ0M , TFPAR +!NOT-USED-NOR-ALLOCATED REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:) :: TLAI_MAX, TLAI_AVG + +LOGICAL :: IS_INITIALISED = .FALSE. +LOGICAL :: IS_INTERPOLATED = .FALSE. +LOGICAL :: IS_GROUPED = .FALSE. +CONTAINS +PROCEDURE :: READ => SETUP_DUST_CLIM +PROCEDURE :: INTERPOLATION =>SU_DUST_FIELDS_INTERP + +END TYPE TEAERC_DUST + +TYPE(TEAERC_DUST), POINTER :: YDUSTCLIM => NULL() + +!========================================================================================== + +CONTAINS + +SUBROUTINE SETUP_DUST_CLIM(SELF) + USE YOMLUN, ONLY : NULOUT + !------------ + CLASS(TEAERC_DUST), INTENT(INOUT) :: SELF + + CALL SU_DUST_FIELDS(SELF) + WRITE(NULOUT,*) '2D FIELDS FOR DUST CLIMATOLOGY IS LOADED' + SELF%IS_INITIALISED = .TRUE. + +END SUBROUTINE SETUP_DUST_CLIM + +SUBROUTINE GET_2DSPECIES(SELF) +IMPLICIT NONE +! ARGUMENTS +! ------------ +TYPE(TEAERC_DUST), INTENT(INOUT) :: SELF + +! Expected dimension lengths for month, latitude and longitude +INTEGER(KIND=JPIM), PARAMETER :: IMONTH = 12 +INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180 !61 +INTEGER(KIND=JPIM), PARAMETER :: ILON = 360 !120 +INTEGER, PARAMETER :: idx_SOILPH1 = 1 +INTEGER, PARAMETER :: idx_SOILPH2 = 2 +INTEGER, PARAMETER :: idx_SOILPH3 = 3 +INTEGER, PARAMETER :: idx_SOILPH4 = 4 +INTEGER, PARAMETER :: idx_SOILPH5 = 5 +INTEGER, PARAMETER :: idx_Z0AM = 6 +INTEGER, PARAMETER :: idx_POTSRC = 7 +INTEGER, PARAMETER :: idx_SOILTYPE = 8 +INTEGER, PARAMETER :: idx_AREA = 9 +INTEGER, PARAMETER :: idx_CULT = 10 +!3D SPECIES +INTEGER, PARAMETER :: idx_FPAR = 1 +INTEGER, PARAMETER :: idx_Z0M = 2 +! Assuming dimensions have been set for lat and lon +IF (.NOT. ALLOCATED(SELF%SPECIES3D)) THEN + ALLOCATE(SELF%SPECIES3D(SELF%NLON, SELF%NLAT, 10)) +END IF +! Assuming dimensions have been set for lat and lon +IF (.NOT. ALLOCATED(SELF%SPECIES4D)) THEN + ALLOCATE(SELF%SPECIES4D(SELF%NLON, SELF%NLAT, SELF%NMONTH, 2)) +END IF +! Populate the 3D array with existing 2D data +SELF%SPECIES3D(:,:, idx_SOILPH1) = SELF%SOILPH1(:,:) !1 +SELF%SPECIES3D(:,:, idx_SOILPH2) = SELF%SOILPH2(:,:) !2 +SELF%SPECIES3D(:,:, idx_SOILPH3) = SELF%SOILPH3(:,:) !3 +SELF%SPECIES3D(:,:, idx_SOILPH4) = SELF%SOILPH4(:,:) !4 +SELF%SPECIES3D(:,:, idx_SOILPH5) = SELF%SOILPH5(:,:) !5 +SELF%SPECIES3D(:,:, idx_Z0AM) = SELF%Z0AM(:,:) !6 +SELF%SPECIES3D(:,:, idx_POTSRC) = SELF%POTSRC(:,:) !7 +SELF%SPECIES3D(:,:, idx_SOILTYPE)= SELF%SOILTYPE(:,:)!8 +SELF%SPECIES3D(:,:, idx_AREA)= SELF%AREA(:,:) !9 +SELF%SPECIES3D(:,:, idx_CULT)= SELF%CULT(:,:) !10 +SELF%IS_GROUPED = .TRUE. +SELF%N2D=SIZE(SELF%SPECIES3D,3) +SELF%SPECIES4D(:,:,:,idx_FPAR) = SELF%FPAR(:,:,:) +SELF%SPECIES4D(:,:,:,idx_Z0M) = SELF%Z0M(:,:,:) +SELF%N4D=SIZE(SELF%SPECIES4D,4) +END SUBROUTINE GET_2DSPECIES + +SUBROUTINE SU_DUST_FIELDS(SELF_DUST) +!----------------------------------------------------------------------- +USE PARKIND1 , ONLY : JPIM, JPRB +USE EASY_NETCDF_READ_MPI,ONLY : NETCDF_FILE +USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN , ONLY : NULERR +USE YOMLUN , ONLY : NULOUT +USE YOMCST , ONLY : RPI + +IMPLICIT NONE + +! ARGUMENTS +TYPE(TEAERC_DUST), INTENT(INOUT) :: SELF_DUST +! Expected dimension lengths for month, latitude and longitude +INTEGER(KIND=JPIM), PARAMETER :: IMONTH = 12 +INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180 !61 +INTEGER(KIND=JPIM), PARAMETER :: ILON = 360 !120 +! Full and base names of the aerosol climatology file +CHARACTER(len=:),ALLOCATABLE :: CL_FILE_NAME, CL_AER_CLIM_FILE +!Temporary file containing the input of fields +! "DATA" directory +CHARACTER(LEN=512) :: CLDIRECTORY +! The NetCDF file containing the input climatology +TYPE(NETCDF_FILE) :: FILE +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!LOCAL TEMPORAL ARRAY +REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: RSOILTYPE +!REAL(KIND=JPRB), ALLOCATABLE, DIMENSION(:,:) :: RZ0AM, RSOILPH3, RSOILPH4, RSOILPH5 + +#include "abor1.intfb.h" +! ------------------------------------------------------------------ + +IF (LHOOK) CALL DR_HOOK('YOEDUST:SU_DUST_CLIMATOLOGY',0,ZHOOK_HANDLE) + + CL_AER_CLIM_FILE = "onlinedust_v4_rmp.nc" + CALL GET_ENVIRONMENT_VARIABLE("DATA",CLDIRECTORY) + IF(CLDIRECTORY /= " ") THEN + CL_FILE_NAME = TRIM(CLDIRECTORY) // "/composition/" // CL_AER_CLIM_FILE + ELSE + CL_FILE_NAME = CL_AER_CLIM_FILE + ENDIF + CALL FILE%OPEN(TRIM(CL_FILE_NAME), IVERBOSE=4) + CALL FILE%GET('lat', SELF_DUST%LATD) + CALL FILE%GET('lon', SELF_DUST%LOND) + CALL FILE%GET('cult', SELF_DUST%CULT) + CALL FILE%GET('lai_max', SELF_DUST%LAI_MAX) + CALL FILE%GET('lai_avg', SELF_DUST%LAI_AVG) + + CALL FILE%GET('fpar', SELF_DUST%FPAR) + IF ( SIZE(SELF_DUST%FPAR,1) /= ILON .OR. & + & SIZE(SELF_DUST%FPAR,2) /= ILAT .OR. & + & SIZE(SELF_DUST%FPAR,3) /= IMONTH) THEN + WRITE(NULERR,*) 'Aerosols in', CL_FILE_NAME, 'must be dimensioned (', & + & ILON, ",", ILAT, ",", IMONTH, ")" + CALL ABOR1("Error reading aerosol climatology NetCDF file") + ENDIF + CALL FILE%GET('potsrc', SELF_DUST%POTSRC) + !CALL FILE%GET('soiltype', RSOILTYPE) + !SELF_DUST%SOILTYPE = RSOILTYPE + CALL FILE%GET('soiltype',SELF_DUST%SOILTYPE) + CALL FILE%GET('soilph1', SELF_DUST%SOILPH1) + CALL FILE%GET('soilph2', SELF_DUST%SOILPH2) + CALL FILE%GET('soilph3', SELF_DUST%SOILPH3) + CALL FILE%GET('soilph4', SELF_DUST%SOILPH4) + CALL FILE%GET('soilph5', SELF_DUST%SOILPH5) + CALL FILE%GET('z0am', SELF_DUST%Z0AM) + CALL FILE%GET('area', SELF_DUST%AREA) + CALL FILE%GET('z0m', SELF_DUST%Z0M) + + SELF_DUST%NLAT = SIZE(SELF_DUST%LATD) + SELF_DUST%LAT1 = SELF_DUST%LATD(1) * RPI / 180.0_JPRB !rads + SELF_DUST%DLAT = (SELF_DUST%LATD(2)-SELF_DUST%LATD(1)) * RPI / 180.0_JPRB ! delta in rads + + IF (SELF_DUST%LOND(1) < 0) THEN + WRITE(NULERR,*) "THE LON SHOULD BE 0- 360 THE CURRENT FILE LON ARE -180 to 180" + ! SELF_DUST%LOND = MOD(SELF_DUST%LOND(:) +180.0,360.0) + ELSE + SELF_DUST%LOND = SELF_DUST%LOND + ENDIF + SELF_DUST%NLON = SIZE(SELF_DUST%LOND) + SELF_DUST%LON1 = SELF_DUST%LOND(1) * RPI / 180.0_JPRB !rad + SELF_DUST%DLON = (SELF_DUST%LOND(2)-SELF_DUST%LOND(1)) * RPI / 180.0_JPRB !delta in rads + + ! Check dimensions + IF ( SIZE(SELF_DUST%Z0M,1) /= SELF_DUST%NLON .OR. & + & SIZE(SELF_DUST%Z0M,2) /= SELF_DUST%NLAT .OR. & + & SIZE(SELF_DUST%Z0M,3) /= IMONTH) THEN + WRITE(NULERR,*) 'Aerosols in', CL_FILE_NAME, 'must be dimensioned LON,LAT,MONTH (', & + & ILON, ",", ILAT, ",", IMONTH, ")" + CALL ABOR1("Error reading aerosol climatology NetCDF file") + ENDIF + SELF_DUST%NMONTH= SIZE(SELF_DUST%Z0M,3) + + CALL FILE%CLOSE() + +IF (LHOOK) CALL DR_HOOK('YOEDUST:SU_AER_CLIMATOLOGY',1,ZHOOK_HANDLE) + +END SUBROUTINE SU_DUST_FIELDS + +SUBROUTINE SU_DUST_FIELDS_INTERP(SELF, KSTART, KEND, KCOL, PLAT, PLON, & + ISOILPH1, ISOILPH2, ISOILPH3, ISOILPH4, ISOILPH5, & + IZ0AM, IPOTSRC, ISOILTYPE, IAREA, ICULT, IZ0M, IFPAR, IM0,ILAI_MAX,ILAI_AVG ) + + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + IMPLICIT NONE + CLASS(TEAERC_DUST), INTENT(INOUT) :: SELF + INTEGER(KIND=JPIM), INTENT(IN) :: KCOL + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND + INTEGER(KIND=JPIM), INTENT(IN) :: IM0 + ! Sine of latitude of input columns + !REAL(KIND=JPRB) :: PSINLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KCOL) !rads = PGELAT + REAL(KIND=JPRB), INTENT(IN) :: PLON(KCOL) !rads = PGELAM + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPRB), INTENT(OUT) :: & + ISOILPH1(KCOL), ISOILPH2(KCOL), ISOILPH3(KCOL), ISOILPH4(KCOL), ISOILPH5(KCOL), & + IZ0AM(KCOL), IPOTSRC(KCOL), IAREA(KCOL), ICULT(KCOL)!, ISOILTYPE(KCOL) + REAL(KIND=JPRB), INTENT(OUT) :: ILAI_MAX(KCOL), ILAI_AVG(KCOL) + REAL(KIND=JPRB), INTENT(OUT) :: IZ0M(KCOL), IFPAR(KCOL) + REAL(KIND=JPRB), INTENT(OUT) :: ISOILTYPE(KSTART:KEND) + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION main call',0,ZHOOK_HANDLE) + + CALL INTP_SOILT(SELF,SELF%SOILTYPE, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILTYPE) + !NOT-USED-NOR-ALLOCATED SELF%TSOILTYPE(:) = ISOILTYPE(:) + + CALL INTP_SOILT(SELF, SELF%AREA, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IAREA) + !NOT-USED-NOR-ALLOCATED SELF%TAREA(:) = IAREA(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH1, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH1) + !NOT-USED-NOR-ALLOCATED SELF%TSOILPH1(:) = ISOILPH1(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH2, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH2) + !NOT-USED-NOR-ALLOCATED SELF%TSOILPH2(:) = ISOILPH2(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH3, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH3) + !NOT-USED-NOR-ALLOCATED SELF%TSOILPH3(:) = ISOILPH3(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH4, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH4) + !NOT-USED-NOR-ALLOCATED SELF%TSOILPH4(:) = ISOILPH4(:) + + CALL INTP_SOILT(SELF, SELF%SOILPH5, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ISOILPH5) + !NOT-USED-NOR-ALLOCATED SELF%TSOILPH5(:) = ISOILPH5(:) + + CALL INTP_SOILT(SELF, SELF%Z0AM, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IZ0AM) + !NOT-USED-NOR-ALLOCATED SELF%TZ0AM(:) = IZ0AM(:) + + CALL INTP_SOILT(SELF, SELF%POTSRC, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IPOTSRC) + !NOT-USED-NOR-ALLOCATED SELF%TPOTSRC(:) = IPOTSRC(:) + + CALL INTP_SOILT(SELF, SELF%CULT, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ICULT) + !NOT-USED-NOR-ALLOCATED SELF%TCULT(:) = ICULT(:) + + CALL INTP_SOILT(SELF, SELF%LAI_MAX, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ILAI_MAX) + !NOT-USED-NOR-ALLOCATED SELF%TLAI_MAX(:) = ILAI_MAX(:) + + CALL INTP_SOILT(SELF, SELF%LAI_AVG, KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), ILAI_AVG) + !NOT-USED-NOR-ALLOCATED SELF%TLAI_AVG(:) = ILAI_AVG(:) + + CALL INTP_SOILT(SELF, SELF%FPAR(:,:,IM0), KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IFPAR) + !NOT-USED-NOR-ALLOCATED SELF%TFPAR(:) = IFPAR(:) + + CALL INTP_SOILT(SELF, SELF%Z0M(:,:,IM0), KSTART, KEND, KCOL, PLAT(KSTART:KEND), PLON(KSTART:KEND), IZ0M) + !NOT-USED-NOR-ALLOCATED SELF%TZ0M(:) = IZ0M(:) + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS main call',1,ZHOOK_HANDLE) + +CONTAINS + +SUBROUTINE CALC_INTERP_DUST(SELF, FIELD2D, KSTART, KEND, KCOL, PLAT, PLON, INTEROUT) + + USE YOMLUN , ONLY : NULERR + USE YOMLUN , ONLY : NULOUT + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + !USE, INTRINSIC :: IEEE_ARITHMETIC + LOGICAL :: LPROBLEM + REAL(KIND=JPRB) :: BIG_VAL = HUGE(1.0_JPRB), SMALL_VAL = TINY(1.0_JPRB) + CLASS(TEAERC_DUST), INTENT(INOUT):: SELF + + REAL(KIND=JPRB), INTENT(IN) :: FIELD2D(:,:) + INTEGER(KIND=JPIM), INTENT(IN) :: KCOL + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND + REAL(KIND=JPRB), INTENT(OUT) :: INTEROUT(KSTART:KEND) + ! Sine of latitude of input columns + REAL(KIND=JPRB) :: PSINLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLON(KSTART:KEND) + INTEGER(KIND=JPIM), DIMENSION(KSTART:KEND) :: KLAT1, KLAT2, KLON1, KLON2 + REAL(KIND=JPRB) , DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT + INTEGER(KIND=JPIM) :: JL, JS, N2, N4, NM, JM, JA + REAL(KIND=JPRB) :: ZLAT(KSTART:KEND) + REAL(KIND=JPRB) :: ZAERA, ZAERB + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: ZAER2D + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPHOOK) :: DENOM + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 2D',0,ZHOOK_HANDLE) + + PLONWEIGHT = 0.0 + ! Longitude interpolation points and weights + PLONWEIGHT = 1.0_JPRB + (PLON - SELF%LON1) / SELF%DLON + KLON1 = MAX(1, MIN(INT(PLONWEIGHT), SELF%NLON)) + KLON2 = MOD(KLON1,SELF%NLON)+1 ! Correct treatment of dateline + PLONWEIGHT = PLONWEIGHT - KLON1 + !ZLAT = ASIN(PSINLAT) + PSINLAT=SIN(PLAT) ! SIN of rads + ZLAT = PLAT !RADS + + PLATWEIGHT = 0.0 + PLATWEIGHT = 1.0_JPRB + (ZLAT - SELF%LAT1) / SELF%DLAT + KLAT1 = MAX(0, MIN(INT(PLATWEIGHT), SELF%NLAT-1)) + KLAT2 = KLAT1+1 + ! Interpolation in sin(latitude) + DO JL = KSTART, KEND + DENOM = SIN(SELF%LAT1+(KLAT2(JL)-1)*SELF%DLAT) - SIN(SELF%LAT1+(KLAT1(JL)-1)*SELF%DLAT) + PLATWEIGHT(JL) = (PSINLAT(JL) - SIN(SELF%LAT1 + (KLAT1(JL)-1)*SELF%DLAT)) / DENOM + END DO + !PLATWEIGHT = (PSINLAT - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) & + ! & / (SIN(SELF%LAT1+(KLAT2-1)*SELF%DLAT) - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) + ZAERA =0.0_JPRB + ZAERB = 0.0_JPRB + INTEROUT(KSTART:KEND) = 0.0_JPRB + ! Interpolation loop + DO JL = KSTART, KEND + ZAERA = FIELD2D(KLON1(JL), KLAT1(JL)) + & + PLATWEIGHT(JL) * (FIELD2D(KLON1(JL), KLAT2(JL)) - FIELD2D(KLON1(JL), KLAT1(JL))) + ZAERB = FIELD2D(KLON2(JL), KLAT1(JL)) + & + PLATWEIGHT(JL) * (FIELD2D(KLON2(JL), KLAT2(JL)) - FIELD2D(KLON2(JL), KLAT1(JL))) + INTEROUT(JL) = ZAERA + PLONWEIGHT(JL) * (ZAERB - ZAERA) + END DO + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 2D',1,ZHOOK_HANDLE) +END SUBROUTINE CALC_INTERP_DUST + +!for simplicity this routine do NOT be USED. +! +SUBROUTINE CALC_3DINTERP_DUST(SELF, FIELD3D, KSTART, KEND, KCOL, PLAT, PLON, INTEROUT) + USE YOMLUN, ONLY : NULOUT + USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK + IMPLICIT NONE + + CLASS(TEAERC_DUST), INTENT(INOUT) :: SELF + REAL(KIND=JPRB), INTENT(IN) :: FIELD3D(:,:,:) + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND, KCOL + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KSTART:KEND), PLON(KSTART:KEND) + REAL(KIND=JPRB), INTENT(OUT) :: INTEROUT(KSTART:KEND,SELF%NMONTH) + INTEGER(KIND=JPIM), PARAMETER :: ILAT = 180, ILON = 360, IMONTH = 12 + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + INTEGER(KIND=JPIM) :: JL, JM + INTEGER(KIND=JPIM), DIMENSION(KSTART:KEND) :: KLAT1, KLAT2, KLON1, KLON2 + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT + REAL(KIND=JPRB), DIMENSION(KSTART:KEND):: PSINLAT, ZLAT + REAL(KIND=JPRB) :: ZAERA, ZAERB + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 3D',0,ZHOOK_HANDLE) + ! Precompute sine of latitude and indices + PSINLAT = SIN(PLAT) + ZLAT = PLAT + + PLONWEIGHT = 1.0_JPRB + (PLON - SELF%LON1) / SELF%DLON + KLON1 = MAX(1, MIN(INT(PLONWEIGHT), SELF%NLON)) + KLON2 = MOD(KLON1, SELF%NLON) + 1 + PLONWEIGHT = PLONWEIGHT - KLON1 + + PLATWEIGHT = 1.0_JPRB + (ZLAT - SELF%LAT1) / SELF%DLAT + KLAT1 = MAX(1, MIN(INT(PLATWEIGHT), SELF%NLAT - 1)) + KLAT2 = KLAT1 + 1 + PLATWEIGHT = (PSINLAT - SIN(SELF%LAT1 + (KLAT1 - 1)*SELF%DLAT)) / & + (SIN(SELF%LAT1 + (KLAT2 - 1)*SELF%DLAT) - SIN(SELF%LAT1 + (KLAT1 - 1)*SELF%DLAT)) + + ! --- Interpolate for each column across all months and average --- + IF ( SIZE(FIELD3D,1) == ILON .OR. & + & SIZE(FIELD3D,2) == ILAT .OR. & + & SIZE(FIELD3D,3) == IMONTH) THEN + WRITE(NULOUT,*) '3D FIELDS INTERPOLATION ...' + ELSE + WRITE(NULOUT,*) '3D FIELDS INTERPOLATION was not 3d ...', FIELD3D(195,116,6) + WRITE(NULOUT,*) '3D FIELDS LON:',SIZE(FIELD3D,1),'LAT:', SIZE(FIELD3D,2), 'MONTH:', SIZE(FIELD3D,3) + END IF + DO JM =1,SELF%NMONTH !loop months + DO JL = KSTART,KEND !loop model colum + ! Bilinear interpolation in lon/lat month for each species3d + ZAERA = FIELD3D(KLON1(JL), KLAT1(JL), JM) & + & + PLATWEIGHT(JL) * (FIELD3D(KLON1(JL), KLAT2(JL), JM) & + & - FIELD3D(KLON1(JL), KLAT1(JL), JM)) + ZAERB = FIELD3D(KLON2(JL), KLAT1(JL), JM) & + & + PLATWEIGHT(JL) * (FIELD3D(KLON2(JL), KLAT2(JL), JM) & + & - FIELD3D(KLON2(JL), KLAT1(JL), JM)) + INTEROUT(JL,JM) = ZAERA + PLONWEIGHT(JL) * (ZAERB - ZAERA) + END DO + END DO + + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS 3D',1,ZHOOK_HANDLE) +END SUBROUTINE CALC_3DINTERP_DUST + +SUBROUTINE INTP_SOILT(SELF,FIELD2D, KSTART, KEND,KCOL, PLAT, PLON, INTERSOILT) + + USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK + USE YOMLUN , ONLY : NULOUT + REAL(KIND=JPRB), INTENT(IN) :: FIELD2D(:,:) + INTEGER(KIND=JPIM), INTENT(IN) :: KCOL + CLASS(TEAERC_DUST), INTENT(IN) :: SELF + INTEGER(KIND=JPIM), INTENT(IN) :: KSTART, KEND + REAL(KIND=JPRB) :: PSINLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLAT(KSTART:KEND) + REAL(KIND=JPRB), INTENT(IN) :: PLON(KSTART:KEND) + !REAL(KIND=JPRM), INTENT(OUT), DIMENSION(KCOL) :: INTERSOILT + !INTEGER(KIND=JPIM), INTENT(OUT) :: INTERSOILT (KSTART:KEND) + REAL(KIND=JPRB), INTENT(OUT) :: INTERSOILT (KSTART:KEND) + + INTEGER(KIND=JPIM), DIMENSION(KSTART:KEND) :: KLAT1, KLAT2, KLON1, KLON2 + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: PLATWEIGHT, PLONWEIGHT + INTEGER(KIND=JPIM) :: JL, JS, N2, N4, NM, JM, JA + REAL(KIND=JPRB) :: ZLAT(KSTART:KEND) + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + REAL(KIND=JPRB) :: ZAERA, ZAERB + REAL(KIND=JPRB), DIMENSION(KSTART:KEND) :: ZAER2D + !C. Perez + INTEGER(KIND=JPIM) :: I_INX, J_INX + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS SOILTYPE',0,ZHOOK_HANDLE) + + PLATWEIGHT = 0.0 + PLONWEIGHT = 0.0 + ! Longitude interpolation points and weights + PLONWEIGHT = 1.0_JPRB + (PLON - SELF%LON1) / SELF%DLON + KLON1 = MAX(1, MIN(INT(PLONWEIGHT), SELF%NLON)) + KLON2 = MOD(KLON1,SELF%NLON)+1 ! Correct treatment of dateline + PLONWEIGHT = PLONWEIGHT - KLON1 + + !ZLAT = ASIN(PSINLAT) + PSINLAT=SIN(PLAT) ! SIN of rads + ZLAT = PLAT !RADS + PLATWEIGHT = 1.0_JPRB + (ZLAT - SELF%LAT1) / SELF%DLAT +! KLAT1 = MAX(0, MIN(INT(PLATWEIGHT), SELF%NLAT-1)) !C. Perez: Why 0? Does the latitude indexing start in 0? + KLAT1 = MAX(1, MIN(INT(PLATWEIGHT), SELF%NLAT-1)) + KLAT2 = KLAT1+1 + + ! Interpolation in sin(latitude) + PLATWEIGHT = (PSINLAT - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) & + & / (SIN(SELF%LAT1+(KLAT2-1)*SELF%DLAT) - SIN(SELF%LAT1+(KLAT1-1)*SELF%DLAT)) + + DO JL = KSTART,KEND + !C.Perez + !choose the closer longitude corner + IF (PLONWEIGHT(JL) > 0.5_JPRB) THEN + I_INX = KLON2(JL) + ELSE + I_INX = KLON1(JL) + END IF + !choose the closer latitude corner + IF (PLATWEIGHT(JL) > 0.5_JPRB) THEN + J_INX = KLAT2(JL) + ELSE + J_INX = KLAT1(JL) + END IF + + INTERSOILT(JL) = FIELD2D(I_INX, J_INX) + !C. Perez + END DO + IF (LHOOK) CALL DR_HOOK('YOEDUST:INTERPOLATION FIELDS SOILTYPE',1,ZHOOK_HANDLE) +END SUBROUTINE INTP_SOILT + +END SUBROUTINE SU_DUST_FIELDS_INTERP + +END MODULE YOEDUST diff --git a/ifs-source/arpifs/module/yoerad.F90 b/ifs-source/arpifs/module/yoerad.F90 index 9e222565..599615b3 100644 --- a/ifs-source/arpifs/module/yoerad.F90 +++ b/ifs-source/arpifs/module/yoerad.F90 @@ -141,6 +141,14 @@ MODULE YOERAD ! Look-up table for Planck function in emissivity intervals TYPE(TSPECTRALPLANCK) :: YSPECTPLANCK + +!CMIP6/7 Stratospheric aerosols +CHARACTER(LEN=500) :: CCMIP_STRAT_FULL, CCMIP_STRAT_FULL_CLIM +LOGICAL :: LSTRATAERO_UPDATED, LCMIP_STRATAER_CMIP6, LCMIP_STRATAER_CMIP7, LCMIP_STRATAER_BCKGD + +INTEGER :: NCLOUDACT +INTEGER :: NAEROOPT + !---------------------------------------------------------------------------- CONTAINS PROCEDURE, PASS :: PRINT => PRINT_CONFIGURATION @@ -416,7 +424,15 @@ MODULE YOERAD ! LDUSEASON : LOGICAL enables a monthly-varying scale height for the ! dust aerosol climatology ! LAER3D : LOGICAL : to enable aerosol climatology in 3D - +! +! ----[ AERO_SCHEME HAMM7 ]--------------------------------------------------- +! NAEROOPT : INTEGER : M7 aerosols optical properties calculation method +! 0: not calculated +! 1: TM5 code for SW, not calculated for LW +! 2: HAM code for both SW and LW +! NCLOUDACT : INTEGER : Computation of effective radii (liq & ice) +! 0: IFS default parametrization +! > 0: use Abdul-Razzak & Ghan activation scheme from HAMM7 CONTAINS @@ -480,6 +496,8 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NREDGLW = ', SELF%NREDGLW WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NREDGSW = ', SELF%NREDGSW WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAERMACC = ', SELF%NAERMACC +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NAEROOPT (M7) = ', SELF%NAEROOPT +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLOUDACT (M7) = ', SELF%NCLOUDACT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NMCLAT = ', SELF%NMCLAT WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NMCLON = ', SELF%NMCLON WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NMCLEV = ', SELF%NMCLEV diff --git a/ifs-source/arpifs/module/yom_grib_codes.F90 b/ifs-source/arpifs/module/yom_grib_codes.F90 index e4c12ec6..03d849eb 100644 --- a/ifs-source/arpifs/module/yom_grib_codes.F90 +++ b/ifs-source/arpifs/module/yom_grib_codes.F90 @@ -905,6 +905,8 @@ MODULE YOM_GRIB_CODES INTEGER(KIND=JPIM), PARAMETER :: NGRBAERLTS =210053 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSCC =210054 +INTEGER(KIND=JPIM), PARAMETER :: NGRBSOILTYPE =210055 + INTEGER(KIND=JPIM), PARAMETER :: NGRBAEPM1 =210072 INTEGER(KIND=JPIM), PARAMETER :: NGRBAEPM25 =210073 INTEGER(KIND=JPIM), PARAMETER :: NGRBAEPM10 =210074 @@ -944,8 +946,8 @@ MODULE YOM_GRIB_CODES INTEGER(KIND=JPIM), PARAMETER :: NGRBAERSO2DD =216006 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERFCA1 =216043 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERFCA2 =216044 -INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSF =216046 -INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSZ =216048 +INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSF =216046 +INTEGER(KIND=JPIM), PARAMETER :: NGRBAERDSZ =216048 INTEGER(KIND=JPIM), PARAMETER :: NGRBAERURBF =216122 !--------------------------------------------------- diff --git a/ifs-source/arpifs/module/yom_ygfl.F90 b/ifs-source/arpifs/module/yom_ygfl.F90 index 02370c2a..9d6bd585 100644 --- a/ifs-source/arpifs/module/yom_ygfl.F90 +++ b/ifs-source/arpifs/module/yom_ygfl.F90 @@ -11,18 +11,33 @@ MODULE YOM_YGFL -USE PARKIND1 , ONLY : JPIM, JPRB +USE PARKIND1 , ONLY : JPIM, JPRB USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, NPAERLISI, & - & TYPE_AERO_WVL_DIAG, NPAERO_WVL_DIAG + & TYPE_AERO_WVL_DIAG, NPAERO_WVL_DIAG USE PAR_GFL IMPLICIT NONE SAVE -!------------------------------------------------------------------------- -! Contains the descriptors of GFL arrays -!------------------------------------------------------------------------- +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE YOM_YGLF (updated 15-MAY-2024) │ +! │ │ +! │ *Contains the descriptors of GFL arrays* (derived types) │ +! │ │ +! │ TYPES: │ +! │ - TYPE_GFL_COMP -> individual field descriptor │ +! │ - TYPE_GFL_NAML -> individual field descriptor for namelist input │ +! │ - TYPE_GFLD -> derived types for describing the GFL structure. │ +! │ │ +! │ │ +! │ Author : ECMWF(?) │ +! │ ------- │ +! │ │ +! │ Modifications : (included before each type) │ +! │ ------------- │ +! │ │ +! ╘════════════════════════════════════════════════════════════════════════════╛ TYPE TYPE_GFL_COMP ! Individual field descriptor @@ -181,28 +196,36 @@ MODULE YOM_YGFL END TYPE TYPE_GFL_NAML -!------------------------------------------------------------------------- -! Derived types for describing the GFL structure. -!------------------------------------------------------------------------- -! Modifications: -! 03/07/09 C. Fischer - add Arome/Aladin attributes -! 03/10/01 C. Moussy - add Arome/Aladin attributes coupling -! 03/10/31 M. Tudor - add physics tendencies for predictor-corrector -! 05/10/10 J. Haseler - switch for I/O to trajectory structure -! 2004-Nov F. Vana - update of CSLINT attribute -! 20-Feb-2005 Vivoda - 3TL Eul PC scheme (GFLPC) -! 07/06/27 E. Holm - TL/AD advection without wind increments LADV5 -! 12/04/08 J. Flemming - GFL attribute extention for GEMS -! 22-Feb-11 F. Vana - LTDIABLIN and LHORTURB -! spring 2011 ECMWF - LINTLIN -! Nov. 2013 - LCOMAD -! 2013-11, D. Degrauwe - INTFLEX attributes -! 06-Feb-2015 F. Vana & M. Kharoutdinov - super-parametrization fields. -! 02-Feb-2017 S.-J. Lock - LSPPTGFL, switch for SPPT perturbations to chemistry/aerosol tendencies -! 2017-11-11 M Ahlgrimm - add cloud heterogeneity FSD -! 14-Feb-2019 P Bechtold- add turbulence diagnostics EDR Parameter -! 20-Feb-2019 F. Vana - WENO quintic interpolation -! 11-Sep-2020 F. Vana - SLAVEPP in TL/AD +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ TYPE : TYPE_GFLD (updated 15-May-2024) │ +! │ │ +! │ Derived types for describing the GFL structure. │ +! │ │ +! │ Modifications : │ +! │ --------------- │ +! │ 03/07/09 C. Fischer - add Arome/Aladin attributes │ +! │ 03/10/01 C. Moussy - add Arome/Aladin attributes coupling │ +! │ 03/10/31 M. Tudor - add physics tendencies for predictor-corrector│ +! │ 05/10/10 J. Haseler - switch for I/O to trajectory structure │ +! │ 2004-Nov F. Vana - update of CSLINT attribute │ +! │ 20-Feb-2005 Vivoda - 3TL Eul PC scheme (GFLPC) │ +! │ 07/06/27 E. Holm - TL/AD advection without wind increments LADV5 │ +! │ 12/04/08 J. Flemming - GFL attribute extention for GEMS │ +! │ 22-Feb-11 F. Vana - LTDIABLIN and LHORTURB │ +! │ spring 2011 ECMWF - LINTLIN │ +! │ Nov. 2013 - LCOMAD │ +! │ 2013-11, D. Degrauwe - INTFLEX attributes │ +! │ 06-Feb-2015 F. Vana - super-parametrization fields. │ +! │ & M. Kharoutdinov │ +! │ 02-Feb-2017 S.-J. Lock - LSPPTGFL, switch for SPPT perturbations to │ +! │ chemistry/aerosol tendencies │ +! │ 2017-11-11 M Ahlgrimm - add cloud heterogeneity FSD │ +! │ 14-Feb-2019 P Bechtold - add turbulence diagnostics EDR Parameter │ +! │ 20-Feb-2019 F. Vana - WENO quintic interpolation │ +! │ 11-Sep-2020 F. Vana - SLAVEPP in TL/AD │ +! │ 01-Apr-2024 Wu Lianghai - NCHEM_FLX (for hamm7 ?) │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ TYPE TYPE_GFLD @@ -262,19 +285,20 @@ MODULE YOM_YGFL LOGICAL :: LUVPOUT = .FALSE. LOGICAL :: LSPPTGFL = .FALSE. ! Activates SPPT perturbations to CHEM tendencies (C-IFS ensemble) -INTEGER(KIND=JPIM) :: NGEMS ! The total number of "GEMS" fields. +INTEGER(KIND=JPIM) :: NGEMS ! The total number of "GEMS" fields. INTEGER(KIND=JPIM) :: NCHEM INTEGER(KIND=JPIM) :: NCHEM_ASSIM INTEGER(KIND=JPIM) :: NCHEM_FLXO INTEGER(KIND=JPIM) :: NCHEM_WDFLX INTEGER(KIND=JPIM) :: NCHEM_DDFLX +INTEGER(KIND=JPIM) :: NCHEM_FLX ! [FIXME we need to define here what this is (not used? from 43r3??] INTEGER(KIND=JPIM) :: NCHEM_DV INTEGER(KIND=JPIM) :: NCHEM_TC INTEGER(KIND=JPIM) :: NCHEM_SCV -INTEGER(KIND=JPIM) :: NEMIS2D ! Number of 2D emission fields for composition -INTEGER(KIND=JPIM) :: NEMIS2DAUX ! Number of 2D emission auxiliary fields for composition -INTEGER(KIND=JPIM) :: NEMIS3D ! Number of 3D emission fields for composition -INTEGER(KIND=JPIM) :: NLIMA ! Total number of LIMA fields +INTEGER(KIND=JPIM) :: NEMIS2D ! Number of 2D emission fields for composition +INTEGER(KIND=JPIM) :: NEMIS2DAUX ! Number of 2D emission auxiliary fields for composition +INTEGER(KIND=JPIM) :: NEMIS3D ! Number of 3D emission fields for composition +INTEGER(KIND=JPIM) :: NLIMA ! Total number of LIMA fields INTEGER(KIND=JPIM) :: NAERO_WVL_DIAG INTEGER(KIND=JPIM) :: NAERO_WVL_DIAG_TYPES @@ -351,6 +375,8 @@ MODULE YOM_YGFL TYPE(TYPE_GFL_COMP),POINTER :: YGHG(:) => NULL() ! Greenhouse Gases TYPE(TYPE_GFL_COMP),POINTER :: YCHEM(:) => NULL() ! Chemistry TYPE(TYPE_GFL_COMP),POINTER :: YAERO(:) => NULL() ! Aerosols + + TYPE(TYPE_GFL_COMP),POINTER :: YLRCH4 => NULL() ! CH4 loss rate (instantaneous field) TYPE(TYPE_GFL_COMP),POINTER :: YEMIS3D(:) => NULL() ! 3D emissions for atmospheric composition TYPE(TYPE_GFL_COMP),POINTER :: YFORC(:) => NULL() ! large scale forcing @@ -387,6 +413,13 @@ MODULE YOM_YGFL TYPE(TYPE_GFL_COMP),POINTER :: YLIMA(:) => NULL() ! LIMA prognostic fields + +! water and ice cloud variables when using online aerosols +TYPE(TYPE_GFL_COMP),POINTER :: YCDNC ! Cloud droplet number concentration +TYPE(TYPE_GFL_COMP),POINTER :: YICNC ! Ice crystal number concentration +TYPE(TYPE_GFL_COMP),POINTER :: YRE_LIQ ! Effective radius of liquid water droplets +TYPE(TYPE_GFL_COMP),POINTER :: YRE_ICE ! Effective radius of ice crystals + ! cloud heterogeneity FSD TYPE(TYPE_GFL_COMP),POINTER :: YFSD => NULL() ! PHYS output @@ -467,6 +500,12 @@ MODULE YOM_YGFL TYPE(TYPE_AERO_WVL_DIAG) :: YAERO_WVL_DIAG_NL(NPAERO_WVL_DIAG) ! Per-wavelength aerosol optical diagnostics TYPE(TYPE_GFL_NAML) :: YLIMA_NL(JPLIMA) ! LIMA prognostic fields +! water and ice cloud variables when using online aerosols +TYPE(TYPE_GFL_NAML) :: YCDNC_NL ! Cloud droplet number concentration +TYPE(TYPE_GFL_NAML) :: YICNC_NL ! Ice crystal number concentration +TYPE(TYPE_GFL_NAML) :: YRE_LIQ_NL ! Effective radius of liquid water droplets +TYPE(TYPE_GFL_NAML) :: YRE_ICE_NL ! Effective radius of ice crystals + END TYPE TYPE_GFLD ! GFL general descriptor diff --git a/ifs-source/arpifs/module/yomafn.F90 b/ifs-source/arpifs/module/yomafn.F90 index 02038d64..02034384 100644 --- a/ifs-source/arpifs/module/yomafn.F90 +++ b/ifs-source/arpifs/module/yomafn.F90 @@ -13,20 +13,26 @@ MODULE YOMAFN USE PARKIND1, ONLY : JPIM USE PARFPOS, ONLY : JPOSDYN, JPOSSCVA, JPOSPHY, JPOSVX2, JPOSFSU, & - & JPOSAERO, JPOSGHG, JPOSCHEM, JPOSERA40, JPOSNOGW, JPOSCHEMFLX, & + & JPOSAERO, JPOSTRAC, JPOSGHG, JPOSCHEM, JPOSERA40, JPOSNOGW, JPOSCHEMFLX, & & JPOSAEROUT, JPOSAEROCLIM, JPOSUVP, JPOSSFX, JPOSEZDIAG, JPOSAERODIAG, & & JPOSAERAOT, JPOSAERLISI, JPOSAERO_WVL_DIAG, JPOSAERO_WVL_DIAG_TYPES, & & JPOSEDRP, JPOSEMIS2D, JPOSEMIS2DAUX, JPOSEMIS3D USE FULLPOS_MIX, ONLY : FULLPOS_TYPE USE TYPE_FPDSPHYS, ONLY : FPDSPHY -!==================================================================================== -! Identifiers, used for example in FULL-POS. | -! Fields are divided into 5 classes: DYN3D, DYN2D, PHYSOL, CFU, XFU | -! Some redundancies may occur. | -! Identifiers are TFP_[rootfield] for DYN3D and DYN2D | -! Identifiers are GFP_[rootfield] for PHYSOL, CFU, XFU | -!==================================================================================== +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE YOMAFN (updated 16-MAY-2024) │ +! │ │ +! │ Identifiers, used for example in FULL-POS. │ +! │ Fields are divided into 5 classes: DYN3D, DYN2D, PHYSOL, CFU, XFU │ +! │ Some redundancies may occur. │ +! │ Identifiers are TFP_[rootfield] for DYN3D and DYN2D │ +! │ Identifiers are GFP_[rootfield] for PHYSOL, CFU, XFU │ +! │ │ +! │ Author : ECMWF(?) │ +! │ ------- │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ IMPLICIT NONE @@ -487,6 +493,60 @@ MODULE YOMAFN TYPE(FPDSPHY) :: EMIS2D(JPOSEMIS2D) ! 2D emission fluxes for composition TYPE(FPDSPHY) :: EMIS2DAUX(JPOSEMIS2DAUX) ! 2D emission auxiliary fields for composition +TYPE(FPDSPHY) :: SOILTYPE +!TYPE(FPDSPHY) :: BCBF +!TYPE(FPDSPHY) :: BCFF +!TYPE(FPDSPHY) :: BCGF +!TYPE(FPDSPHY) :: OMFF +!TYPE(FPDSPHY) :: OMBF +!TYPE(FPDSPHY) :: OMGF +!TYPE(FPDSPHY) :: SO2L +!TYPE(FPDSPHY) :: SO2H +!TYPE(FPDSPHY) :: SOGF +!TYPE(FPDSPHY) :: VOLC +!TYPE(FPDSPHY) :: VOLE +!TYPE(FPDSPHY) :: SOA +!TYPE(FPDSPHY) :: TRACFLX +!TYPE(FPDSPHY) :: CO2NBF +!TYPE(FPDSPHY) :: CO2OF +!TYPE(FPDSPHY) :: CO2APF +!TYPE(FPDSPHY) :: CO2FIRE +!TYPE(FPDSPHY) :: CH4AG +!TYPE(FPDSPHY) :: CH4F + +! RCHG -> Added but unclear if this is a CY48R1 feature not included before. +! TRACFLX(JPOSTRAC) as surface flux flexible tracers (ECMWF) seems to be new +! using the JPOSTRAC index. + + +TYPE(FPDSPHY) :: CO2NBF ! CO2 surface flux - biosphere +TYPE(FPDSPHY) :: CO2OF ! CO2 surface flux - ocean +TYPE(FPDSPHY) :: CO2APF ! CO2 surface flux - anthropogenic emission +TYPE(FPDSPHY) :: CO2FIRE ! CO2 surface flux - fire emissions +TYPE(FPDSPHY) :: CH4AG ! CH4 surface fluxes - all sources aggregated except fire emissions +TYPE(FPDSPHY) :: CH4F ! CH4 surface fluxes - fire emissions + +TYPE(FPDSPHY) :: BCBF ! Black carbon biogenic flux (ECMWF) +TYPE(FPDSPHY) :: INJF ! Biomass burning emissions injection height (ECMWF) +TYPE(FPDSPHY) :: BCFF ! Black carbon fossil fuel flux (ECMWF) +TYPE(FPDSPHY) :: OMBF ! Organic matter biogenic flux (ECMWF) +TYPE(FPDSPHY) :: OMFF ! Organic matter fossil fuel flux (ECMWF) +TYPE(FPDSPHY) :: SO2L ! Sulphate low-level flux (ECMWF) +TYPE(FPDSPHY) :: SO2H ! Sulphate high-level flux (ECMWF) +TYPE(FPDSPHY) :: VOLC ! Volcanic continuous flux (ECMWF) +TYPE(FPDSPHY) :: VOLE ! Volcanic explosive flux (ECMWF) +TYPE(FPDSPHY) :: SOA ! Secondary organic components flux (ECMWF) +TYPE(FPDSPHY) :: SOACO ! SOA from CO (ECMWF) +TYPE(FPDSPHY) :: BCGF ! Black carbon GFED flux (ECMWF) +TYPE(FPDSPHY) :: ODTO ! Optical depth total aerosols (ECMWF) +TYPE(FPDSPHY) :: ODTO469 ! Optical depth total aerosols @ 469 nm (ECMWF) +TYPE(FPDSPHY) :: ODTO670 ! Optical depth total aerosols @ 670 nm (ECMWF) +TYPE(FPDSPHY) :: ODTO865 ! Optical depth total aerosols @ 865 nm (ECMWF) +TYPE(FPDSPHY) :: ODTO1240 ! Optical depth total aerosols @ 1240 nm (ECMWF) +TYPE(FPDSPHY) :: OMGF ! Organic matter GFED flux (ECMWF) +TYPE(FPDSPHY) :: SOGF ! Sulphate GFED flux (ECMWF) +TYPE(FPDSPHY) :: TRACFLX(JPOSTRAC) ! surface flux flexible tracers (ECMWF) + TYPE(FPDSPHY) :: SO2DD ! SO2 dry deposition velocity (ECMWF) TYPE(FPDSPHY) :: VIWVE ! Vertical integral of eastward water vapour flux (ECMWF) TYPE(FPDSPHY) :: VIWVN ! Vertical integral of northward water vapour flux (ECMWF) diff --git a/ifs-source/arpifs/module/yomcompo.F90 b/ifs-source/arpifs/module/yomcompo.F90 index 1de46865..e5580919 100644 --- a/ifs-source/arpifs/module/yomcompo.F90 +++ b/ifs-source/arpifs/module/yomcompo.F90 @@ -32,9 +32,29 @@ MODULE YOMCOMPO IMPLICIT NONE SAVE -INTEGER(KIND=JPIM), PARAMETER :: NPEMIS2D = 500 ! sync with JPOSEMIS2D in parfpos.F90 +! ╒════════════════════════════════════════════════════════════════════════════╕ +! │ MODULE YOMCOMPO (updated 15-MAY-2024) │ +! │ │ +! │ *Types for compo & emissions. Function to read emissions namelist groups* │ +! │ │ +! │ TYPES: │ +! │ - TCOMPO_EMIS -> a single emission specific. matches NAMCOMPO_EMIS │ +! │ - TCOMPO_EMIS_AUX -> a single emission auxiliary fields specific. │ +! │ - TCOMPO -> │ +! │ │ +! │ Author : 2016-09-20 J. Flemming │ +! │ ------- │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May-2024 R.Checa-Garcia (KNMI) added to TCOMPO_EMIS the PSD at emission │ +! │ │ +! │ │ +! ╘════════════════════════════════════════════════════════════════════════════╛ + +INTEGER(KIND=JPIM), PARAMETER :: NPEMIS2D = 500 ! sync with JPOSEMIS2D in parfpos.F90 INTEGER(KIND=JPIM), PARAMETER :: NPEMIS2DAUX = 10 ! sync with JPOSEMIS2DAUX in parfpos.F90 -INTEGER(KIND=JPIM), PARAMETER :: NPEMIS3D = 10 ! sync with JPOSEMIS3D in parfpos.F90 +INTEGER(KIND=JPIM), PARAMETER :: NPEMIS3D = 10 ! sync with JPOSEMIS3D in parfpos.F90 ! Type for a single emission specification ! Matches NAMCOMPO_EMIS namelist @@ -66,6 +86,15 @@ MODULE YOMCOMPO ! 16=use-for-fire-inj; 32=use-for-volc-alti LOGICAL :: NON_SIMPLE_TRACER = .FALSE. ! Set if this is a non-simple-tracer species ! (e.g. a GLOMAP component represented by multiple tracers) + ! PROPERTIES of PSD at EMISSION: RADIUS, SIGMA and MASS-DENSITY tracer + ! used to convert mass-flux into number-particles-flux + ! for M7 backwards consistency PSD_SIGMA, PSD_RADIUS and MASS_DENSITY + ! should those defined for each mode. + REAL(KIND=JPRB) :: PSD_SIGMA = 2.0_JPRB + REAL(KIND=JPRB) :: PSD_RADIUS = 1.0_JPRB + REAL(KIND=JPRB) :: MASS_DENSITY = 1000.0_JPRB + CHARACTER(LEN=16) :: PSD_N0_TRACER = 'NONE' + END TYPE TCOMPO_EMIS ! Type for a single emission auxiliary fields specification @@ -75,46 +104,38 @@ MODULE YOMCOMPO CHARACTER(LEN=16) :: CNAME = '' END TYPE TCOMPO_EMIS_AUX + +! Type for .... TYPE :: TCOMPO -! mass diagnostics switch for global budget - LOGICAL :: LCHEM_DIA -! period (in hours) on which to output budget - REAL(KIND=JPRB) :: RCHEM_DIA_PERIOD -! output of photolysis rates in extra ) - LOGICAL :: LCHEM_DDFLX -! if depostion as part of diffusion flux, do not add before , direct input to tracer diffusion - LOGICAL :: LCOMPO_DDFLX_DIR -! variable tropopause (humidity) - LOGICAL :: LCHEM_TROPO -! Use EQSAM4CLIM - LOGICAL :: LAEREQSAM4CLIM -! aerosol surface fluxes - LOGICAL :: LAEROSFC -! Climatological diurnal Cycle (cosine) for climatological dry deposition velocities (AER + CHEM) - LOGICAL :: LCOMPO_DCDD -! Use nitrate aerosol scheme - LOGICAL :: LAERNITRATE -! Use aer resuspension - LOGICAL :: LAERRESUSPENSION -! Use distinct SOA species in aerosol scheme - LOGICAL :: LAERSOA -! SOA coupled with chemistry - LOGICAL :: LAERSOA_COUPLED -! Output CH4 loss tendency from chemistry, and optionally apply online - INTEGER(KIND=JPIM) :: KGHG_CHEMTEND_CH4 -! Use nucleation in IFS-GLOMAP - LOGICAL :: LAERNUCL -! Aersols scheme (aer/glomap) - CHARACTER(LEN=10) :: AERO_SCHEME -! 2D emissions - INTEGER(KIND=JPIM) :: NEMIS2D_DESC - TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS2D_DESC -! 3D emissions - INTEGER(KIND=JPIM) :: NEMIS3D_DESC - TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS3D_DESC -! 2D emission auxiliary fields (injection heights etc) - TYPE(TCOMPO_EMIS_AUX), DIMENSION(:), ALLOCATABLE :: YEMIS2DAUX_DESC -END TYPE TCOMPO + ! --- SWITCHES ------------------ + LOGICAL :: LCHEM_DIA ! mass diagnostics switch for global budget + LOGICAL :: LCHEM_DDFLX ! output of photolysis rates in extra ) + LOGICAL :: LCOMPO_DDFLX_DIR ! if depostion as part of diffusion flux, do not add before, + ! direct input to tracer diffusion + LOGICAL :: LCHEM_TROPO ! variable tropopause (humidity) + LOGICAL :: LAEREQSAM4CLIM ! Use EQSAM4CLIM + LOGICAL :: LAEROSFC ! aerosol surface fluxes + LOGICAL :: LCOMPO_DCDD ! Climatological diurnal Cycle (cosine) for + ! climatological dry deposition velocities (AER + CHEM) + LOGICAL :: LAERNITRATE ! Use nitrate aerosol scheme + LOGICAL :: LAERRESUSPENSION ! Use aer resuspension + LOGICAL :: LAERSOA ! Use distinct SOA species in aerosol scheme + LOGICAL :: LAERSOA_COUPLED ! SOA coupled with chemistry + LOGICAL :: LAERNUCL ! Use nucleation in IFS-GLOMAP + LOGICAL :: LINJ ! Account for injection height + ! + CHARACTER(LEN=10) :: AERO_SCHEME ! Aersols scheme (aer/glomap) + REAL(KIND=JPRB) :: RCHEM_DIA_PERIOD ! period (in hours) on which to output budget + INTEGER(KIND=JPIM) :: KGHG_CHEMTEND_CH4 ! Output CH4 loss tendency from chemistry, and optionally apply online + ! 2D emissions + INTEGER(KIND=JPIM) :: NEMIS2D_DESC ! 2D emissions (number) + TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS2D_DESC ! 2D emissions description. + ! 3D emissions + INTEGER(KIND=JPIM) :: NEMIS3D_DESC ! 2D emissions (number) + TYPE(TCOMPO_EMIS), DIMENSION(:), ALLOCATABLE :: YEMIS3D_DESC ! 3D emissions description. + ! 2D emission auxiliary fields (injection heights etc) + TYPE(TCOMPO_EMIS_AUX), DIMENSION(:), ALLOCATABLE :: YEMIS2DAUX_DESC +END TYPE TCOMPO !!TYPE(TCOMPO), POINTER :: YRCOMPO => NULL() CHARACTER(LEN=10) :: AERO_SCHEME_OP_OBS diff --git a/ifs-source/arpifs/module/yomcst.F90 b/ifs-source/arpifs/module/yomcst.F90 index 3ff944a6..cb05b9fc 100644 --- a/ifs-source/arpifs/module/yomcst.F90 +++ b/ifs-source/arpifs/module/yomcst.F90 @@ -9,7 +9,7 @@ MODULE YOMCST -USE PARKIND1 ,ONLY : JPRB +USE PARKIND1 ,ONLY : JPRB, JPRD IMPLICIT NONE @@ -31,6 +31,8 @@ MODULE YOMCST REAL(KIND=JPRB),PROTECTED :: RHPLA REAL(KIND=JPRB),PROTECTED :: RKBOL REAL(KIND=JPRB),PROTECTED :: RNAVO +REAL(KIND=JPRD),PROTECTED :: DRKBOL ! double precision for use in mixed precision code +REAL(KIND=JPRD),PROTECTED :: DRNAVO ! double precision for use in mixed precision code ! A1.1 Astronomical constants ! * RDAY : duration of the solar day @@ -115,6 +117,8 @@ MODULE YOMCST REAL(KIND=JPRB),PROTECTED :: RMCFC12 REAL(KIND=JPRB),PROTECTED :: RMHCFC22 REAL(KIND=JPRB),PROTECTED :: RMCCL4 +REAL(KIND=JPRD),PROTECTED :: DR ! double precision for use in mixed precision code +REAL(KIND=JPRD),PROTECTED :: DRD ! double precision for use in mixed precision code ! A1.5,6 Thermodynamic liquid,solid phases ! * RCW : Cw (calorific capacity of liquid water) @@ -263,6 +267,9 @@ SUBROUTINE SETUP_CONSTANTS(KULOUT,KPRINTLEV) RKBOL=1.380658E-23_JPRB RNAVO=6.0221367E+23_JPRB +DRKBOL=1.380658E-23_JPRD +DRNAVO=6.0221367E+23_JPRD + ! ------------------------------------------------------------------ !* 2. DEFINE ASTRONOMICAL CONSTANTS. @@ -352,6 +359,10 @@ SUBROUTINE SETUP_CONSTANTS(KULOUT,KPRINTLEV) RMCFC12=120.914_JPRB RMHCFC22=86.469_JPRB RMCCL4=153.823_JPRB + +DR=DRNAVO*DRKBOL +DRD=1000._JPRD*DR/28.9644_JPRD + ! ------------------------------------------------------------------ !* 6. DEFINE THERMODYNAMIC CONSTANTS, LIQUID PHASE. diff --git a/ifs-source/arpifs/module/yommcc.F90 b/ifs-source/arpifs/module/yommcc.F90 index 3b095e88..6c900035 100644 --- a/ifs-source/arpifs/module/yommcc.F90 +++ b/ifs-source/arpifs/module/yommcc.F90 @@ -78,56 +78,53 @@ MODULE YOMMCC ! LMCCIEC_COMPO= .T. ===> THE BOUNDARY CONDITIONS FOR COMPOSITION FLUXES ARE INTERPOLATED IN TIME ( NOT DEFAULT) ! CLIMATOLOGY FILES ! = .F. ===> THEY ARE NOT INTERPOLATED +! LMCCIEC_AERCLIM= .T. ===> THE BOUNDARY CONDITIONS FOR SULFUR OXIDANTS ARE INTERPOLATED IN TIME +! = .F. ===> THEY ARE NOT INTERPOLATED ! LMCCICEIC= .T. ===> ICE INITIAL CONDITIONS SENT TO COUPLER AT STARTUP ! =.F ===> NO OUTPUT OF ICE -! LFIRSTUPD ===> TRUE UNTIL UPDCLIE HAS BEEN CALLED + +! LFIRSTUPD ===> TRUE UNTIL UPDCLIE HAS BEEN CALLED +! LFIRSTUPDCOMPO ===> TRUE UNTIL UPDCLIE_COMPO HAS BEEN CALLED +! LFIRSTUPDAERCLIM ===> TRUE UNTIL UPDCLIE_AERCLIM HAS BEEN CALLED + ! NCLIMTOT ===> TOTAL NUMBER OF FIELDS TO BE UPDATED IN TIME ! NCLIMR ===> NUMBER OF UPDATING FIELDS TO BE READ FROM FILE (OTHERS COME FROM OASIS COUPLER) -! NCLIGC ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED -! NCLIAER ===> GRIB CODES OF CLIM.AEROSOL FIELDS TO BE TIME UPDATED -! NDIFC ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) -! NJDCR ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) -! NJDCR1 ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE ICMBC FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) -! NDIFC_COMPO ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) -! NJDCR_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) -! NJDCR1_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ -! IN THE ICMBC FILE (ONLY USED FOR LMCCIEC=.FALSE.) -! NP1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LMCCIEC=.TRUE.) -! NP2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LMCCIEC=.TRUE.) -! NPAER_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LEAERDIU=.TRUE.) -! NPAER_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LEAERDIU=.TRUE.) -! NPCOMPO_1 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LMCC_COMPO =.TRUE.) ! naj -! NPCOMPO_2 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LECO2DIU=.TRUE.) -! NPCO2_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION -! (ONLY USED FOR LECO2DIU=.TRUE.) -! NPCO2_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION -! (ONLY USED FOR LECO2DIU=.TRUE.) +! NCLIGC ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED FROM CLIMATE FILE +! NCLIGC_COMPO ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED FROM CLIMATE FILE FOR COMPO +! NCLIGC_AERCLIM ===> GRIB CODES OF THE FIELDS TO BE TIME UPDATED FROM CLIMATE FILE FOR AERCLIM (SO2 oxidants) +! NCLIAER ===> GRIB CODES OF CLIM.AEROSOL FIELDS TO BE TIME UPDATED (not the SO2 oxidants!) [UNUSED] + +! NDIFC ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) +! NDIFC_COMPO ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) +! NDIFC_AERCLIM ===> DIFFERENCE, IN DAYS, BETWEEN CONSECUTIVE TIMES IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_AERCLIM=.FALSE.) + +! NJDCR ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC=.FALSE.) +! NJDCR1 ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE ICMBC FILE (ONLY USED FOR LMCCIEC=.FALSE.) +! NJDCR_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) +! NJDCR1_COMPO ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE ICMBC FILE (ONLY USED FOR LMCCIEC_COMPO=.FALSE.) [UNUSED] +! NJDCR_AERCLIM ===> JULIAN DAY OF THE NEXT FIELD TO BE READ IN THE CLIMATE FILE (ONLY USED FOR LMCCIEC_AERCLIM=.FALSE.) + +! NP1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC=.TRUE.) +! NP2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC=.TRUE.) +! NPAER_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LEAERDIU=.TRUE.) +! NPAER_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LEAERDIU=.TRUE.) +! NPCOMPO_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_COMPO=.TRUE., ELSE FIXED) +! NPCOMPO_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_COMPO=.TRUE., ELSE FIXED) +! NPAERCLIM_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_AERCLIM=.TRUE., ELSE FIXED) +! NPAERCLIM_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LMCCIEC_AERCLIM=.TRUE., ELSE FIXED) +! NPCO2_1 ===> INDEX FOR THE FIRST FILE IN TIME INTERPOLATION (ONLY USED FOR LECO2DIU=.TRUE.) +! NPCO2_2 ===> INDEX FOR THE SECOND FILE IN TIME INTERPOLATION (ONLY USED FOR LECO2DIU=.TRUE.) ! NUNITC ===> PBOPEN UNIT FOR CLIMATE FILE ! NUNITCM ===> PBOPEN UNIT FOR CLIMATE FILE FOR COMPO +! NUNITCAERCLIM ===> PBOPEN UNIT FOR CLIMATE FILE FOR AERCLIM (SO2 oxidants) ! NUNITC1 ===> PBOPEN UNIT FOR OCEAN BIAS CORRECTION FILE -! CLIMR ===> HOLDS THE LAST CLIMATE FILES READ (ONLY USED FOR -! LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) -! ZLAKE ===> HOLDS THE LAST LAKE FILES READ ( -! (ONLY USED FOR LEOCLAKE=.TRUE. ) -! OCEANBC ===> HOLDS THE LAST OCEAN BC FILES READ -! (ONLY USED FOR LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) -! CLIMRAER ===> HOLDS THE LAST NBF AER FILES READ -! (ONLY USED FOR LEAERDIU=.TRUE.) -! CLIMRCOMPO ===> HOLDS THE LAST NBF COMPO FILES READ -! (ONLY USED FOR LMCC_COMPO =.TRUE.) ! naj -! CLIMRCO2 ===> HOLDS THE LAST NBF CO2 FILES READ -! (ONLY USED FOR LECO2DIU=.TRUE.) + +! CLIMR ===> HOLDS THE LAST CLIMATE FILES READ (ONLY USED FOR LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) +! ZLAKE ===> HOLDS THE LAST LAKE FILES READ (ONLY USED FOR LEOCLAKE=.TRUE. ) +! OCEANBC ===> HOLDS THE LAST OCEAN BC FILES READ (ONLY USED FOR LMCCEC=.TRUE. .AND. LMCC04=.FALSE.) +! CLIMRAER ===> HOLDS THE LAST SO2-OXIDANTS FILES READ (ONLY USED FOR LMCC_COMPO =.TRUE. .AND. NSO4SCHEME == 2) +! CLIMRCOMPO ===> HOLDS THE LAST COMPO-EMISS FILES READ (ONLY USED FOR LMCC_COMPO =.TRUE.) +! CLIMRCO2 ===> HOLDS THE LAST NBF CO2 FILES READ (ONLY USED FOR LECO2DIU=.TRUE.) ! NFRCPL ===> COUPLING FREQUENCY ! NSSTICEOP ===> INDEX FOR SST TREATMENT IN POINTS CONTAINING SEA ICE ! @@ -153,28 +150,38 @@ MODULE YOMMCC ! pointer to YSD SD_VF array for input field INTEGER(KIND=JPIM) :: NYSDMP_COMPO(NPEMIS2D+NPEMIS2DAUX+JPCHEM+2) INTEGER(KIND=JPIM) :: NCLIMR_COMPO + ! To read prescribed oxidants for SO2-SO4 scheme + INTEGER(KIND=JPIM) :: NCLIGC_AERCLIM(10) + INTEGER(KIND=JPIM) :: NYSDMP_AERCLIM(10) + INTEGER(KIND=JPIM) :: NCLIAER(16) INTEGER(KIND=JPIM) :: NDIFC INTEGER(KIND=JPIM) :: NJDCR INTEGER(KIND=JPIM) :: NJDCR1 INTEGER(KIND=JPIM) :: NDIFC_COMPO + INTEGER(KIND=JPIM) :: NDIFC_AERCLIM INTEGER(KIND=JPIM) :: NJDCR_COMPO INTEGER(KIND=JPIM) :: NJDCR1_COMPO + INTEGER(KIND=JPIM) :: NJDCR_AERCLIM INTEGER(KIND=JPIM) :: NP1 INTEGER(KIND=JPIM) :: NP2 INTEGER(KIND=JPIM) :: NPCO2_1, NPCO2_2 INTEGER(KIND=JPIM) :: NPAER_1, NPAER_2 INTEGER(KIND=JPIM) :: NPCOMPO_1, NPCOMPO_2 + INTEGER(KIND=JPIM) :: NPAERCLIM_1,NPAERCLIM_2 INTEGER(KIND=JPIM) :: NUNITC - INTEGER(KIND=JPIM) :: NUNITC1 INTEGER(KIND=JPIM) :: NUNITCM + INTEGER(KIND=JPIM) :: NUNITCAERCLIM + INTEGER(KIND=JPIM) :: NUNITC1 INTEGER(KIND=JPIM) :: NOACOMM INTEGER(KIND=JPIM) :: NSSTICEOP - REAL(KIND=JPRB),ALLOCATABLE:: CLIMRCO2(:,:,:),CLIMRAER(:,:,:),CLIMRCOMPO(:,:,:),ZLAKE(:,:,:),OCEANBC(:,:) + REAL(KIND=JPRB),ALLOCATABLE:: CLIMRCO2(:,:,:),CLIMRAER(:,:,:,:),CLIMRCOMPO(:,:,:),ZLAKE(:,:,:),OCEANBC(:,:) REAL(KIND=JPRD), ALLOCATABLE :: CLIMR(:,:,:) LOGICAL :: LFIRSTUPD = .TRUE. + LOGICAL :: LFIRSTUPDCOMPO = .TRUE. + LOGICAL :: LFIRSTUPDAERCLIM = .TRUE. LOGICAL :: LCURR LOGICAL :: LGELATO LOGICAL :: LMCC01_MSE @@ -187,6 +194,7 @@ MODULE YOMMCC LOGICAL :: LMCCEC LOGICAL :: LMCCIEC LOGICAL :: LMCCIEC_COMPO + LOGICAL :: LMCCIEC_AERCLIM LOGICAL :: LMCCICEIC LOGICAL :: LMCCDYNSEAICE LOGICAL :: LNEMOCOUP @@ -307,7 +315,7 @@ SUBROUTINE PRINT_CONFIGURATION(SELF, KDEPTH, KOUTNO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIMR = ', SELF%NCLIMR WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIGC sum = ', SUM(SELF%NCLIGC) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIGC_COMPO sum = ', SUM(SELF%NCLIGC_COMPO) -WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIGC_COMPO sum = ', SUM(SELF%NYSDMP_COMPO) +WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NYDSMP_COMPO sum = ', SUM(SELF%NYSDMP_COMPO) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIMR_COMPO = ', SELF%NCLIMR_COMPO WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NCLIAER sum = ', SUM(SELF%NCLIAER) WRITE(KOUTNO,*) REPEAT(' ',IDEPTHLOC) // 'NDIFC = ', SELF%NDIFC diff --git a/ifs-source/arpifs/module/yomphyder.F90 b/ifs-source/arpifs/module/yomphyder.F90 index 1eece5ce..e7ae3035 100644 --- a/ifs-source/arpifs/module/yomphyder.F90 +++ b/ifs-source/arpifs/module/yomphyder.F90 @@ -41,10 +41,14 @@ MODULE YOMPHYDER REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZSCAV ! - aerosols transport arrays REAL(KIND=JPRB), DIMENSION(:,:,:,:), POINTER, CONTIGUOUS :: ZAERLISI - REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOT, ZTAUAER, ZCAERO, ZAEROP - REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOTLEV,ZAERAAOTLEV, ZAERASYLEV - REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF - REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOT, ZTAUAER, ZCAERO, ZAEROP + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERAOTLEV,ZAERAAOTLEV, ZAERASYLEV + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAERFLX_M7 + REAL(KIND=JPRB), DIMENSION(:,:) , POINTER, CONTIGUOUS :: ZAERSRC, ZAERDDP, ZAERSDM, ZAERFLX, ZAERLIF + REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZAZ0M, ZAZ0H +!--aerosol optical properties at 14 SW wavelengths (TM5M7) + REAL(KIND=JPRB), DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZAEROTAU, ZAEROSSA,ZAEROASY,ZAEROTAULW + ! - DMS-related aerosol local arrays REAL(KIND=JPRB), DIMENSION(:) , POINTER, CONTIGUOUS :: ZDMSO, ZLDAY, ZLISS, ZSO2, ZTDMS, ZDMSI, ZODMS !-- other prognostic aerosol-related quantities diff --git a/ifs-source/arpifs/namelist/naeaer.nam.h b/ifs-source/arpifs/namelist/naeaer.nam.h index d512fdac..ccaf4291 100644 --- a/ifs-source/arpifs/namelist/naeaer.nam.h +++ b/ifs-source/arpifs/namelist/naeaer.nam.h @@ -24,6 +24,6 @@ NAMELIST/NAEAER/& & RSUCV1 , RSUCV2 , & & NAERSCAV , LSEASALT_RH80, NDRYDEPVEL_DYN, RAERDUST_REBOUND,& & LAERDUSTSOURCE, LAERDUST_NEWBIN, YAERO_DESC, NSO4SCHEME, & - & NAER_BLNUCL, LAERDUSTSIZEVAR + & NAER_BLNUCL, LAERDUSTSIZEVAR, DCAL, GUSTS, NOSEASALT ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/namelist/naerad.nam.h b/ifs-source/arpifs/namelist/naerad.nam.h index f66ed9b2..cb00198a 100644 --- a/ifs-source/arpifs/namelist/naerad.nam.h +++ b/ifs-source/arpifs/namelist/naerad.nam.h @@ -15,7 +15,7 @@ NAMELIST/NAERAD/& &, LCCNL , LCCNO , LRAYL , LRRTM , LSRTM & &, LHVOLCA, LNEWAER, LDIFFC , LNOTROAER & &, LETRACGMS,LAERCLIM,LAERVISI,LAERADJDU,LAERADCLI & - &, LPERPET, LAER3D & +&, LPERPET, LAER3D & &, NICEOPT, NLIQOPT, NSWICEOPT, NLWICEOPT, NSWLIQOPT, NLWLIQOPT & &, NMCICA , NRADIP , NRADLP & &, NREDGLW, NREDGSW & @@ -43,7 +43,9 @@ NAMELIST/NAERAD/& &, NSOLARSPECTRUM, NSWWVCONTINUUM, NDUMPBADINPUTS, LINTERPINCLOUDMEAN & &, NCLOUDOVERLAP, NDUMPINPUTS & &, RCLOUD_SEPARATION_SCALE_TOA, RCLOUD_SEPARATION_SCALE_SURF & -&, CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE - +&, CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE & +&, LCMIP_STRATAER_CMIP6,LCMIP_STRATAER_CMIP7 & +&, LCMIP_STRATAER_BCKGD, CCMIP_STRAT_FULL & +&, CCMIP_STRAT_FULL_CLIM, NCLOUDACT, NAEROOPT ! ----------------------------------------------------------------- diff --git a/ifs-source/arpifs/namelist/namcompo.nam.h b/ifs-source/arpifs/namelist/namcompo.nam.h index 6b9c5622..fd385a96 100644 --- a/ifs-source/arpifs/namelist/namcompo.nam.h +++ b/ifs-source/arpifs/namelist/namcompo.nam.h @@ -11,5 +11,5 @@ NAMELIST / NAMCOMPO / AERO_SCHEME, LCHEM_DIA, RCHEM_DIA_PERIOD, LCHEM_DDFLX,& & LCOMPO_DDFLX_DIR,LCOMPO_DCDD, & -& LCHEM_TROPO,LAERNITRATE,LAERSOA,LAERRESUSPENSION, LAERNUCL, LAERSOA_COUPLED, & +& LCHEM_TROPO,LAERNITRATE,LAERSOA, LINJ, LAEROSFC,LAERRESUSPENSION, LAERNUCL, LAERSOA_COUPLED, & & LAEREQSAM4CLIM, KGHG_CHEMTEND_CH4 diff --git a/ifs-source/arpifs/namelist/namm7ctl.nam.h b/ifs-source/arpifs/namelist/namm7ctl.nam.h new file mode 100644 index 00000000..19194d0f --- /dev/null +++ b/ifs-source/arpifs/namelist/namm7ctl.nam.h @@ -0,0 +1,7 @@ +! AUTHOR. +! ------- +! 2020-11-17 Tero Mielonen (TeMi) +! ----------------------------------------------------------------- +NAMELIST/NAMM7CTL/& + & NWATER, NSNUCL, NONUCL +! ----------------------------------------------------------------- \ No newline at end of file diff --git a/ifs-source/arpifs/phys_ec/aer_negat.F90 b/ifs-source/arpifs/phys_ec/aer_negat.F90 new file mode 100644 index 00000000..36dff811 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/aer_negat.F90 @@ -0,0 +1,152 @@ +SUBROUTINE AER_NEGAT & + & ( YREAERATM, KIDIA , KFDIA , KLON, KLEV,& + & PTSPHY , & + & PCAERO , PTAERO, PAPHP1, & + & PFAERNG ) + +!**** *AER_NEGAT* - AVOIDS NEGATIVE VALUES FOR AEROSOL CONCENTRATION. + +! JJMorcrette ECMWF 2005/08/16 +! JJMorcrette ECMWF 2005/08/16 +! from QNEGAT by B.RITTER E.C.M.W.F. 29/04/83. + +! PURPOSE. +! -------- + +! THIS ROUTINE RESETS TO A VERY SMALL MINIMUM VALUE ALL THE +! AEROSOL MIXING RATIOS SMALLER THAN THIS (IN PARTICULAR ALL THE +! NEGATIVE VALUES THAT MIGHT HAVE APPEARED IN THE COURSE OF THE +! TIME STEP). + +!** INTERFACE. +! ---------- + +! *AER_NEGAT* IS CALLED FROM *CALLPAR*. +! THE ROUTINE TAKES ITS INPUT FROM THE LONG-TERM STORAGE: PCAERO +! AT T+1 AND P ON LEVEL BOUNDARIES AT T+1. IT RETURNS ITS OUTPUT +! TO THE SAME SPACE: CORRECTED PTAERO TENDENCIES. +! THE TEMPERATURE WILL NOT BE ADJUSTED AND SURFACE +! FLUXES (OF AEROSOLS) WILL NOT BE MODIFIED. + +! METHOD. +! ------- + +! FOR EACH LAYER (FROM TOP TO BOTTOM) THE AEROSOL CONCENTRATION +! IS COMPARED WITH ITS CRITICAL VALUE. IF NECESSARY THE ADJUSTMENT IS +! PERFORMED AND THE NECESSARY WATER IS TAKEN FROM THE LAYER UNDERNEATH. + +! EXTERNALS. +! ---------- + +! NONE. + +! REFERENCE. +! ---------- + +! SEE RELEVANT PART OF THE DOCUMENTATION. + +! ------------------------------------------------------------------ + +USE PARKIND1 ,ONLY : JPIM ,JPRB +USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK + +USE YOMCST , ONLY : RG +USE YOEAERATM, ONLY :TEAERATM! YREAERATM + +IMPLICIT NONE + +TYPE(TEAERATM), INTENT(IN) :: YREAERATM +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA + +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +REAL(KIND=JPRB) ,INTENT(IN) :: PCAERO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PTAERO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPHP1(KLON,KLEV+1) + +REAL(KIND=JPRB) ,INTENT(OUT) :: PFAERNG(KLON,KLEV) + +!* flux outputs + +! PFAERNG : PSEUDO-FLUX OF AEROSOLS TO CORRECT FOR NEGATIVE AEROSOL CONCENTRATION + + +REAL(KIND=JPRB) :: ZAEROLD(KLON,KLEV), ZDP(KLON), ZDPO(KLON) + +INTEGER(KIND=JPIM) :: JK, JL + +REAL(KIND=JPRB) :: ZCONS1, ZDAER, ZGDPH, ZTMST +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('AER_NEGAT',0,ZHOOK_HANDLE) +ASSOCIATE(REPSCAER=>YREAERATM%REPSCAER) + +!* COMPUTATIONAL CONSTANTS. +! ------------- ---------- + +ZTMST=PTSPHY + +ZCONS1=1.0_JPRB/ZTMST +!*** + +! ------------------------------------------------------------------ + +!* 2. ADJUSTMENT FOR ALL LAYERS. +! ---------- --- --- ------- + +!* 2.1 SAVE INITIAL TENDENCY VALUES + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZAEROLD(JL,JK)=PTAERO(JL,JK) + ENDDO + ENDDO + + +!* 2.2 PRELIMINARY COMPUTATIONS FOR THE TOP LAYER. + +DO JL=KIDIA,KFDIA + ZDP(JL)=PAPHP1(JL,2)-PAPHP1(JL,1) +ENDDO + +!* 2.3 VERTICAL LOOP EXCLUDING THE BOTTOM LAYER. + +DO JK=1,KLEV-1 + DO JL=KIDIA,KFDIA + ZDPO(JL)=ZDP(JL) + ENDDO + DO JL=KIDIA,KFDIA + ZDP(JL)=PAPHP1(JL,JK+2)-PAPHP1(JL,JK+1) + ZDAER=ZCONS1*MAX(0.0_JPRB,REPSCAER-(PCAERO(JL,JK)+ZTMST*PTAERO(JL,JK))) + PTAERO(JL,JK)=PTAERO(JL,JK)+ZDAER + ZDAER=ZDAER*ZDPO(JL)/ZDP(JL) + PTAERO(JL,JK+1)=PTAERO(JL,JK+1)-ZDAER + ENDDO +ENDDO + +!* 2.3 BOTTOM LAYER. + +DO JL=KIDIA,KFDIA + ZDAER=ZCONS1*MAX(0.0_JPRB,REPSCAER-(PCAERO(JL,KLEV)+ZTMST*PTAERO(JL,KLEV))) + PTAERO(JL,KLEV)=PTAERO(JL,KLEV)+ZDAER +ENDDO + +!* 3. FLUX COMPUTATIONS + +DO JL=KIDIA,KFDIA + PFAERNG(JL,1)=0.0_JPRB +ENDDO +DO JK=1,KLEV-1 + DO JL=KIDIA,KFDIA + ZGDPH = -RG /(PAPHP1(JL,JK+1)-PAPHP1(JL,JK)) + PFAERNG(JL,JK+1)=(PTAERO(JL,JK)-ZAEROLD(JL,JK))/ZGDPH + PFAERNG(JL,JK) + ENDDO +ENDDO + +!------------------------------------------------------------------------------- +END ASSOCIATE +IF (LHOOK) CALL DR_HOOK('AER_NEGAT',1,ZHOOK_HANDLE) +END SUBROUTINE AER_NEGAT diff --git a/ifs-source/arpifs/phys_ec/aer_phy3.F90 b/ifs-source/arpifs/phys_ec/aer_phy3.F90 index 00d64431..4469555e 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3.F90 @@ -160,7 +160,7 @@ SUBROUTINE AER_PHY3 & REAL(KIND=JPRB) :: ZBCPHI(KLON,KLEV), ZBCPHO(KLON,KLEV), ZOMPHI(KLON,KLEV) , ZOMPHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTBCPHI(KLON,KLEV),ZTBCPHO(KLON,KLEV),ZTOMPHI(KLON,KLEV), ZTOMPHO(KLON,KLEV) REAL(KIND=JPRB) :: ZITBCPHO(KLON,KLEV),ZITOMPHO(KLON,KLEV),ZITSO2(KLON,KLEV) -REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSOA(KLON,4) +REAL(KIND=JPRB) :: ZFSO2(KLON) , ZFSO4(KLON), ZFSO4_AQ(KLON), ZFSOA(KLON,4) REAL(KIND=JPRB) :: ZQSAT(KLON,KLEV), ZRHCL(KLON,KLEV), ZRHO(KLON,KLEV) REAL(KIND=JPRB) :: ZTAER(KLON,KLEV), ZTAERI(KLON,KLEV),ZTAERGASA(KLON,KLEV),ZTAERSOAA(KLON,KLEV) @@ -171,7 +171,7 @@ SUBROUTINE AER_PHY3 & REAL(KIND=JPRB) :: ZHNO3OK(KLON,KLEV) REAL(KIND=JPRB) :: ZITNO3_1(KLON,KLEV) REAL(KIND=JPRB) :: ZSO4(KLON,KLEV) -REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZTSO2(KLON,KLEV) , ZTSO4(KLON,KLEV) +REAL(KIND=JPRB) :: ZSO2(KLON,KLEV), ZTSO2(KLON,KLEV) , ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV) REAL(KIND=JPRB) :: ZNO3_1(KLON,KLEV),ZNO3_2(KLON,KLEV), ZNH4(KLON,KLEV) REAL(KIND=JPRB) :: ZDUST1(KLON,KLEV), ZDUST2(KLON,KLEV), ZDUST3(KLON,KLEV) REAL(KIND=JPRB) :: ZTDUST1(KLON,KLEV), ZTDUST2(KLON,KLEV), ZTDUST3(KLON,KLEV) @@ -501,7 +501,7 @@ SUBROUTINE AER_PHY3 & & PTSPHY, PTP , PRSF1 , PAP , ZQLI , PGELAT, PGELAM, & & ZSO2 , ZITSO2, PGFL(:,:,YAEROCLIM(1)%MP), & & PGFL(:,:,YAEROCLIM(2)%MP), PGFL(:,:,YAEROCLIM(3)%MP) ,& - & ZTSO2 , ZTSO4, ZFSO2, ZFSO4, ZDP ) + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) CASE DEFAULT CALL ABOR1('ABORT: IN AER_PHY3, NSO4SCHEME MUST BE 1 OR 2') @@ -624,7 +624,7 @@ SUBROUTINE AER_PHY3 & & PTSPHY, PTP , PRSF1 , PAP , ZQLI , PGELAT, PGELAM, & & ZSO2 , ZITSO2, PGFL(:,:,YAEROCLIM(1)%MP), & & PGFL(:,:,YAEROCLIM(2)%MP), PGFL(:,:,YAEROCLIM(3)%MP) ,& - & ZTSO2 , ZTSO4, ZFSO2, ZFSO4, ZDP ) + & ZTSO2 , ZTSO4, ZTSO4_AQ, ZFSO2, ZFSO4, ZFSO4_AQ, ZDP ) CASE DEFAULT CALL ABOR1('ABORT: IN AER_PHY3, NSO4SCHEME MUST BE 1 OR 2') END SELECT diff --git a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 index 12d52608..dd072477 100644 --- a/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aer_phy3_layer.F90 @@ -10,7 +10,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & ! Input quantities & YDMODEL,KDIM, PAUX, STATE, SURFL, AUXL, PDIAG, PCHEM2AER, & ! Input/Output quantities - & PGFL, PSURF, FLUX, GEMSL, PRAD) + & PGFL, PSURF, FLUX, GEMSL, PRAD, PSNOWACL) !**** *AER_PHY3_LAYER* - Layer routine calling the last part of prognostics aerosol scheme @@ -63,18 +63,21 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & !----------------------------------------------------------------------- -USE TYPE_MODEL , ONLY : MODEL -USE SURFACE_FIELDS_MIX , ONLY : TSURF -USE PARKIND1 ,ONLY : JPIM, JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMCST ,ONLY : RA, RPI - -USE YOMPHYDER ,ONLY : DIMENSION_TYPE, STATE_TYPE, AUX_TYPE, & - & AUX_DIAG_LOCAL_TYPE, SURF_AND_MORE_TYPE, FLUX_TYPE, & - & GEMS_LOCAL_TYPE, SURF_AND_MORE_LOCAL_TYPE, AUX_RAD_TYPE, AUX_DIAG_TYPE -USE YOECLDP , ONLY : NCLDQL, NCLDQI, NCLDQR, NCLDQS -USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, JPAERO_WVL_AOD -USE TM5_CHEM_MODULE , ONLY : NCHEM2AER +USE TYPE_MODEL, ONLY : MODEL +USE SURFACE_FIELDS_MIX, ONLY : TSURF +USE PARKIND1, ONLY : JPIM, JPRB +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY : NULOUT +USE YOMCST, ONLY : RA, RPI + +USE YOMPHYDER, ONLY : DIMENSION_TYPE, STATE_TYPE, AUX_DIAG_LOCAL_TYPE,& + & AUX_TYPE, SURF_AND_MORE_TYPE, FLUX_TYPE, & + & GEMS_LOCAL_TYPE, SURF_AND_MORE_LOCAL_TYPE, & + & AUX_RAD_TYPE, AUX_DIAG_TYPE +USE YOECLDP, ONLY : NCLDQL, NCLDQI, NCLDQR, NCLDQS +USE TM5_PHOTOLYSIS, ONLY : NBANDS_TROP +USE YOE_AERODIAG, ONLY : NPAERAOT, NPAERLISI_VAR, NPAERLISI_WVL, JPAERO_WVL_AOD +USE TM5_CHEM_MODULE, ONLY : NCHEM2AER !----------------------------------------------------------------------- @@ -94,8 +97,10 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & TYPE (FLUX_TYPE) , INTENT(INOUT) :: FLUX TYPE (GEMS_LOCAL_TYPE) , INTENT(INOUT) :: GEMSL TYPE (AUX_RAD_TYPE) , INTENT(INOUT) :: PRAD +REAL(KIND=JPRB) , INTENT (IN) :: PSNOWACL(KDIM%KLON,KDIM%KLEV) ! accretion rate of snow with cloud droplets !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JAER, JVAR, JWVL, JGFL, JK, JL +INTEGER(KIND=JPIM) :: IBLK REAL(KIND=JPRB) :: ZTH(KDIM%KLON,KDIM%KLEV+1),ZSNM(KDIM%KLON) REAL(KIND=JPRB) :: ZAERO_WVL_DIAG(KDIM%KLON,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG,YDMODEL%YRML_GCONF%YGFL%NAERO_WVL_DIAG_TYPES) REAL(KIND=JPRB),ALLOCATABLE :: ZAREA(:) @@ -114,14 +119,16 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & REAL(KIND=JPRB) :: ZO3(KDIM%KLON,KDIM%KLEV) REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +!VH temporary variables - need to think of a good way to port this further +REAL(KIND=JPRB) :: ZTAUS_AER(KDIM%KLON,KDIM%KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB) :: ZTAUA_AER(KDIM%KLON,KDIM%KLEV,NBANDS_TROP,2) +REAL(KIND=JPRB) :: ZPMAER(KDIM%KLON,KDIM%KLEV,NBANDS_TROP,2) + !----------------------------------------------------------------------- #include "aer_phy3.intfb.h" - - - - +#include "hamm7_interface.intfb.h" #include "aer_diagglomap.intfb.h" #include "abor1.intfb.h" @@ -130,7 +137,9 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & IF (LHOOK) CALL DR_HOOK('AER_PHY3_LAYER',0,ZHOOK_HANDLE) ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) + & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, & + & YDECLDP=>YDMODEL%YRML_PHY_EC%YRECLDP, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT)! use this to transfer AOD, SSA and ASY to rad scheme ASSOCIATE(TSPHY=>YDPHY2%TSPHY, & & YSP_RR=>YDSURF%YSP_RR, YSP_SG=>YDSURF%YSP_SG, YSD_VF=>YDSURF%YSD_VF, & & YSP_SB=>YDSURF%YSP_SB, YSD_VD=>YDSURF%YSD_VD, NDIM=>YGFL%NDIM, & @@ -138,6 +147,7 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & & NAERO_WVL_DIAG=>YGFL%NAERO_WVL_DIAG, & & NAERO_WVL_DIAG_TYPES=>YGFL%NAERO_WVL_DIAG_TYPES, & & NACTAERO=>YGFL%NACTAERO, & + & NAERCLD=>YDECLDP%NAERCLD, & & LAERCHEM=>YGFL%LAERCHEM, & & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & YO3=>YGFL%YO3, & @@ -182,46 +192,138 @@ SUBROUTINE AER_PHY3_LAYER(YDSURF, & CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") + CASE ("hamm7") + ! Optical properties calculated only for radiation timesteps. + ! Using previous optical properties if not calculated + ! introduce simple routine to ensure values are non-zero: + + IBLK=(KDIM%KSTGLO-1)/KDIM%KLON + 1 + DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + GEMSL%ZAEROTAU(JL,JK,JAER) = YDAERM7%M7AOD( JL,JK,JAER,IBLK) + GEMSL%ZAEROSSA(JL,JK,JAER) = YDAERM7%M7SSA( JL,JK,JAER,IBLK) + GEMSL%ZAEROASY(JL,JK,JAER) = YDAERM7%M7ASYM(JL,JK,JAER,IBLK) + ENDDO + ENDDO + ENDDO + DO JAER=1,16 !FIXME this needs better variable + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + GEMSL%ZAEROTAULW(JL,JK,JAER) = YDAERM7%M7AODLW(JL,JK,JAER,IBLK) + ENDDO + ENDDO + ENDDO + + DO JVAR=1,NAERO_WVL_DIAG_TYPES + DO JWVL=1,NAERO_WVL_DIAG + DO JL=KDIM%KIDIA,KDIM%KFDIA + ZAERO_WVL_DIAG(JL,JWVL,JVAR) = PSURF%PSD_VD(JL,YSD_VD%YAERO_WVL_DIAG(JWVL,JVAR)%MP) + ENDDO + ENDDO + ENDDO + + + ZTAUS_AER = 0._JPRB + ZTAUA_AER = 0._JPRB + ZPMAER = 0._JPRB + + ! RCHG: Is HAMM7_INTERFACE the equivalent of AER_PHY3 or it has other + ! functionalities? For a practical point of view, we can have + ! HAMM7_PHY3 to we can associate equivalent functionalities between + ! both SCHEMES. => note that this is only reasonable if + ! (a) we agree with split of subroutines in AER scheme + ! (b) the hamm7 scheme is reasonable equivalent in procedures with aer. + ! The comment about is a general suggestion. + CALL HAMM7_INTERFACE (& + & YDMODEL, & + & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON, KDIM%KTDIA, KDIM%KLEV, KDIM%KTILES, & + & KDIM%KFLDX, KDIM%KLEVX, & + & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, KDIM%KSTGLO, PAUX%PGEOMH, & + & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & + & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & + & STATE%A , & + & STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & + & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU , & + & PDIAG%PMFU, & + & ZO3, STATE%Q, STATE%T, ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & + & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & + !& SURFL%ZALBD , & + & SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & + & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & + & GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF, & + & FLUX%PAERODDF, TSPHY , PGFL , & + !VH total optical depth output... + & PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP), & + & ZAERO_WVL_DIAG, & + !& PSURF%PSD_VD(:,YSD_VD%YODTO469%MP), PSURF%PSD_VD(:,YSD_VD%YODTO670%MP), & + !& PSURF%PSD_VD(:,YSD_VD%YODTO865%MP), PSURF%PSD_VD(:,YSD_VD%YODTO1240%MP), & + & GEMSL%ZAEROTAU, GEMSL%ZAEROSSA,GEMSL%ZAEROASY, GEMSL%ZAEROTAULW, & + !VH Variables ZTAUS_AER etc ideally convoluted with GEMSL%ZAERTAULT, or similar. + & ZTAUS_AER , ZTAUA_AER, ZPMAER, & + !VH + & PSURF%PSD_XA, PAUX%PVERVEL, AUXL%ZCCNL, AUXL%ZCCNO, PSURF%PAHFSTI, PSURF%PSD_VF(:,YSD_VF%YCI%MP), GEMSL%ZAZ0M, FLUX%PFTLHEV, & + & STATE%U, STATE%V, PSURF%PCVL, PSURF%PCVH,PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP), PAUX%PGEMU,PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP), & + & PSNOWACL, PDIAG%ICTOP, PDIAG%ICBOT, & + & PSURF%PSD_VD(:,YSD_VD%YAEPM1%MP), PSURF%PSD_VD(:,YSD_VD%YAEPM25%MP), PSURF%PSD_VD(:,YSD_VD%YAEPM10%MP) ) + + DO JAER=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + YDAERM7%M7AOD(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7SSA(JL,JK,JAER,IBLK) = GEMSL%ZAEROSSA(JL,JK,JAER) !*GEMSL%ZAEROTAU(JL,JK,JAER) + YDAERM7%M7ASYM(JL,JK,JAER,IBLK) = GEMSL%ZAEROASY(JL,JK,JAER) !*GEMSL%ZAEROSSA(JL,JK,JAER)*GEMSL%ZAEROTAU(JL,JK,JAER) + ENDDO + ENDDO + ENDDO + DO JAER=1,16 !FIXME this needs better variable + DO JK=1,KDIM%KLEV + DO JL=KDIM%KIDIA,KDIM%KFDIA + YDAERM7%M7AODLW(JL,JK,JAER,IBLK) = GEMSL%ZAEROTAULW(JL,JK,JAER) + ENDDO + ENDDO + ENDDO - CASE ("aer") + CASE ("aer") !* 1. UNROLL THE DERIVED STRUCTURES AND CALL AER_PHY3 - CALL AER_PHY3 & - &( YDMODEL, & - & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & - & KDIM%KFLDX , KDIM%KLEVX, & - & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, & - & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & - & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & - & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & - & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU ,& - & FLUX%PFCCQL,FLUX%PFCCQN,FLUX%PFCSQL,FLUX%PFCSQN,& - & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & - & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & - & SURFL%ZALBD , GEMSL%ZTAUAER, SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & - & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & - & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & - & FLUX%PAERODDF, PSURF%PSD_VF(:,YSD_VF%YFCA1%MP),PSURF%PSD_VF(:,YSD_VF%YFCA2%MP),& - & TSPHY , PGFL , & - & PSURF%PSD_VD(:,YSD_VD%YODSS%MP), PSURF%PSD_VD(:,YSD_VD%YODDU%MP),& - & PSURF%PSD_VD(:,YSD_VD%YODOM%MP), PSURF%PSD_VD(:,YSD_VD%YODBC%MP), PSURF%PSD_VD(:,YSD_VD%YODSU%MP),& - & PSURF%PSD_VD(:,YSD_VD%YODNI%MP),PSURF%PSD_VD(:,YSD_VD%YODAM%MP), PSURF%PSD_VD(:,YSD_VD%YODSOA%MP),& - & PSURF%PSD_VD(:,YSD_VD%YODVFA%MP),PSURF%PSD_VD(:,YSD_VD%YODVSU%MP),PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP),& - & PSURF%PSD_VD(:,YSD_VD%YAEPM1%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM25%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM10%MP),& - & GEMSL%ZAERAOT, GEMSL%ZAERLISI, PSURF%PSD_XA, & - & ZAERO_WVL_DIAG & - &) - - - CASE DEFAULT - - CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) + CALL AER_PHY3( & + & YDMODEL, & + & KDIM%KIDIA , KDIM%KFDIA , KDIM%KLON , KDIM%KTDIA , KDIM%KLEV , KDIM%KTILES , & + & KDIM%KFLDX , KDIM%KLEVX, & + & GEMSL%ITRAC , GEMSL%IAERO , GEMSL%ICHEM, & + & PAUX%PRS1 , PAUX%PRSF1 , GEMSL%ZAEROP, GEMSL%ZCAERO, GEMSL%ZCEN , PAUX%PAPHIF, & + & FLUX%PFPLCL , FLUX%PFPLCN , FLUX%PFPLSL , FLUX%PFPLSN , PAUX%PGELAT, PAUX%PGELAM, & + & STATE%A , STATE%CLD(:,:,NCLDQI), STATE%CLD(:,:,NCLDQL), STATE%CLD(:,:,NCLDQR), & + & STATE%CLD(:,:,NCLDQS), PDIAG%PCOVPTOT, PDIAG%ZLU, & + & FLUX%PFCCQL,FLUX%PFCCQN,FLUX%PFCSQL,FLUX%PFCSQN, & + & ZO3 , STATE%Q , STATE%T , ZTH , GEMSL%ZTENC , GEMSL%ZCFLX , & + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERWS , GEMSL%ZAERGUST , GEMSL%ZAERUST, GEMSL%ZAERMAP, & + & GEMSL%ZCLAERS, GEMSL%ZPRAERS, PCHEM2AER, & + & SURFL%ZALBD , GEMSL%ZTAUAER, SURFL%ZFRTI , PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , & + & ZSNM , AUXL%ZWND , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , & + & GEMSL%ZAERFLX, GEMSL%ZAERLIF, & + & FLUX%PAERODDF, PSURF%PSD_VF(:,YSD_VF%YFCA1%MP),PSURF%PSD_VF(:,YSD_VF%YFCA2%MP),& + & TSPHY , PGFL , & + & PSURF%PSD_VD(:,YSD_VD%YODSS%MP), PSURF%PSD_VD(:,YSD_VD%YODDU%MP), & + & PSURF%PSD_VD(:,YSD_VD%YODOM%MP), PSURF%PSD_VD(:,YSD_VD%YODBC%MP), PSURF%PSD_VD(:,YSD_VD%YODSU%MP), & + & PSURF%PSD_VD(:,YSD_VD%YODNI%MP), PSURF%PSD_VD(:,YSD_VD%YODAM%MP), PSURF%PSD_VD(:,YSD_VD%YODSOA%MP), & + & PSURF%PSD_VD(:,YSD_VD%YODVFA%MP),PSURF%PSD_VD(:,YSD_VD%YODVSU%MP), PSURF%PSD_VD(:,YSD_VD%YODTOACC%MP),& + & PSURF%PSD_VD(:,YSD_VD%YAEPM1%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM25%MP),PSURF%PSD_VD(:,YSD_VD%YAEPM10%MP), & + & GEMSL%ZAERAOT, GEMSL%ZAERLISI, PSURF%PSD_XA, & + & ZAERO_WVL_DIAG ) + + CASE DEFAULT + + CALL ABOR1(" NO AEROSOL SCHEME "//TRIM(AERO_SCHEME) ) END SELECT +! RCHG: This can be improved to using a variable with a sensible name instead 6. +! (not about M7) DO JAER=1,6 DO JK=1,KDIM%KLEV DO JL=KDIM%KIDIA,KDIM%KFDIA diff --git a/ifs-source/arpifs/phys_ec/aer_rad.F90 b/ifs-source/arpifs/phys_ec/aer_rad.F90 index f978fab1..d72f4b6f 100644 --- a/ifs-source/arpifs/phys_ec/aer_rad.F90 +++ b/ifs-source/arpifs/phys_ec/aer_rad.F90 @@ -86,6 +86,7 @@ SUBROUTINE AER_RAD & LOGICAL :: LLPHYLIN !----------------------------------------------------------------------- +#include "abor1.intfb.h" #include "satur.intfb.h" REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -242,6 +243,9 @@ SUBROUTINE AER_RAD & ITYP=YAERO_DESC(JAER)%NTYP IBIN=YAERO_DESC(JAER)%NBIN + CASE ("hamm7") + CALL ABOR1(" AEROSOL SCHEME hamm7 not supported yet in UV-radiation processor" ) + END SELECT IF (ITYP <= 8) THEN diff --git a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 index 56e6f1f8..4158587c 100644 --- a/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 +++ b/ifs-source/arpifs/phys_ec/aer_so2so4_v2.F90 @@ -10,7 +10,7 @@ SUBROUTINE AER_SO2SO4_V2 & &( YDRIP, KIDIA , KFDIA , KLON , KLEV , & & PTSPHY, PTP , PRSF1 , PNEB , PQLI , PGELAT, PGELAM, & & PSO2 , PITSO2, POH, PO3, PH2O2 , & - & PTSO2 , PTSO4, PFSO2, PFSO4, PDP ) + & PTSO2 , PTSO4, PTSO4_AQ, PFSO2, PFSO4, PFSO4_AQ, PDP ) !*** *AER_SO2SO4_V2* - GAS-TO-PARTICLE (SULPHATE AEROSOLS) @@ -31,7 +31,8 @@ SUBROUTINE AER_SO2SO4_V2 & ! 28-Mar-2017 : in this test version, oxidants are not depleted ! reason: C-IFS climatologies are already depleted after S(iv) oxidation, thus input oxidants concentration ! can be considered as "background" concentrations, which should not be depleted during oxidation - +! 2026-05-14: Force computation in double precision, and modify condition to account for aqueous phase reaction, P. Le Sager (KNMI) +! ! FUTURE IMPROVEMENTS / To Do LIST ! -------------------------------- ! - check that SO2 (g) + OH (g) is the limiting step: see notebook p. 93 @@ -42,23 +43,19 @@ SUBROUTINE AER_SO2SO4_V2 & ! - notebook p. 24: oxidants limitation !----------------------------------------------------------------------- -USE PARKIND1 ,ONLY : JPIM ,JPRB -USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMRIP , ONLY : TRIP - -USE YOMCST ,ONLY : & - & RNAVO, & ! Avogadro number [mol**-1] - & R, & ! gas constant [J / K / mol] - & RD,RG ! dry air gas constant [J / K / kg] - +USE PARKIND1, ONLY : JPIM, JPRB, JPRD +USE YOMHOOK, ONLY : LHOOK, DR_HOOK, JPHOOK +USE YOMRIP, ONLY : TRIP +USE YOMCST, ONLY : & + & DR, & ! gas constant [J / K / mol] + & DRD, RG ! dry air gas constant [J / K / kg] IMPLICIT NONE - !* 0.1 ARGUMENTS ! --------- -TYPE(TRIP) ,INTENT(INOUT) :: YDRIP +TYPE(TRIP) ,INTENT(IN) :: YDRIP INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA INTEGER(KIND=JPIM),INTENT(IN) :: KLON @@ -75,13 +72,12 @@ SUBROUTINE AER_SO2SO4_V2 & REAL(KIND=JPRB) ,INTENT(IN) :: PSO2(KLON,KLEV) ! SO2 mass mixing ratio [kg / kg(air)] REAL(KIND=JPRB) ,INTENT(IN) :: PITSO2(KLON,KLEV) ! previous tendency for SO2 [kg / kg(air) / s] REAL(KIND=JPRB) ,INTENT(IN) :: POH(KLON,KLEV) ! oxidants [kg / kg] -REAL(KIND=JPRB) ,INTENT(IN) :: PH2O2(KLON,KLEV) ! oxidants [kg / kg] +REAL(KIND=JPRB) ,INTENT(IN) :: PH2O2(KLON,KLEV) ! oxidants [kg / kg] REAL(KIND=JPRB) ,INTENT(IN) :: PO3(KLON,KLEV) ! oxidants [kg / kg] REAL(KIND=JPRB) ,INTENT(IN) :: PDP(KLON,KLEV) - -REAL(KIND=JPRB) ,INTENT(INOUT) :: PTSO2(KLON,KLEV), PTSO4(KLON,KLEV) ! new tendencies [kg / kg(air) / s] -REAL(KIND=JPRB) ,INTENT(OUT) :: PFSO2(KLON), PFSO4(KLON) +REAL(KIND=JPRB) ,INTENT(OUT) :: PTSO2(KLON,KLEV), PTSO4(KLON,KLEV), PTSO4_AQ(KLON,KLEV) ! new tendencies [kg / kg(air) / s] +REAL(KIND=JPRB) ,INTENT(OUT) :: PFSO2(KLON), PFSO4(KLON), PFSO4_AQ(KLON) !* 0.3 LOCAL PARAMETERS @@ -91,98 +87,87 @@ SUBROUTINE AER_SO2SO4_V2 & ! Henry's law data ! !==================! ! reference temperature for Henry's law solubility coefficients [K] -REAL(KIND=JPRB), PARAMETER :: ZTREF_H = 298.15_JPRB +REAL(KIND=JPRD), PARAMETER :: ZTREF_H = 298.15_JPRD ! inverse reference temperature for Henry's law solubility coefficients, and some rate constants [K**-1] -REAL(KIND=JPRB), PARAMETER :: ZITREF_H = 1._JPRB / ZTREF_H +REAL(KIND=JPRD), PARAMETER :: ZITREF_H = 1._JPRD / ZTREF_H ! Henry's law solubility coefficients at T=Tref, and their temperature dependency (if relevant) -REAL(KIND=JPRB), PARAMETER :: ZHCP_H2O2_REF = 9.1E+2_JPRB ! H^cp(H2O2), Sander, ACP 2015 [mol/m3/Pa] -REAL(KIND=JPRB), PARAMETER :: ZHCP_H2O2_TD = 6600._JPRB ! temperature dependency for H^cp(H2O2) [K] -REAL(KIND=JPRB), PARAMETER :: ZHCP_O3_REF = 1.0E-4_JPRB ! H^cp(O3), Sander, ACP 2015 [mol/m3/Pa] -REAL(KIND=JPRB), PARAMETER :: ZHCP_O3_TD = 2800._JPRB ! temperature dependency for H^cp(O3) [K] -REAL(KIND=JPRB), PARAMETER :: ZHCP_OH_REF = 3.8E-1_JPRB ! H^cp(OH), Sander, ACP 2015 [mol/m3/Pa] -!REAL(KIND=JPRB), PARAMETER :: ZHCP_OH_TD = ! no temperature dependency for H^cp(OH) -REAL(KIND=JPRB), PARAMETER :: ZHCP_SO2_REF = 1.3E-2_JPRB ! H^cp(SO2), Sander, ACP 2015 [mol/m3/Pa] -REAL(KIND=JPRB), PARAMETER :: ZHCP_SO2_TD = 2100._JPRB ! temperature dependency for H^cp(SO2) [K] +REAL(KIND=JPRD), PARAMETER :: ZHCP_H2O2_REF = 9.1E+2_JPRD ! H^cp(H2O2), Sander, ACP 2015 [mol/m3/Pa] +REAL(KIND=JPRD), PARAMETER :: ZHCP_H2O2_TD = 6600._JPRD ! temperature dependency for H^cp(H2O2) [K] +REAL(KIND=JPRD), PARAMETER :: ZHCP_O3_REF = 1.0E-4_JPRD ! H^cp(O3), Sander, ACP 2015 [mol/m3/Pa] +REAL(KIND=JPRD), PARAMETER :: ZHCP_O3_TD = 2800._JPRD ! temperature dependency for H^cp(O3) [K] +REAL(KIND=JPRD), PARAMETER :: ZHCP_OH_REF = 3.8E-1_JPRD ! H^cp(OH), Sander, ACP 2015 [mol/m3/Pa] +!REAL(KIND=JPRD), PARAMETER :: ZHCP_OH_TD = ! no temperature dependency for H^cp(OH) +REAL(KIND=JPRD), PARAMETER :: ZHCP_SO2_REF = 1.3E-2_JPRD ! H^cp(SO2), Sander, ACP 2015 [mol/m3/Pa] +REAL(KIND=JPRD), PARAMETER :: ZHCP_SO2_TD = 2100._JPRD ! temperature dependency for H^cp(SO2) [K] !=================================! ! Acid-base equilibrium constants ! !=================================! ! Keq_1(SO2(aq)<=>HSO3-) Seinfeld & Pandis, 1998, table 6.A.1 p.394 -REAL(KIND=JPRB), PARAMETER :: ZKEQ1_SO2_REF = 1.3E-2_JPRB ! Keq_1(SO2(aq)<=>HSO3-) at T=Tref [mol / L] -REAL(KIND=JPRB), PARAMETER :: ZKEQ1_SO2_TD = 1960._JPRB ! temperature dependency for Keq_1 [K] +REAL(KIND=JPRD), PARAMETER :: ZKEQ1_SO2_REF = 1.3E-2_JPRD ! Keq_1(SO2(aq)<=>HSO3-) at T=Tref [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZKEQ1_SO2_TD = 1960._JPRD ! temperature dependency for Keq_1 [K] ! Keq_2(HSO3-<=>SO3=) Seinfeld & Pandis, 1998, table 6.A.1 p.394 -REAL(KIND=JPRB), PARAMETER :: ZKEQ2_SO2_REF = 6.6E-8_JPRB ! Keq_2(HSO3-<=>SO3=) at T=Tref [mol / L] -REAL(KIND=JPRB), PARAMETER :: ZKEQ2_SO2_TD = 1500._JPRB ! temperature dependency for Keq_2 [K] +REAL(KIND=JPRD), PARAMETER :: ZKEQ2_SO2_REF = 6.6E-8_JPRD ! Keq_2(HSO3-<=>SO3=) at T=Tref [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZKEQ2_SO2_TD = 1500._JPRD ! temperature dependency for Keq_2 [K] !=========================! ! Reaction rate constants ! !=========================! -! +! Avogadro number - Copied from YOMCST because you can't create parameters from protected variables +REAL(KIND=JPRD), PARAMETER :: ZNAVO=6.0221367E+23_JPRD ! [mol**-1] ! conversion factor, multiply by ZCONV1 to convert cm**3/molec into m**3/mol -!REAL(KIND=JPRB), PARAMETER :: ZCONV1 = 1.E-6_JPRB * RNAVO ! doesn't work, cf comment above -!REAL(KIND=JPRB) :: ZCONV1 = 1.E-6_JPRB * RNAVO ! doesn't work, cf comment above -REAL(KIND=JPRB) :: ZCONV1 -! conversion factor, multiply by ZCONV3 to convert L into m3 -! for instance, 2nd order reaction rate in aqueous phase [L / mol / s] into SI units [m3 / mol / s] -REAL(KIND=JPRB) :: ZCONV3 = 1.E-3_JPRB ! [m**3 / L] - +!REAL(KIND=JPRD), PARAMETER :: ZCONV1 = 1.E-6_JPRD * ZNAVO ! [m3 / cm3 / mol] +REAL(KIND=JPRD), PARAMETER :: ZCONV1 = 6.0221367E+17_JPRD ! [m3 / cm3 / mol] ! k_OH reaction rate, low pressure limit, at 300 K, converted in [m**6 / (mol**2 * s)] -!REAL(KIND=JPRB), PARAMETER :: ZKOH_LOW300 = 3.3E-31_JPRB * ZCONV1 * ZCONV1 ! doesn't work, cf comment above -!REAL(KIND=JPRB) :: ZKOH_LOW300 = 3.3E-31_JPRB * ZCONV1 * ZCONV1 ! doesn't work, cf comment above -REAL(KIND=JPRB) :: ZKOH_LOW300 +!REAL(KIND=JPRD), PARAMETER :: ZKOH_LOW300 = 3.3E-31_JPRD * ZCONV1 * ZCONV1 ! now in [m**6 / mol**2 / s] +REAL(KIND=JPRD), PARAMETER :: ZKOH_LOW300 = 119.678230431E+3_JPRD ! now in [m**6 / mol**2 / s] + ! k_OH reaction rate, high pressure limit, no temp. dependency, converted in [m**3 / (mol * s)] -!REAL(KIND=JPRB), PARAMETER :: ZKOH_HIGH = 1.6E-12_JPRB * ZCONV1 ! doesn't work, cf comment above -!REAL(KIND=JPRB) :: ZKOH_HIGH = 1.6E-12_JPRB * ZCONV1 ! doesn't work, cf comment above -REAL(KIND=JPRB) :: ZKOH_HIGH +REAL(KIND=JPRD), PARAMETER :: ZKOH_HIGH = 1.6E-12_JPRD * ZCONV1 ! now in [m**3 / mol / s] +! conversion factor, multiply by ZCONV3 to convert L into m3 +! for instance, 2nd order reaction rate in aqueous phase [L / mol / s] into SI units [m3 / mol / s] +REAL(KIND=JPRD) :: ZCONV3 = 1.E-3_JPRD ! [m**3 / L] ! Reaction rate constant k_(S(iv)+H2O2(aq)) Seinfeld & Pandis, 1998, pp.366, 378, and 396 ! second one: see for instance Berglen et al 2004, JGR vol. 109, D19310 ! Notice the different units! ! note: in S & P, there is a mistake on the unit of k, which is a 3rd order rate constant (not a 2nd order) INTEGER(KIND=JPIM), PARAMETER :: IKH2O2_select = 1 ! Case selector, choose one of the following kinetics -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_REF_v1 = 7.5E+7_JPRB ! k_(S(iv)+H2O2) at Tref=298.15 K [L**2 / mol**2 / s] -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_TD_v1 = -4430._JPRB ! temperature dependency [K] -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_REF_v2 = 8.0E+4_JPRB ! k_(S(iv)+H2O2) at Tref=298.15 K [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKH2O2_TD_v2 = -3650._JPRB ! temperature dependency [K] - - +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_REF_v1 = 7.5E+7_JPRD ! k_(S(iv)+H2O2) at Tref=298.15 K [L**2 / mol**2 / s] +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_TD_v1 = -4430._JPRD ! temperature dependency [K] +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_REF_v2 = 8.0E+4_JPRD ! k_(S(iv)+H2O2) at Tref=298.15 K [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKH2O2_TD_v2 = -3650._JPRD ! temperature dependency [K] ! Reaction rate constants O3(aq) + S(iv)(aq) is split in 3 parts (reaction with SO2(aq), HSO3-(aq) and SO3=(aq) -REAL(KIND=JPRB), PARAMETER :: ZKO3_REF1 = 2.4E+4_JPRB ! k_(SO2(aq))+O3(aq)) [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKO3_REF2 = 3.7E+5_JPRB ! k_(HSO3-(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKO3_TD2 = -5530._JPRB ! temperature dependency [K] -REAL(KIND=JPRB), PARAMETER :: ZKO3_REF3 = 1.5E+9_JPRB ! k_(SO3=(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] -REAL(KIND=JPRB), PARAMETER :: ZKO3_TD3 = -5280._JPRB ! temperature dependency [K] - +REAL(KIND=JPRD), PARAMETER :: ZKO3_REF1 = 2.4E+4_JPRD ! k_(SO2(aq))+O3(aq)) [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKO3_REF2 = 3.7E+5_JPRD ! k_(HSO3-(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKO3_TD2 = -5530._JPRD ! temperature dependency [K] +REAL(KIND=JPRD), PARAMETER :: ZKO3_REF3 = 1.5E+9_JPRD ! k_(SO3=(aq))+O3(aq)) at Tref=298.15 K [L / mol / s] +REAL(KIND=JPRD), PARAMETER :: ZKO3_TD3 = -5280._JPRD ! temperature dependency [K] !==============! ! Molar masses ! !==============! -!REAL(KIND=JPRB), PARAMETER :: ZRMD = 28.9644E-3_JPRB ! air molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMH2O2 = 34.0147E-3_JPRB ! H2O2 molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMO3 = 47.9982E-3_JPRB ! O3 molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMOH = 17.008E-3_JPRB ! OH molar mass [kg / mol] -REAL(KIND=JPRB), PARAMETER :: ZRMSO2 = 64.056E-3_JPRB ! SO2 molar mass [kg / mol] ! jjb quick fix: change unit in sucst.F90 -REAL(KIND=JPRB), PARAMETER :: ZRMSO4 = 96.052E-3_JPRB ! SO4= molar mass [kg / mol] +!REAL(KIND=JPRD), PARAMETER :: ZRMD = 28.9644E-3_JPRD ! air molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMH2O2 = 34.0147E-3_JPRD ! H2O2 molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMO3 = 47.9982E-3_JPRD ! O3 molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMOH = 17.008E-3_JPRD ! OH molar mass [kg / mol] +REAL(KIND=JPRD), PARAMETER :: ZRMSO2 = 64.056E-3_JPRD ! SO2 molar mass [kg / mol] ! jjb quick fix: change unit in sucst.F90 +REAL(KIND=JPRD), PARAMETER :: ZRMSO4 = 96.052E-3_JPRD ! SO4= molar mass [kg / mol] ! Other parameters ! ---------------- -REAL(KIND=JPRB), PARAMETER :: ZRHOLW = 1000._JPRB ! liquid water density [kg / m3] - -!REAL(KIND=JPRB), PARAMETER :: ZPH = 5._JPRB ! pH of cloud liquid water, assumed -REAL(KIND=JPRB), PARAMETER :: ZHP = 1.0E-5_JPRB ! proton concentration [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZRHOLW = 1000._JPRD ! liquid water density [kg / m3] -REAL(KIND=JPRB), PARAMETER :: ZPTSCHEM = 2._JPRB ! timestep for chemistry [s] +!REAL(KIND=JPRD), PARAMETER :: ZPH = 5._JPRD ! pH of cloud liquid water, assumed +REAL(KIND=JPRD), PARAMETER :: ZHP = 1.0E-5_JPRD ! proton concentration [mol / L] +REAL(KIND=JPRD), PARAMETER :: ZPTSCHEM = 2._JPRD ! timestep for chemistry [s] !* 0.5 LOCAL VARIABLES @@ -192,174 +177,195 @@ SUBROUTINE AER_SO2SO4_V2 & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -! jjb -! -REAL(KIND=JPRB) :: ZTEMPERAT ! grid cell temperature [K] -REAL(KIND=JPRB) :: ZPRESSURE ! grid cell pressure [Pa] +REAL(KIND=JPRD) :: ZTEMPERAT ! grid cell temperature [K] +REAL(KIND=JPRD) :: ZPRESSURE ! grid cell pressure [Pa] -REAL(KIND=JPRB) :: ZAIR_CONC ! air concentration [mol / m3] -REAL(KIND=JPRB) :: ZAIR_DENS ! air density [kg / m3] +REAL(KIND=JPRD) :: ZAIR_CONC ! air concentration [mol / m3] +REAL(KIND=JPRD) :: ZAIR_DENS ! air density [kg / m3] -REAL(KIND=JPRB) :: ZCLW_VFRAC ! volume fraction of cloud liquid water [m3(aq) / m3(g)] +REAL(KIND=JPRD) :: ZCLW_VFRAC ! volume fraction of cloud liquid water [m3(aq) / m3(g)] ! conversion factor, ZCONV2 = R * T. Multiply by ZCONV2 to convert H^cp (in mol/m3/Pa) into H^cc (in m3(g) / m3(aq)) -REAL(KIND=JPRB) :: ZCONV2 ! [J/mol] - -! Oxidants concentrations. Local arrays to split PCHEMSULF1 - -REAL(KIND=JPRB) :: ZFACT1 ! intermediate factor 1 -REAL(KIND=JPRB) :: ZFACT2 ! intermediate factor 2 - -REAL(KIND=JPRB) :: ZFAQ_H2O2 ! fraction of H2O2 dissolved in aqueous phase [dimensionless] -REAL(KIND=JPRB) :: ZFAQ_O3 ! fraction of O3 dissolved in aqueous phase [dimensionless] -REAL(KIND=JPRB) :: ZFAQ_OH ! fraction of OH dissolved in aqueous phase [dimensionless] -REAL(KIND=JPRB) :: ZFAQ_SO2 ! fraction of SO2 dissolved in aqueous phase [dimensionless] - -REAL(KIND=JPRB) :: ZHCC_H2O2 ! dimensionless Henry's law solubility for H2O2 [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_O3 ! dimensionless Henry's law solubility for O3 [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_OH ! dimensionless Henry's law solubility for OH [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_SO2 ! dimensionless Henry's law solubility for SO2 [m3(g) / m3(aq)] -REAL(KIND=JPRB) :: ZHCC_SO2_EFF ! dimensionless Henry's law effective solubility for SO2 [m3(g) / m3(aq)] - -REAL(KIND=JPRB) :: ZKEQ1_SO2 ! equilibrium constant SO2(aq) <=> HSO3- [mol / L] -REAL(KIND=JPRB) :: ZKEQ2_SO2 ! equilibrium constant HSO3- <=> SO3= [mol / L] -REAL(KIND=JPRB) :: ZKEQ1_FACT -REAL(KIND=JPRB) :: ZKEQ2_FACT - -REAL(KIND=JPRB) :: ZKOH_LOW ! low pressure limit = f(T) [m**6 / (mol**2 * s)] -REAL(KIND=JPRB) :: ZKOH ! gas phase reaction rate SO2 + OH [m**3 / (mol * s)] -!REAL(KIND=JPRB) :: ZKPOH ! modified gas phase reaction rate SO2 + OH including OH and SO2 gas fractions [m**3 / (mol * s)] - -REAL(KIND=JPRB) :: ZKH2O2 ! Reaction rate constant k_(S(iv)+H2O2(aq)) [mol**2 / L**2 / s] - -REAL(KIND=JPRB) :: ZKO3_1 ! Reaction rate constant k_(O3+SO2(aq)) (T) [mol / m3 / s] -REAL(KIND=JPRB) :: ZKO3_2 ! Reaction rate constant k_(O3+HSO3-(aq)) (T) [mol / m3 / s] -REAL(KIND=JPRB) :: ZKO3_3 ! Reaction rate constant k_(O3+SO3--(aq)) (T) [mol / m3 / s] - -REAL(KIND=JPRB) :: ZTFACT ! temperature factor for Henry's law solubility calculation [K**-1] - -REAL(KIND=JPRB) :: ZC_H2O2_gas ! concentration of H2O2 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_O3_gas ! concentration of O3 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_OH_gas ! concentration of OH in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_SO2_gas ! concentration of SO2 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_SO2_tot ! total concentration of SO2 [mol/m3(air)] - -REAL(KIND=JPRB) :: ZC_H2O2_gas_ini ! initial concentration of H2O2 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_O3_gas_ini ! initial concentration of O3 in the gas phase [mol/m3(air)] -REAL(KIND=JPRB) :: ZC_OH_gas_ini ! initial concentration of OH in the gas phase [mol/m3(air)] - -REAL(KIND=JPRB) :: ZC_H2O2_aqp ! "potential" concentration of H2O2 in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_O3_aqp ! "potential" concentration of O3 in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_Siv_aqp ! "potential" concentration of S(iv) in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_SO2_aqp ! "potential" concentration of SO2 in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_HSO3m_aqp ! "potential" concentration of HSO3- in the aqueous phase [mol/m3(aq)] -REAL(KIND=JPRB) :: ZC_SO3mm_aqp ! "potential" concentration of SO3= in the aqueous phase [mol/m3(aq)] - -REAL(KIND=JPRB) :: ZTend_OH ! tendency for S(iv) + OH(g) [mol/m3(air)] -REAL(KIND=JPRB) :: ZTend_H2O2 ! tendency for S(iv) + H2O2(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3 ! tendency for S(iv) + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_r1 ! tendency for SO2(aq) + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_r2 ! tendency for HS03m + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_r3 ! tendency for SO3mm + O3(aq) [mol/m3(air)] <== final unit -REAL(KIND=JPRB) :: ZTend_O3_ul ! unlimited -REAL(KIND=JPRB) :: ZTend_O3_li ! limited -REAL(KIND=JPRB) :: ZLimit_fact_O3 -REAL(KIND=JPRB) :: ZSum_HSO3m_ox_ul -REAL(KIND=JPRB) :: ZSum_HSO3m_ox_li -REAL(KIND=JPRB) :: ZLimit_fact_HSO3m -!REAL(KIND=JPRB) :: ZTend_TOT_1 ! tendency for S(iv) --> S(vi) including oxidants and "branch-specific" S(iv) limitation -!REAL(KIND=JPRB) :: ZTend_TOT_2 ! tendency for S(iv) --> S(vi) further including total S(iv) limitation -REAL(KIND=JPRB) :: ZTend_H2O2_Sum ! -REAL(KIND=JPRB) :: ZTend_O3_Sum ! -REAL(KIND=JPRB) :: ZTend_OH_Sum ! -REAL(KIND=JPRB) :: ZTend_Gas ! -REAL(KIND=JPRB) :: ZTend_Aq ! -REAL(KIND=JPRB) :: ZTend_Aq_Sum ! -REAL(KIND=JPRB) :: ZTend_Sum ! - -REAL(KIND=JPRB) :: ZPNEB, ZSCALEO3(KLON), ZSCALEOH(KLON) - -REAL(KIND=JPRB) :: ZmmrH2O2 -REAL(KIND=JPRB) :: ZmmrO3 -REAL(KIND=JPRB) :: ZmmrOH -REAL(KIND=JPRB) :: ZmmrSO2 +REAL(KIND=JPRD) :: ZCONV2 ! [J/mol] + +! Oxidants concentrations + +REAL(KIND=JPRD) :: ZFACT1 ! intermediate factor 1 +REAL(KIND=JPRD) :: ZFACT2 ! intermediate factor 2 + +REAL(KIND=JPRD) :: ZFAQ_H2O2 ! fraction of H2O2 dissolved in aqueous phase [dimensionless] +REAL(KIND=JPRD) :: ZFAQ_O3 ! fraction of O3 dissolved in aqueous phase [dimensionless] +REAL(KIND=JPRD) :: ZFAQ_OH ! fraction of OH dissolved in aqueous phase [dimensionless] +REAL(KIND=JPRD) :: ZFAQ_SO2 ! fraction of SO2 dissolved in aqueous phase [dimensionless] + +REAL(KIND=JPRD) :: ZHCC_H2O2 ! dimensionless Henry's law solubility for H2O2 [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_O3 ! dimensionless Henry's law solubility for O3 [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_OH ! dimensionless Henry's law solubility for OH [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_SO2 ! dimensionless Henry's law solubility for SO2 [m3(g) / m3(aq)] +REAL(KIND=JPRD) :: ZHCC_SO2_EFF ! dimensionless Henry's law effective solubility for SO2 [m3(g) / m3(aq)] + +REAL(KIND=JPRD) :: ZKEQ1_SO2 ! equilibrium constant SO2(aq) <=> HSO3- [mol / L] +REAL(KIND=JPRD) :: ZKEQ2_SO2 ! equilibrium constant HSO3- <=> SO3= [mol / L] +REAL(KIND=JPRD) :: ZKEQ1_FACT +REAL(KIND=JPRD) :: ZKEQ2_FACT + +REAL(KIND=JPRD) :: ZKOH_LOW ! low pressure limit = f(T) [m**6 / (mol**2 * s)] +REAL(KIND=JPRD) :: ZKOH ! gas phase reaction rate SO2 + OH [m**3 / (mol * s)] +!REAL(KIND=JPRD) :: ZKPOH ! modified gas phase reaction rate SO2 + OH including OH and SO2 gas fractions [m**3 / (mol * s)] + +REAL(KIND=JPRD) :: ZKH2O2 ! Reaction rate constant k_(S(iv)+H2O2(aq)) [mol**2 / L**2 / s] + +REAL(KIND=JPRD) :: ZKO3_1 ! Reaction rate constant k_(O3+SO2(aq)) (T) [mol / m3 / s] +REAL(KIND=JPRD) :: ZKO3_2 ! Reaction rate constant k_(O3+HSO3-(aq)) (T) [mol / m3 / s] +REAL(KIND=JPRD) :: ZKO3_3 ! Reaction rate constant k_(O3+SO3--(aq)) (T) [mol / m3 / s] + +REAL(KIND=JPRD) :: ZTFACT ! temperature factor for Henry's law solubility calculation [K**-1] + +REAL(KIND=JPRD) :: ZC_H2O2_gas ! concentration of H2O2 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_O3_gas ! concentration of O3 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_OH_gas ! concentration of OH in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_SO2_gas ! concentration of SO2 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_SO2_tot ! total concentration of SO2 [mol/m3(air)] + +REAL(KIND=JPRD) :: ZC_H2O2_gas_ini ! initial concentration of H2O2 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_O3_gas_ini ! initial concentration of O3 in the gas phase [mol/m3(air)] +REAL(KIND=JPRD) :: ZC_OH_gas_ini ! initial concentration of OH in the gas phase [mol/m3(air)] + +REAL(KIND=JPRD) :: ZC_H2O2_aqp ! "potential" concentration of H2O2 in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_O3_aqp ! "potential" concentration of O3 in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_Siv_aqp ! "potential" concentration of S(iv) in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_SO2_aqp ! "potential" concentration of SO2 in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_HSO3m_aqp ! "potential" concentration of HSO3- in the aqueous phase [mol/m3(aq)] +REAL(KIND=JPRD) :: ZC_SO3mm_aqp ! "potential" concentration of SO3= in the aqueous phase [mol/m3(aq)] + +REAL(KIND=JPRD) :: ZTend_OH ! tendency for S(iv) + OH(g) [mol/m3(air)] +REAL(KIND=JPRD) :: ZTend_H2O2 ! tendency for S(iv) + H2O2(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3 ! tendency for S(iv) + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_r1 ! tendency for SO2(aq) + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_r2 ! tendency for HS03m + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_r3 ! tendency for SO3mm + O3(aq) [mol/m3(air)] <== final unit +REAL(KIND=JPRD) :: ZTend_O3_ul ! unlimited +REAL(KIND=JPRD) :: ZTend_O3_li ! limited +REAL(KIND=JPRD) :: ZLimit_fact_O3 +REAL(KIND=JPRD) :: ZSum_HSO3m_ox_ul +REAL(KIND=JPRD) :: ZSum_HSO3m_ox_li +REAL(KIND=JPRD) :: ZLimit_fact_HSO3m +!REAL(KIND=JPRD) :: ZTend_TOT_1 ! tendency for S(iv) --> S(vi) including oxidants and "branch-specific" S(iv) limitation +!REAL(KIND=JPRD) :: ZTend_TOT_2 ! tendency for S(iv) --> S(vi) further including total S(iv) limitation +REAL(KIND=JPRD) :: ZTend_H2O2_Sum ! +REAL(KIND=JPRD) :: ZTend_O3_Sum ! +REAL(KIND=JPRD) :: ZTend_OH_Sum ! +REAL(KIND=JPRD) :: ZTend_Gas ! +REAL(KIND=JPRD) :: ZTend_Aq ! +REAL(KIND=JPRD) :: ZTend_Aq_Sum ! +REAL(KIND=JPRD) :: ZTend_Sum ! + +REAL(KIND=JPRB) :: ZSCALEO3(KLON), ZSCALEOH(KLON) +REAL(KIND=JPRD) :: ZPNEB, DSCALEO3(KLON), DSCALEOH(KLON) + +REAL(KIND=JPRD) :: ZmmrH2O2 +REAL(KIND=JPRD) :: ZmmrO3 +REAL(KIND=JPRD) :: ZmmrOH +REAL(KIND=JPRD) :: ZmmrSO2 INTEGER(KIND=JPIM) :: JPTS ! Number of sub-timesteps for chemistry INTEGER(KIND=JPIM) :: JTS ! Running index for chemistry do-loop -#include "compo_diurnal.intfb.h" +! Recast input/output +REAL(KIND=JPRD) :: ZTSPHY +REAL(KIND=JPRD) :: ZSO2, ZITSO2, ZOH, ZO3, ZH2O2 +REAL(KIND=JPRD) :: ZTSO2(KLON,KLEV), ZTSO4(KLON,KLEV), ZTSO4_AQ(KLON,KLEV) + +REAL(KIND=JPRD) :: ZRPI, ZLTRAD(KLON) + +!PLS #include "compo_diurnal.intfb.h" !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_SO2SO4_V2',0,ZHOOK_HANDLE) -! Initialisation of "parameters" that cannot be initialised in the declaration part (cf. remarks above) -ZCONV1 = 1.E-6_JPRB * RNAVO ! [m3 / cm3 / mol] -ZKOH_LOW300 = 3.3E-31_JPRB * ZCONV1 * ZCONV1 ! now in [m**6 / mol**2 / s] -ZKOH_HIGH = 1.6E-12_JPRB * ZCONV1 ! now in [m**3 / mol / s] ! Define the number of intermediate timesteps for chemistry -IF(MODULO(PTSPHY,ZPTSCHEM) > 0._JPRB) THEN +ZTSPHY = REAL(PTSPHY, KIND=JPRD) +IF(MODULO(ZTSPHY,ZPTSCHEM) > 0._JPRD) THEN CALL ABOR1('ABORT: IN AER_SO2SO4_V2, ZPTSCHEM must divide PTSTEMP') ENDIF -JPTS = INT(PTSPHY/ZPTSCHEM) - - -! Split PCHEMSULF1 array - -!! Initialise tendencies (necessary when using sub-timesteps for chemistry, -!! since the total tendency will be the sum of "sub-tendencies" -PTSO2(:,:) = 0._JPRB -PTSO4(:,:) = 0._JPRB - -CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEOH, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) -CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEO3, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) +JPTS = INT(ZTSPHY/ZPTSCHEM) + +! Initialise tendencies (necessary when using sub-timesteps for chemistry, +! since the total tendency will be the sum of "sub-tendencies") +ZTSO2(KIDIA:KFDIA,:) = 0._JPRD +ZTSO4(KIDIA:KFDIA,:) = 0._JPRD +ZTSO4_AQ(KIDIA:KFDIA,:) = 0._JPRD + +!PLS CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEOH, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) +!PLS CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, 'Sine', PGELAM, PGELAT, ZSCALEO3, PAMPLITUDE=0.7_JPRB, PHOURPEAK=15.0_JPRB) +!PLS DO JL=KIDIA,KFDIA +!PLS DSCALEOH(JL) = REAL(ZSCALEOH(JL), KIND=JPRD) +!PLS DSCALEO3(JL) = REAL(ZSCALEO3(JL), KIND=JPRD) +!PLS ENDDO + +! Diurnal cycle in JPRD precision +ZRPI=2.0_JPRD*ASIN(1.0_JPRD) +ZLTRAD(KIDIA:KFDIA) = REAL( (YDRIP%RWSOVR + PGELAM(KIDIA:KFDIA)), KIND=JPRD) +DSCALEOH(KIDIA:KFDIA) = 1.0_JPRD + COS(ZLTRAD(KIDIA:KFDIA) - 15.0_JPRD/12.0_JPRD * ZRPI) * 0.7_JPRD +DSCALEO3(KIDIA:KFDIA) = DSCALEOH(KIDIA:KFDIA) DO JK=1,KLEV DO JL=KIDIA,KFDIA - ! Initialise all scalar variables to 0._JPRB (for debug only) - ZmmrH2O2 = 0._JPRB - ZmmrO3 = 0._JPRB - ZC_H2O2_gas = 0._JPRB - ZC_O3_gas = 0._JPRB - ZFAQ_H2O2 = 0._JPRB - ZFAQ_O3 = 0._JPRB - ZFAQ_OH = 0._JPRB - ZFAQ_SO2 = 0._JPRB - ZHCC_H2O2 = 0._JPRB - ZHCC_OH = 0._JPRB - ZHCC_O3 = 0._JPRB - ZHCC_SO2 = 0._JPRB - ZHCC_SO2_EFF = 0._JPRB - ZTend_OH_Sum = 0._JPRB - ZTend_Gas = 0._JPRB - ZTend_Aq = 0._JPRB - ZTend_O3_Sum = 0._JPRB - ZTend_H2O2_Sum = 0._JPRB + ! Initialise all scalar variables to 0._JPRD (for debug only) + ZmmrH2O2 = 0._JPRD + ZmmrO3 = 0._JPRD + ZC_H2O2_gas = 0._JPRD + ZC_O3_gas = 0._JPRD + ZFAQ_H2O2 = 0._JPRD + ZFAQ_O3 = 0._JPRD + ZFAQ_OH = 0._JPRD + ZFAQ_SO2 = 0._JPRD + ZHCC_H2O2 = 0._JPRD + ZHCC_OH = 0._JPRD + ZHCC_O3 = 0._JPRD + ZHCC_SO2 = 0._JPRD + ZHCC_SO2_EFF = 0._JPRD + ZTend_OH_Sum = 0._JPRD + ZTend_Gas = 0._JPRD + ZTend_Aq = 0._JPRD + ZTend_O3_Sum = 0._JPRD + ZTend_H2O2_Sum = 0._JPRD ! -- Miscellaneous variables + ! -- pressure and temperature copied in scalars - ZPRESSURE = PRSF1(JL,JK) - ZTEMPERAT = PTP (JL,JK) + ZPRESSURE = REAL(PRSF1(JL,JK), KIND=JPRD) + ZTEMPERAT = REAL(PTP(JL,JK), KIND=JPRD) + ! -- air concentration and density - ZAIR_CONC = ZPRESSURE / (R *ZTEMPERAT) ! [mol / m3] - ZAIR_DENS = ZPRESSURE / (RD*ZTEMPERAT) ! [kg / m3] + ZAIR_CONC = ZPRESSURE / (DR *ZTEMPERAT) ! [mol / m3] + ZAIR_DENS = ZPRESSURE / (DRD*ZTEMPERAT) ! [kg / m3] + ! -- fractional cloudiness - ZPNEB = PNEB(JL,JK) - ! -- liquid volume fraction in the cloudy part [m3(aq) / m3(g)] + ZPNEB = REAL(PNEB(JL,JK), KIND=JPRD) - ZCLW_VFRAC = 0._JPRB - IF (ZPNEB > 1.0E-12_JPRB) THEN - ZCLW_VFRAC = PQLI(JL,JK) / ZPNEB * ZAIR_DENS / ZRHOLW + ! -- liquid volume fraction in the cloudy part [m3(aq) / m3(g)] + ZCLW_VFRAC = 0._JPRD + ! Note: The smallest cloud fraction PNEB is ~1e-8 in JPRD, and ~1e-12 in JPRB [2-day tests at TL255L91] + ! The latter (and values below ~1.e-9) can create unrealistic large ZCLW_VFRAC. + IF (ZPNEB > 1.0E-6_JPRD) THEN + ZCLW_VFRAC = REAL(PQLI(JL,JK), KIND=JPRD) / ZPNEB * ZAIR_DENS / ZRHOLW ENDIF + ! Cast other input into double precision + ZSO2 = REAL(PSO2 (JL,JK), KIND=JPRD) + ZITSO2 = REAL(PITSO2(JL,JK), KIND=JPRD) + ZOH = REAL(POH (JL,JK), KIND=JPRD) + ZO3 = REAL(PO3 (JL,JK), KIND=JPRD) + ZH2O2 = REAL(PH2O2 (JL,JK), KIND=JPRD) - !write (*,*) "SO2SO4",JL,JK,ZPNEB,ZCLW_VFRAC,POH(JL,JK),PO3(JL,JK),PH2O2(JL,JK) !======================================================================= ! Two cases: ! - gas phase reaction only (if no cloud, or no liquid water) ! - gas + aqueous phase reactions !======================================================================= - IF (.NOT.(ZPNEB > 1.0E-12_JPRB )) THEN ! 1.0E-12 is the default PNEB value + IF ( ZCLW_VFRAC < 1.0E-10_JPRD ) THEN !======================================================================= ! GAS PHASE ONLY: @@ -367,28 +373,25 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- Reactants concentration (gas phase only) ! -- mmr [kg / kg] - IF (POH(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrOH = POH(JL,JK)*ZSCALEOH(JL) + IF (ZOH > 1.0E-14_JPRD ) THEN + ZmmrOH = ZOH * DSCALEOH(JL) ELSE - ZmmrOH = 0.0_JPRB + ZmmrOH = 0.0_JPRD ENDIF - ZmmrSO2 = PSO2(JL,JK) + PTSPHY * PITSO2(JL,JK) + ZmmrSO2 = ZSO2 + ZTSPHY * ZITSO2 ! -- gas phase concentration [mol / m3] ZC_OH_gas = ZmmrOH * ZAIR_DENS / ZRMOH ! OH concentration from climatology is a gas concentration ZC_SO2_tot = ZmmrSO2 * ZAIR_DENS / ZRMSO2 ! SO2 concentration : in this case, ZC_SO2_gas = ZC_SO2_tot ZC_SO2_gas = ZC_SO2_tot - IF (ZC_OH_gas < 1E-18_JPRB) THEN - ZC_OH_gas=0._JPRB - ENDIF - IF (ZC_SO2_gas < 1E-18_JPRB) THEN - ZC_SO2_gas=0._JPRB + IF (ZC_OH_gas < 1E-18_JPRD) THEN + ZC_OH_gas=0._JPRD ENDIF - IF (ZC_SO2_tot < 1E-18_JPRB) THEN - ZC_SO2_tot=0._JPRB + IF (ZC_SO2_gas < 1E-18_JPRD) THEN + ZC_SO2_gas=0._JPRD + ZC_SO2_tot=0._JPRD ENDIF - ZC_OH_gas_ini = ZC_OH_gas ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -397,20 +400,19 @@ SUBROUTINE AER_SO2SO4_V2 & ! reference: JPL Pub. 15-10, Eval Nb 18 ! low pressure limit depends on temperature - ZKOH_LOW = ZKOH_LOW300 * (300._JPRB / ZTEMPERAT)**4.3_JPRB + ZKOH_LOW = ZKOH_LOW300 * (300._JPRD / ZTEMPERAT)**4.3_JPRD ! complete expression: see doc ZFACT1 = ZKOH_LOW * ZAIR_CONC ZFACT2 = ZFACT1 / ZKOH_HIGH - ZKOH = ZFACT1 / (1._JPRB + ZFACT2) - ZKOH = ZKOH * .6_JPRB ** (1._JPRB / (1._JPRB + LOG10(ZFACT2)**2) ) + ZKOH = ZFACT1 / (1._JPRD + ZFACT2) + ZKOH = ZKOH * .6_JPRD ** (1._JPRD / (1._JPRD + LOG10(ZFACT2)**2) ) ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - IF (ZKOH < 1E-18_JPRB) THEN - ZKOH=0._JPRB + IF (ZKOH < 1E-18_JPRD) THEN + ZKOH=0._JPRD ENDIF - DO JTS=1,JPTS ! -- ZTend_OH [mol / m3(air)] @@ -428,9 +430,9 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- PT(xxx) in [kg(xxx) / kg(air) / s] ! using PTSPHY=sum(ZPTSCHEM) - PTSO2(JL,JK) = PTSO2(JL,JK) - ZTend_OH_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY - PTSO4(JL,JK) = PTSO4(JL,JK)+ ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY - + ZTSO2(JL,JK) = ZTSO2(JL,JK) - ZTend_OH_Sum * ZRMSO2 / ZAIR_DENS / ZTSPHY + ZTSO4(JL,JK) = ZTSO4(JL,JK)+ ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / ZTSPHY + ZTSO4_AQ(JL,JK) = 0._JPRD ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -442,13 +444,13 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- Miscellaneous variables only used in aqueous phase ! -- temperature factor for Henry's law and reaction rates - ZTFACT = 1._JPRB / ZTEMPERAT - ZITREF_H + ZTFACT = 1._JPRD / ZTEMPERAT - ZITREF_H ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ! -- dimensionless Henry's law solubility constants [m3(g) / m3(aq)] ! -- Conversion factor, to get dimensionless Henry coefficients (H^cc) - ZCONV2 = R * ZTEMPERAT + ZCONV2 = DR * ZTEMPERAT ! -- of H2O2 ZHCC_H2O2 = ZHCP_H2O2_REF * EXP(ZHCP_H2O2_TD * ZTFACT) * ZCONV2 @@ -469,35 +471,35 @@ SUBROUTINE AER_SO2SO4_V2 & ZKEQ1_FACT = ZKEQ1_SO2 / ZHP ZKEQ2_FACT = ZKEQ2_SO2 / ZHP ! Effective Henry solubility coefficient for SO2 - ZHCC_SO2_EFF = ZHCC_SO2 * ( 1._JPRB + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) + ZHCC_SO2_EFF = ZHCC_SO2 * ( 1._JPRD + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ! -- aqueous fractions in the cloudy part [dimensionless] - ZFAQ_H2O2 = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_H2O2 * ZPNEB ) ) - ZFAQ_O3 = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_O3 * ZPNEB ) ) - ZFAQ_OH = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_OH * ZPNEB ) ) - ZFAQ_SO2 = 1._JPRB / (1._JPRB + 1._JPRB / (ZHCC_SO2_EFF * ZPNEB ) ) + ZFAQ_H2O2 = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_H2O2 * ZPNEB ) ) + ZFAQ_O3 = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_O3 * ZPNEB ) ) + ZFAQ_OH = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_OH * ZPNEB ) ) + ZFAQ_SO2 = 1._JPRD / (1._JPRD + 1._JPRD / (ZHCC_SO2_EFF * ZPNEB ) ) ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ! -- Oxidants concentrations / partial pressure / ... ! -- mmr [kg / kg] - IF (PH2O2(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrH2O2 = PH2O2(JL,JK) + IF (ZH2O2 > 1.0E-14_JPRD ) THEN + ZmmrH2O2 = ZH2O2 ELSE - ZmmrH2O2 = 0.0_JPRB + ZmmrH2O2 = 0.0_JPRD ENDIF - IF (PO3(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrO3 = PO3(JL,JK)*ZSCALEO3(JL) + IF (ZO3 > 1.0E-14_JPRD ) THEN + ZmmrO3 = ZO3 * DSCALEO3(JL) ELSE - ZmmrO3 = 0.0_JPRB + ZmmrO3 = 0.0_JPRD ENDIF - IF (POH(JL,JK) > 1.0E-14_JPRB ) THEN - ZmmrOH = POH(JL,JK)*ZSCALEOH(JL) + IF (ZOH > 1.0E-14_JPRD ) THEN + ZmmrOH = ZOH * DSCALEOH(JL) ELSE - ZmmrOH = 0.0_JPRB + ZmmrOH = 0.0_JPRD ENDIF - ZmmrSO2 = PSO2(JL,JK) + PTSPHY * PITSO2(JL,JK) + ZmmrSO2 = ZSO2 + ZTSPHY * ZITSO2 ! -- gas phase concentration [mol / m3(g)] ! -- oxidants concentrations from climatologies are gas phase concentration. @@ -521,25 +523,25 @@ SUBROUTINE AER_SO2SO4_V2 & ! reference: JPL Pub. 15-10, Eval Nb 18 ! low pressure limit depends on temperature - ZKOH_LOW = ZKOH_LOW300 * (300._JPRB / ZTEMPERAT)**4.3_JPRB + ZKOH_LOW = ZKOH_LOW300 * (300._JPRD / ZTEMPERAT)**4.3_JPRD ! complete expression: see doc ZFACT1 = ZKOH_LOW * ZAIR_CONC ZFACT2 = ZFACT1 / ZKOH_HIGH - ZKOH = ZFACT1 / (1._JPRB + ZFACT2) - ZKOH = ZKOH * .6_JPRB ** (1._JPRB / (1._JPRB + LOG10(ZFACT2)**2) ) + ZKOH = ZFACT1 / (1._JPRD + ZFACT2) + ZKOH = ZKOH * .6_JPRD ** (1._JPRD / (1._JPRD + LOG10(ZFACT2)**2) ) ! -- k_H2O2 reaction rate ! reference: Seinfeld and Pandis, 2nd Ed., 2006, table 7.6 p.316 SELECT CASE(IKH2O2_select) CASE(1) ZKH2O2 = ZKH2O2_REF_v1 * EXP(ZKH2O2_TD_v1 * ZTFACT) ! unit is [L**2 / mol**2 / s] - ZKH2O2 = ZKH2O2 * ZHP / (1._JPRB + 13._JPRB * ZHP) ! unit is [L / mol / s] + ZKH2O2 = ZKH2O2 * ZHP / (1._JPRD + 13._JPRD * ZHP) ! unit is [L / mol / s] ZKH2O2 = ZKH2O2 * ZCONV3 ! unit is [m**3 / mol / s] CASE(2) ZKH2O2 = ZKH2O2_REF_v2 * EXP(ZKH2O2_TD_v2 * ZTFACT) ! unit is [L / mol / s] ??? - ZKH2O2 = ZKH2O2 / (0.1_JPRB + ZHP) ! unit is [L / mol / s] ??? according to Tsai et al ACP 2010 + ZKH2O2 = ZKH2O2 / (0.1_JPRD + ZHP) ! unit is [L / mol / s] ??? according to Tsai et al ACP 2010 ZKH2O2 = ZKH2O2 * ZCONV3 ! unit is [m**3 / mol / s] CASE DEFAULT CALL ABOR1('ABORT: IN AER_SO2SO4_V2, IKH2O2_select has incorrect value') @@ -558,7 +560,7 @@ SUBROUTINE AER_SO2SO4_V2 & ! -- gas phase concentration [mol / m3(g)] - ZC_SO2_gas = ZC_SO2_tot * (1._JPRB - ZFAQ_SO2*ZCLW_VFRAC) + ZC_SO2_gas = ZC_SO2_tot * (1._JPRD - ZFAQ_SO2*ZCLW_VFRAC) ! -- aqueous phase concentration [mol / m3(aq)] ! WARNING: these are "potential" aqueous concentrations ZC_H2O2_aqp = ZC_H2O2_gas * ZHCC_H2O2 @@ -567,7 +569,7 @@ SUBROUTINE AER_SO2SO4_V2 & ZC_Siv_aqp = ZC_SO2_gas * ZHCC_SO2_EFF ! Update fractioning between aqueous forms of S(iv) - ZC_SO2_aqp = ZC_Siv_aqp / (1._JPRB + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) + ZC_SO2_aqp = ZC_Siv_aqp / (1._JPRD + ZKEQ1_FACT + ZKEQ1_FACT * ZKEQ2_FACT ) ZC_HSO3m_aqp = ZC_SO2_aqp * ZKEQ1_FACT ZC_SO3mm_aqp = ZC_HSO3m_aqp * ZKEQ2_FACT ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -611,20 +613,20 @@ SUBROUTINE AER_SO2SO4_V2 & ! --> will be applied to the sum of 3 reaction paths with O3 ZTend_O3_ul = ZTend_O3_r1 + ZTend_O3_r2 + ZTend_O3_r3 ZTend_O3_li = MIN(ZTend_O3_ul, ZC_O3_aqp) - IF(ZTend_O3_ul > 0._JPRB) THEN + IF(ZTend_O3_ul > 0._JPRD) THEN ZLimit_fact_O3 = ZTend_O3_li / ZTend_O3_ul ELSE - ZLimit_fact_O3 = 0._JPRB + ZLimit_fact_O3 = 0._JPRD ENDIF ! Limiting factor due to HSO3- availability ! --> will be applied to the 2 reaction with HSO3- ZSum_HSO3m_ox_ul = ZTend_H2O2 + ZTend_O3_r2 * ZLimit_fact_O3 ZSum_HSO3m_ox_li = MIN(ZSum_HSO3m_ox_ul, ZC_HSO3m_aqp) - IF(ZSum_HSO3m_ox_ul > 0._JPRB) THEN + IF(ZSum_HSO3m_ox_ul > 0._JPRD) THEN ZLimit_fact_HSO3m = ZSum_HSO3m_ox_li / ZSum_HSO3m_ox_ul ELSE - ZLimit_fact_HSO3m = 0._JPRB + ZLimit_fact_HSO3m = 0._JPRD ENDIF ! Final tendencies expressed as "potential" concentrations [mol / m3(aq)] @@ -651,7 +653,6 @@ SUBROUTINE AER_SO2SO4_V2 & ZC_H2O2_gas = ZC_H2O2_gas - ZTend_Aq ZC_O3_gas = ZC_O3_gas - ZTend_Aq - ENDDO ZTend_H2O2_Sum = ZTend_H2O2_Sum * ZCLW_VFRAC ! convert to [mol / m**3(g)] @@ -660,31 +661,43 @@ SUBROUTINE AER_SO2SO4_V2 & ZTend_Sum = ZTend_Aq_Sum + ZTend_OH_Sum - PTSO2(JL,JK) = PTSO2(JL,JK) -ZTend_Sum * ZRMSO2 / ZAIR_DENS / PTSPHY - PTSO4(JL,JK) = PTSO4(JL,JK) + ZTend_Sum * ZRMSO4 / ZAIR_DENS / PTSPHY + ! Separate wet and dry production of SO4 to allow wet SO4 distribution to M7 modes + ! For "aer" case, dry and wet production are summed in AER_PHY3 (FIXME TODO IF POSSIBLE) + ZTSO2(JL,JK) = ZTSO2(JL,JK) - ZTend_Sum * ZRMSO2 / ZAIR_DENS / ZTSPHY + ZTSO4(JL,JK) = ZTSO4(JL,JK) + ZTend_OH_Sum * ZRMSO4 / ZAIR_DENS / ZTSPHY + ZTSO4_AQ(JL,JK) = ZTSO4_AQ(JL,JK) + ZTend_Aq_Sum * ZRMSO4 / ZAIR_DENS / ZTSPHY ! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ENDIF - ENDDO ENDDO -DO JL=KIDIA,KFDIA - PFSO4(JL)=0.0_JPRB - PFSO2(JL)=0.0_JPRB +! Cast to working precision +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + PTSO4(JL,JK) = REAL(ZTSO4(JL,JK), KIND=JPRB) + PTSO4_AQ(JL,JK) = REAL(ZTSO4_AQ(JL,JK), KIND=JPRB) + PTSO2(JL,JK) = REAL(ZTSO2(JL,JK), KIND=JPRB) + ENDDO ENDDO +! Column integrated output +DO JL=KIDIA,KFDIA + PFSO4(JL) = 0.0_JPRB + PFSO4_AQ(JL)= 0.0_JPRB + PFSO2(JL) = 0.0_JPRB +ENDDO DO JK=1,KLEV - DO JL=KIDIA,KFDIA - PFSO4(JL) = PFSO4(JL) + PTSO4(JL,JK)*(PDP(JL,JK))/RG - PFSO2(JL) = PFSO2(JL) + PTSO2(JL,JK)*(PDP(JL,JK))/RG - ENDDO + DO JL=KIDIA,KFDIA + PFSO4(JL) = PFSO4(JL) + PTSO4(JL,JK) * PDP(JL,JK)/RG + PFSO4_AQ(JL) = PFSO4_AQ(JL) + PTSO4_AQ(JL,JK) * PDP(JL,JK)/RG + PFSO2(JL) = PFSO2(JL) + PTSO2(JL,JK) * PDP(JL,JK)/RG + ENDDO ENDDO - !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_SO2SO4_V2',1,ZHOOK_HANDLE) END SUBROUTINE AER_SO2SO4_V2 diff --git a/ifs-source/arpifs/phys_ec/aer_src.F90 b/ifs-source/arpifs/phys_ec/aer_src.F90 index 0968a72a..6885631c 100644 --- a/ifs-source/arpifs/phys_ec/aer_src.F90 +++ b/ifs-source/arpifs/phys_ec/aer_src.F90 @@ -169,17 +169,17 @@ SUBROUTINE AER_SRC & INTEGER(KIND=JPIM) , PARAMETER :: INSOIL = 85 INTEGER(KIND=JPIM) , PARAMETER :: INSOILMODE = 3 INTEGER(KIND=JPIM) , PARAMETER :: INBIN = 3 -REAL(KIND=JPRB),PARAMETER :: ZZ0SBIS=3.E-05_JPRB ! en m +REAL(KIND=JPRB),PARAMETER :: ZZ0SBIS=3.E-05_JPRB ! in m REAL(KIND=JPRB), PARAMETER :: ZCSTD = 3.4_JPRB REAL(KIND=JPRB), PARAMETER :: ZRVONKAR = 0.4_JPRB REAL(KIND=JPRB), PARAMETER :: ZSIGMAS = 3.0_JPRB ! Normalization constant REAL(KIND=JPRB), PARAMETER :: ZRCV=12.62_JPRB REAL(KIND=JPRB), PARAMETER :: ZLAMBDA=12.0_JPRB -REAL(KIND=JPRB) , DIMENSION(INBIN,2) :: ZTRSIZE -REAL(KIND=JPRB) , DIMENSION(3,12) :: ZMMD , ZPCENT , ZSIGMA -REAL(KIND=JPRB) , DIMENSION(3,12) :: ZMMD2 , ZPCENT2 , ZSIGMA2 -REAL(KIND=JPRB), DIMENSION(2,ISIZE) :: ZAEROSIZE +REAL(KIND=JPRB), DIMENSION(3,12) :: ZMMD , ZPCENT , ZSIGMA +REAL(KIND=JPRB), DIMENSION(3,12) :: ZMMD2 , ZPCENT2 , ZSIGMA2 +REAL(KIND=JPRB), DIMENSION(INBIN,2) :: ZTRSIZE +REAL(KIND=JPRB), DIMENSION(2,ISIZE) :: ZAEROSIZE !---------------- Other dust variables REAL(KIND=JPRB) :: ZSTOTAL , ZXK , ZXL , ZXM , ZXN, ZRWI, ZTOTV @@ -196,7 +196,7 @@ SUBROUTINE AER_SRC & REAL(KIND=JPRB), DIMENSION(INATS,KLON) :: ZFSOIL, ZFTEX -INTRINSIC ERF +INTRINSIC ERF ! RCHG -> Is this used? !! REAL(KIND=JPRB) :: ZDMSSRC(KLON) @@ -307,64 +307,88 @@ SUBROUTINE AER_SRC & & 0.50_JPRB , 0.00_JPRB , 0.50_JPRB/ !----------------------------------------------------------------------- -ASSOCIATE(YDVAB=>YDGEOMETRY%YRVAB,YDVETA=>YDGEOMETRY%YRVETA,YDVFE=>YDGEOMETRY%YRVFE,YDSTA=>YDGEOMETRY%YRSTA, & - & YDLAP=>YDGEOMETRY%YRLAP,YDCSGLEG=>YDGEOMETRY%YRCSGLEG, & - & YDCSGEOM=>YDGEOMETRY%YRCSGEOM,YDCSGEOM_NB=>YDGEOMETRY%YRCSGEOM_NB, & - & YDGSGEOM=>YDGEOMETRY%YRGSGEOM, & - & YDGSGEOM_NB=>YDGEOMETRY%YRGSGEOM_NB, & - & YDSPGEOM=>YDGEOMETRY%YSPGEOM, YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP,YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YGFL=>YDMODEL%YRML_GCONF%YGFL, & - & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) - -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YAERO=>YGFL%YAERO, & - & NDGLG=>YDGEOMETRY%YRDIM%NDGLG, & - & LAERCLIST=>YDEAERATM%LAERCLIST, LAERELVS=>YDEAERATM%LAERELVS, & - & LAERVOL=>YDEAERATM%LAERVOL, & - & NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & - & RDUSRCP=>YDEAERMAP%RDUSRCP, & - & RRHO_DD=>YDEAERSNK%RRHO_DD, & - & LOCNDMS=>YDEAERSRC%LOCNDMS, NAERWND=>YDEAERSRC%NAERWND, & - & LAERNITRATE=>YDCOMPO%LAERNITRATE, & - & LAERSOA=>YDCOMPO%LAERSOA, & - & LAERSOA_COUPLED=>YDCOMPO%LAERSOA_COUPLED, & - & NDDUST=>YDEAERSRC%NDDUST, NDMSO=>YDEAERSRC%NDMSO, NSSALT=>YDEAERSRC%NSSALT, & - & NTYPAER=>YDEAERATM%NTYPAER, RAERDUB=>YDEAERSRC%RAERDUB, & - & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & - & RDDUSRC=>YDEAERSRC%RDDUSRC, RDMSMIN=>YDEAERSRC%RDMSMIN, & - & RFCTSS=>YDEAERSRC%RFCTSS, RSIDECA=>YDEAERSRC%RSIDECA, & - & RSIVSRA=>YDEAERSRC%RSIVSRA, & - & NAERVOLC=>YDEAERVOL%NAERVOLC, NAERVOLE=>YDEAERVOL%NAERVOLE, & - & NVOLDATS=>YDEAERVOL%NVOLDATS, NVOLERUP=>YDEAERVOL%NVOLERUP, & - & NVOLDATE=>YDEAERVOL%NVOLDATE, & - & RAERVOLC=>YDEAERVOL%RAERVOLC, RAERVOLE=>YDEAERVOL%RAERVOLE, & - & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME, LVDFTRAC=>YDEPHY%LVDFTRAC, YSURF=>YDEPHY%YSURF, & - & NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & - & NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, & - & NSTASS=>YDRIP%NSTASS, RHGMT=>YDRIP%RHGMT, RSTATI=>YDRIP%RSTATI,& - & NDRYDEPVEL_DYN=> YDEAERSNK%NDRYDEPVEL_DYN, & - & NCHEM=>YGFL%NCHEM, YCHEM=>YGFL%YCHEM, & - & LAERDUST_NEWBIN=>YDEAERATM%LAERDUST_NEWBIN, & - & LAERDUSTSIZEVAR=>YDEAERATM%LAERDUSTSIZEVAR, & - & LAERDUSTSOURCE=>YDEAERATM%LAERDUSTSOURCE, & - & LAERCHEM=>YGFL%LAERCHEM) +ASSOCIATE(& + ! --- YDGEOMETRY -------------------------------------- + & YDVAB => YDGEOMETRY%YRVAB, YDVETA => YDGEOMETRY%YRVETA, & + & YDVFE => YDGEOMETRY%YRVFE, YDSTA => YDGEOMETRY%YRSTA, & + & YDLAP => YDGEOMETRY%YRLAP, YDCSGLEG => YDGEOMETRY%YRCSGLEG, & + & YDCSGEOM => YDGEOMETRY%YRCSGEOM, YDCSGEOM_NB => YDGEOMETRY%YRCSGEOM_NB, & + & YDGSGEOM => YDGEOMETRY%YRGSGEOM, YDGSGEOM_NB => YDGEOMETRY%YRGSGEOM_NB, & + & YDSPGEOM => YDGEOMETRY%YSPGEOM, NDGLG => YDGEOMETRY%YRDIM%NDGLG, & + & NGLOBALAT => YDGEOMETRY%YRMP%NGLOBALAT, NLOENG => YDGEOMETRY%YRGEM%NLOENG, & + ! --- YDMODEL ------------------------------------------ + & YDEAERMAP=>YDMODEL%YRML_PHY_AER%YREAERMAP, & + & YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL, & + & YDEAERSNK=>YDMODEL%YRML_PHY_AER%YREAERSNK, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDRIP =>YDMODEL%YRML_GCONF%YRRIP, & + & YDCOMPO =>YDMODEL%YRML_CHEM%YRCOMPO, & + & YGFL =>YDMODEL%YRML_GCONF%YGFL, & + & YDEPHY =>YDMODEL%YRML_PHY_EC%YREPHY, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) + +ASSOCIATE(& + ! --- YGFL ---------------------------------------------- + & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YAERO=>YGFL%YAERO, & + ! --- YDEAERATM ----------------------------------------- + & LAERCLIST => YDEAERATM%LAERCLIST, & + & LAERELVS => YDEAERATM%LAERELVS, & + & LAERVOL => YDEAERATM%LAERVOL, & + & LAERDUST_NEWBIN => YDEAERATM%LAERDUST_NEWBIN, & + & LAERDUSTSIZEVAR => YDEAERATM%LAERDUSTSIZEVAR, & + & LAERDUSTSOURCE => YDEAERATM%LAERDUSTSOURCE, & + & LAERSOA_CHEM => YDEAERATM%LAERSOA_CHEM, & + ! --- YDEAERMAP ----------------------------------------- + & NDUSRCP=>YDEAERMAP%NDUSRCP, RDDUAER=>YDEAERMAP%RDDUAER, & + & RDUSRCP=>YDEAERMAP%RDUSRCP, & + ! --- YDEAERSNK ----------------------------------------- + & RRHO_DD =>YDEAERSNK%RRHO_DD, & + & NDRYDEPVEL_DYN=>YDEAERSNK%NDRYDEPVEL_DYN, & + ! --- YDEAERSRC ----------------------------------------- + & LOCNDMS => YDEAERSRC%LOCNDMS, NAERWND => YDEAERSRC%NAERWND, & + & NDDUST => YDEAERSRC%NDDUST, NDMSO => YDEAERSRC%NDMSO, & + & NSSALT => YDEAERSRC%NSSALT, RAERDUB => YDEAERSRC%RAERDUB, & + & RCODECA => YDEAERSRC%RCODECA, RCOVSRA => YDEAERSRC%RCOVSRA, & + & RDDUSRC => YDEAERSRC%RDDUSRC, RDMSMIN => YDEAERSRC%RDMSMIN, & + & RFCTSS => YDEAERSRC%RFCTSS, RSIDECA => YDEAERSRC%RSIDECA, & + & RSIVSRA => YDEAERSRC%RSIVSRA, & + ! --- YDEAERATM ----------------------------------------- + & NTYPAER=>YDEAERATM%NTYPAER, & + ! --- YDCOMPO -------------------------------------------- + & LAERNITRATE => YDCOMPO%LAERNITRATE, & + & LAERSOA => YDCOMPO%LAERSOA, & + & LAERSOA_COUPLED => YDCOMPO%LAERSOA_COUPLED, & + ! --- YDEAERVOL ------------------------------------------ + & NAERVOLC=>YDEAERVOL%NAERVOLC, NAERVOLE=>YDEAERVOL%NAERVOLE, & + & NVOLDATS=>YDEAERVOL%NVOLDATS, NVOLERUP=>YDEAERVOL%NVOLERUP, & + & NVOLDATE=>YDEAERVOL%NVOLDATE, & + & RAERVOLC=>YDEAERVOL%RAERVOLC, RAERVOLE=>YDEAERVOL%RAERVOLE, & + ! --- YDEPHY --------------------------------------------- + & NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME, & + & LVDFTRAC => YDEPHY%LVDFTRAC, & + & YSURF => YDEPHY%YSURF, & + ! --- YDRIP ----------------------------------------------- + & NSTASS=>YDRIP%NSTASS, RHGMT=>YDRIP%RHGMT, RSTATI=>YDRIP%RSTATI, & + ! --- YGFL ----------------------------------------------- + & NCHEM => YGFL%NCHEM, & + & YCHEM => YGFL%YCHEM, & + & LAERCHEM => YGFL%LAERCHEM) IF (LAERDUST_NEWBIN) THEN - ZTRSIZE(:,1)=(/0.01_JPRB , 1.0_JPRB , 2.5_JPRB/) - ZTRSIZE(:,2)=(/1.0_JPRB , 2.5_JPRB ,20.0_JPRB /) - ZAEROSIZE(1,:)=(/1.0E-08_JPRB , 2.0E-08_JPRB , 4.0E-08_JPRB , & - & 8.0E-08_JPRB , 1.6E-07_JPRB ,3.2E-07_JPRB , & - & 6.4E-07_JPRB , 1.28E-06_JPRB , & - & 2.56E-06_JPRB , 5.12E-06_JPRB , 10.24E-06_JPRB /) - ZAEROSIZE(2,:)=(/2.0E-08_JPRB , 4.0E-08_JPRB , & - & 8.0E-08_JPRB , 1.6E-07_JPRB ,3.2E-07_JPRB , & - & 6.4E-07_JPRB , 1.28E-06_JPRB , & - & 2.56E-06_JPRB , 5.12E-06_JPRB ,10.24E-06_JPRB , & - & 20.48E-06_JPRB/) + ZTRSIZE(:,1)=(/0.01_JPRB , 1.0_JPRB , 2.5_JPRB /) + ZTRSIZE(:,2)=(/1.0_JPRB , 2.5_JPRB , 20.0_JPRB /) + ZAEROSIZE(1,:)=(/1.0E-08_JPRB , 2.0E-08_JPRB , 4.0E-08_JPRB , & + & 8.0E-08_JPRB , 1.6E-07_JPRB , 3.2E-07_JPRB , & + & 6.4E-07_JPRB , 1.28E-06_JPRB , & + & 2.56E-06_JPRB , 5.12E-06_JPRB , 10.24E-06_JPRB /) + ZAEROSIZE(2,:)=(/2.0E-08_JPRB , 4.0E-08_JPRB , & + & 8.0E-08_JPRB , 1.6E-07_JPRB , 3.2E-07_JPRB , & + & 6.4E-07_JPRB , 1.28E-06_JPRB , & + & 2.56E-06_JPRB , 5.12E-06_JPRB , 10.24E-06_JPRB, & + & 20.48E-06_JPRB/) ELSE ZTRSIZE(:,1)=(/0.03_JPRB , 0.55_JPRB , 0.9_JPRB/) ZTRSIZE(:,2)=(/0.55_JPRB , 0.9_JPRB,20.0_JPRB /) @@ -484,6 +508,9 @@ SUBROUTINE AER_SRC & !* 0.6 EMPIRICAL EFFICIENCY FACTORS FOR SOURCES ! ---------------------------------------- +! RCHG -> translate this block to a subroutine external +! -> (that be shared with M7) + PAERMAP(KIDIA:KFDIA,:) = 0._JPRB IF (NTYPAER(2) > 0) THEN DO JL=KIDIA,KFDIA @@ -897,7 +924,7 @@ SUBROUTINE AER_SRC & & PCI, PLSM, PCLK, ZWNDSS, ZFLX_SSALT) CASE (2) - CALL AER_SSALT_MS (KIDIA, KFDIA, KLON,& + CALL AER_SSALT_MS (YDEAERATM, KIDIA, KFDIA, KLON,& & PCI, PLSM, PCLK, ZWNDSS, ZFLX_SSALT) CASE (3) @@ -956,6 +983,8 @@ SUBROUTINE AER_SRC & IF (NTYPAER(2) /= 0) THEN !----------------------------------------------- + ! RCHG -> this will be eventially a very nested if so a more structured approach + ! can meke more maintanable the code. IF (NDDUST == 2 .OR. NDDUST == 4 ) THEN ! case P. Nabat formulation @@ -976,6 +1005,9 @@ SUBROUTINE AER_SRC & ! SANDY LOAM : SAND >= 0.52 CLAY < 0.20 | SAND >= (0.5 - CLAY) CLAY < 0.07 ! LOAM : CLAY >= 0.20 CLAY < 0.28 SILT >= 0.28 SILT < 0.5 | SAND >= (0.5 - CLAY) ! CLAY < 0.20 + + ! RCHG -> processing soil texture silt, clay, sand + ! -> CALL SOIL_TEXTURE_DESERT(KIDIA, KFDIA, PAERLTS, PAERSCC, ZFTEX) ! out ZFTEX ZFTEX(:,:)=0.0 DO JL=KIDIA,KFDIA @@ -1028,9 +1060,12 @@ SUBROUTINE AER_SRC & ZDP_ARRAY(1)=0.0001_JPRB ! in cm DO JS=2,INSOIL ZDP_ARRAY(JS) = ZDP_ARRAY(JS-1)*exp(ZDELDP) - !write (*,*) "ZDELDP",JS,ZDP_ARRAY(JS),((EXP(ZDELDP))**(JS-1))*(EXP(ZDELDP)-1)*ZDP_ARRAY(1) ENDDO + ! RCHG -> formally speaking this is done in both, M7 and here in different methods, so maybe + ! -> it is good to unify? The difference here is the soil texture arrays format + + ! ! Determination of ZSREL=dSrel in MB95 ! equations 29-30-31 in MB95 ! ZSS=dS(Dp) @@ -1432,6 +1467,8 @@ SUBROUTINE AER_SRC & !* 3.0 ORGANIC MATTER (ORGANIC CARBON, POM, SECONDARY ORGANIC MATTER) ! -------------------------------------------------------------- +! Here we are adding bins to have a track of the nspecies this technically not needed here +! but a data structure that ensampsulates that. IF (NTYPAER(3) /= 0) THEN INBAER=INBAER+2 ENDIF @@ -1654,14 +1691,12 @@ SUBROUTINE AER_SRC & ZVOLESO2(JL)=RAERVOLE(JVOLE,4)*RAERVOLE(JVOLE,8)/ZVOLUME DO JK=ITOPPL,IBASPL - - PTENC(JL,JK,KAERO(INBAER+1))=PTENC(JL,JK,KAERO(INBAER+1))+& & ZVOLEASH(JL)/PRHO(JL,JK) ! kg kg-1 s-1 !- updating volcanic SO2 tendency (should be in variable 15) PTENC(JL,JK,KAERO(INBAER+3))=PTENC(JL,JK,KAERO(INBAER+3))+& & ZVOLESO2(JL)/PRHO(JL,JK) ! kg kg-1 s-1 - write (*,*) "AERVOLC",JL,JK,ZVOLESO2(JL)/PRHO(JL,JK),PRHO(JL,JK),ZVOLUME,ZAREA,ZLATSQ,ZLONSQ,ZDEEPLUME + !write (*,*) "AERVOLC",JL,JK,ZVOLESO2(JL)/PRHO(JL,JK),PRHO(JL,JK),ZVOLUME,ZAREA,ZLATSQ,ZLONSQ,ZDEEPLUME ENDDO diff --git a/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 b/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 index 5ee9522e..38e95b12 100644 --- a/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 +++ b/ifs-source/arpifs/phys_ec/aer_ssalt_ms.F90 @@ -7,7 +7,7 @@ ! nor does it submit to any jurisdiction SUBROUTINE AER_SSALT_MS & - &( KIDIA, KFDIA, KLON, & + &( YDEAERATM, KIDIA, KFDIA, KLON, & & PCI , PLSM , PCLK, PWIND, & & PFLXSS & &) @@ -41,7 +41,7 @@ SUBROUTINE AER_SSALT_MS & USE PARKIND1 ,ONLY : JPIM ,JPRB USE YOMHOOK ,ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOEAERATM ,ONLY : YREAERATM +USE YOEAERATM ,ONLY : TEAERATM!YREAERATM !USE YOEAERSRC ,ONLY : RSSFLX IMPLICIT NONE @@ -51,6 +51,7 @@ SUBROUTINE AER_SSALT_MS & !* 0.1 ARGUMENTS ! --------- +TYPE(TEAERATM) ,INTENT(IN) :: YDEAERATM INTEGER(KIND=JPIM),INTENT(IN) :: KLON INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA @@ -123,7 +124,7 @@ SUBROUTINE AER_SSALT_MS & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('AER_SSALT_MS',0,ZHOOK_HANDLE) -ASSOCIATE(RSS_RH80_MASSFAC=>YREAERATM%RSS_RH80_MASSFAC) +ASSOCIATE(RSS_RH80_MASSFAC=>YDEAERATM%RSS_RH80_MASSFAC) IF (.NOT. LLENTERED) THEN ZDMASS1(0:79) = ZMASS1FLUX(1:80)-ZMASS1FLUX(0:79) diff --git a/ifs-source/arpifs/phys_ec/aerini_layer.F90 b/ifs-source/arpifs/phys_ec/aerini_layer.F90 index 260a65fa..f746eefb 100644 --- a/ifs-source/arpifs/phys_ec/aerini_layer.F90 +++ b/ifs-source/arpifs/phys_ec/aerini_layer.F90 @@ -7,7 +7,7 @@ ! nor does it submit to any jurisdiction SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& - & YDMODEL,KDIM,PAUX,STATE,R,S,PSURF,SURFL,GEMSL) + & YDMODEL,KDIM,PAUX,STATE,R,S,PSURF,SURFL,GEMSL,GPGAW) !**** *AERINI_LAYER* - Layer routine calling time stepping of first part ! of prognostic aerosol computations @@ -80,7 +80,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& IMPLICIT NONE TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(TSURF) ,INTENT(INOUT) :: YDSURF +TYPE(TSURF) ,INTENT(IN) :: YDSURF TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL TYPE (DIMENSION_TYPE) ,INTENT (IN) :: KDIM TYPE (AUX_TYPE) ,INTENT (IN) :: PAUX @@ -89,6 +89,7 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& TYPE (SURF_AND_MORE_TYPE) ,INTENT(INOUT) :: PSURF TYPE (SURF_AND_MORE_LOCAL_TYPE),INTENT(INOUT) :: SURFL TYPE (GEMS_LOCAL_TYPE) ,INTENT(INOUT) :: GEMSL +REAL(KIND=JPRB) ,INTENT(IN) :: GPGAW(KDIM%KLON) !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JL, ISNH3_C,ISHNO3_C,JK,JT ! names begin with "IX" to avoid confusion with the species indices used in the chemical schemes @@ -112,11 +113,14 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +REAL(KIND=JPRB) :: PSO4SRC(KDIM%KLON,KDIM%KLEV),PSO2SRC(KDIM%KLON,KDIM%KLEV) REAL(KIND=JPRB) :: ZSNM(KDIM%KLON) !----------------------------------------------------------------------- #include "aer_wind.intfb.h" #include "aer_phy2.intfb.h" +#include "tm5m7_phy2.intfb.h" +!#include "simple_sulfur_src.intfb.h" #include "abor1.intfb.h" @@ -125,19 +129,31 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('AERINI_LAYER',0,ZHOOK_HANDLE) -ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, & - & YDMP=>YDGEOMETRY%YRMP, YGFL=>YDMODEL%YRML_GCONF%YGFL,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & - & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, & - & LECSRAD=>YDERAD%LECSRAD, NCSRADF=>YDERAD%NCSRADF, NSW=>YDERAD%NSW, & - & NSTART=>YDRIP%NSTART, & - & LAERNITRATE => YDCOMPO%LAERNITRATE, & - & YCHEM=>YGFL%YCHEM, & - & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & - & YSD_VD=>YDSURF%YSD_VD, YSD_VF=>YDSURF%YSD_VF, YSP_RR=>YDSURF%YSP_RR, & - & YSP_SB=>YDSURF%YSP_SB, YSP_SG=>YDSURF%YSP_SG, TSPHY=>YDPHY2%TSPHY) +ASSOCIATE(& + ! --- YDGEOMETRY ------------------------------------------------------------- + & YDDIM=>YDGEOMETRY%YRDIM, YDDIMV=>YDGEOMETRY%YRDIMV, & + & YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & + ! --- YDMODEL ---------------------------------------------------------------- + & YGFL =>YDMODEL%YRML_GCONF%YGFL, YDPHY2 =>YDMODEL%YRML_PHY_MF%YRPHY2, & + & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDCOMPO =>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, YDRIP=>YDMODEL%YRML_GCONF%YRRIP) + +ASSOCIATE(& + ! --- YDERAD ----------------------------------------------------------------- + & LECSRAD => YDERAD%LECSRAD, NCSRADF=>YDERAD%NCSRADF, NSW=>YDERAD%NSW, & + ! --- YGFL ------------------------------------------------------------------- + & NACTAERO => YGFL%NACTAERO, & + & YCHEM => YGFL%YCHEM, & + & LAERCHEM => YGFL%LAERCHEM, & + ! --- YDCOMPO ---------------------------------------------------------------- + & LAERNITRATE => YDCOMPO%LAERNITRATE, & + & LAEROSFC => YDCOMPO%LAEROSFC, & + & AERO_SCHEME => YDCOMPO%AERO_SCHEME, & + ! --- YDSURF ----------------------------------------------------------------- + & YSD_VD => YDSURF%YSD_VD, YSD_VF=>YDSURF%YSD_VF, YSP_RR=>YDSURF%YSP_RR,& + & YSP_SB => YDSURF%YSP_SB, YSP_SG=>YDSURF%YSP_SG, & + ! --- OTHERS ----------------------------------------------------------------- + & NSTART => YDRIP%NSTART, TSPHY=>YDPHY2%TSPHY) ! ------------------------------------------------------------------ IXCHEM(:) = IXNOTUSED @@ -153,68 +169,150 @@ SUBROUTINE AERINI_LAYER(YDGEOMETRY,YDSURF,& !* 1. UNROLL THE DERIVED STRUCTURES AND CALL AER_WIND AND AER_PHY2 -CALL AER_WIND& - &( KDIM%KIDIA,KDIM%KFDIA,KDIM%KLON,KDIM%KTILES,& - &STATE%U(:,KDIM%KLEV),STATE%V(:,KDIM%KLEV),STATE%T(:,KDIM%KLEV),STATE%Q(:,KDIM%KLEV),& - &PAUX%PAPRS(:,KDIM%KLEV),PAUX%PGEOM1(:,KDIM%KLEV),& - &PSURF%PUSTRTI,PSURF%PVSTRTI,PSURF%PAHFSTI,PSURF%PEVAPTI,SURFL%ZFRTI,GEMSL%ZAZ0M,& +CALL AER_WIND( & + & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON, KDIM%KTILES,& + & STATE%U(:,KDIM%KLEV),STATE%V(:,KDIM%KLEV),STATE%T(:,KDIM%KLEV),STATE%Q(:,KDIM%KLEV),& + & PAUX%PAPRS(:,KDIM%KLEV),PAUX%PGEOM1(:,KDIM%KLEV),& + & PSURF%PUSTRTI,PSURF%PVSTRTI,PSURF%PAHFSTI,PSURF%PEVAPTI,SURFL%ZFRTI,GEMSL%ZAZ0M,& & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST ) ZSNM = SUM(PSURF%PSP_SG(:,:,YSP_SG%YF%MP9),DIM=2) ! pre-compute total snow mass + + !IF(.not. LAERCHEM .and. LAEROSFC)THEN + !IF(LAEROSFC) + !call simple_sulfur_src(YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV,& + ! & KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, & + ! & PAUX%PAPHI, & + ! & PSURF%PSD_VF(:,YSD_VF%YSO2L%MP), PSURF%PSD_VF(:,YSD_VF%YSO2H%MP), & + ! & PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& + ! & PSURF%PSD_VF(:,YSD_VF%YSOA%MP) ,& + ! & PSURF%PSD_VF(:,YSD_VF%YSOACO%MP),PSURF%PSD_VF(:,YSD_VF%YVOLC%MP), PSURF%PSD_VF(:,YSD_VF%YVOLE%MP),PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& + ! & PSURF%PSD_VF(:,YSD_VF%YCI%MP) , PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + ! & PAUX%PRS1, PAUX%PRSF1,PAUX%PGELAM, PAUX%PGELAT,& + ! & PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , TSPHY,& + ! & GEMSL%ZAERWS,& + ! & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + ! & GEMSL%ZODMS, PSO4SRC,PSO2SRC) +!IF (trim(CHEM_SCHEME)=="Sim_Chem".and.LAERCHEM) +! DO JL=KIDIA,KFDIA +! DO JK=1,KLEV +! DO JGAS=1,2 +! IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO2') THEN +! ISSO2=ind_oifs_ham%ind_gas_OIFS(JGAS) +! GEMSL%ZTENC(JL,JK,KAERO(ISSO2))=GEMSL%ZTENC(JL,JK,KAERO(ISSO2))+ PSO2SRC(JL,JK) +! !PCFLX(JL,KAERO(ISSO2))=PCFLX(JL,KAERO(ISSO2)) + PSO2SRC(JL,JK) +! !PEMIDIAG(JL,KAERO(ISSO2))=PEMIDIAG(JL,KAERO(ISSO2))+ PSO2SRC(JL,JK) +! ELSE IF (TRIM(YAERO(ind_oifs_ham%ind_gas_OIFS(JGAS))%CNAME)=='SO4_gas') THEN +! ISSO4=ind_oifs_ham%ind_gas_OIFS(JGAS) +! GEMSL%ZTENC(JL,JK,KAERO(ISSO4))=GEMSL%ZTENC(JL,JK,KAERO(ISSO4))+ PSO4SRC(JL,JK) +! !PCFLX(JL,KAERO(ISSO4))=PCFLX(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) +! !PEMIDIAG(JL,KAERO(ISSO4))=PEMIDIAG(JL,KAERO(ISSO4)) + PSO4SRC(JL,JK) +! END IF +! END DO +! END DO +! +!! For add SOA from CO into ISVOC tracer +!!!$ DO JGAS=1,NACTAERO +!!!$ IF (TRIM(YAERO(JGAS)%CNAME)=='ISVOC') THEN +!!!$ +!!!$ PTENC(JL,JK,KAERO(JGAS))=PTENC(JL,JK,KAERO(JGAS))+ PSOACO(JL) +!!!$ PEMIDIAG(JL,KAERO(JGAS))=PEMIDIAG(JL,KAERO(JGAS)) + PSOACO(JL) +!!!$ END IF +!!!$ END DO +! +! END DO +! END IF +! +!ELSE +! ! Set to zero +! PSO4SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB +! PSO2SRC(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB +!END IF + SELECT CASE (TRIM(AERO_SCHEME)) CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") + ! HAM-M7 only implements the micro-physics part + ! all other processes are still handled by the TM5-M7 code + CASE ("hamm7") + + CALL TM5M7_PHY2( & + & YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& + & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& + & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& + & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& + & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& + & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& + !& PSURF%PSD_VF(:,YSD_VF%YSOGF%MP),& + & PSURF%PSD_VF(:,YSD_VF%YSOILTYPE%MP), & + !TB added lake cover: YCLK, !!!PSP_SG 2 dims becomes now 3 dims + & PSURF%PSD_VF(:,YSD_VF%YCI%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP) , & +! & PSURF%PSD_VF(:,YSD_VF%YINJF%MP) , & + & PSURF%PSD_VD(:,YSD_VD%YBLH%MP) ,& + & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP) , PSURF%PSD_VF(:,YSD_VF%YSST%MP), STATE%Q, & + & ZSNM, PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9), TSPHY, GEMSL%ZAZ0M,& + & GEMSL%ICHEM,& + !VH - Introduce Land use info... + & PSURF%PCVL, PSURF%PCVH,PSURF%ITVL,PSURF%ITVH, & + & PSURF%PAHFSTI, &!!!FLUX%PFTLHEV, & + !VH - end + & GEMSL%ZCFLX, GEMSL%ZTENC,& + & GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX_M7, GEMSL%ZAERLIF,& + & GEMSL%ZODMS, PSURF%PSD_XA, & + & PSO4SRC, PSO2SRC, GPGAW) CASE ("aer") - CALL AER_PHY2 & - &( YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& - & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW,& - & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& - & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& - & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& - & PSURF%PSD_VF(:,YSD_VF%YURBF%MP), R%P(:,KDIM%KLEV), S%P(:,KDIM%KLEV), & - & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& - & PSURF%PSD_VF(:,YSD_VF%YDSF%MP), & - & PSURF%PSD_VF(:,YSD_VF%YDSZ%MP), & - & PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& - & PSURF%PSD_VF(:,YSD_VF%YCI%MP),& - & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP), STATE%Q ,PSURF%PSD_VF(:,YSD_VF%YSST%MP), & - & ZSNM , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& - & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , TSPHY, GEMSL%ZAZ0M,& - & GEMSL%ICHEM,& - & PSURF%ITVL, PSURF%ITVH, PSURF%PCVL, PSURF%PCVH, PSURF%PLAIL, PSURF%PLAIH ,& - & GEMSL%ZCFLX, GEMSL%ZTENC,GEMSL%ZDDVLC,& - & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& - & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& - & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA & - &) + CALL AER_PHY2( & + & YDGEOMETRY, YDMODEL, KDIM%KIDIA, KDIM%KFDIA, KDIM%KLON , KDIM%KTDIA, KDIM%KLEV, KDIM%KFLDX , KDIM%KLEVX,& + & KDIM%KTILES, KDIM%KSTGLO, GEMSL%ITRAC, GEMSL%IAERO, NSW, & + & PAUX%PRS1 , PAUX%PRSF1, PAUX%PAPHI, STATE%T , PAUX%PVERVEL, GEMSL%ZCEN , PAUX%PGEOMH,& + & PSURF%PSD_VD(:,YSD_VD%YALB%MP), SURFL%ZALBD, PSURF%PSD_VF(:,YSD_VF%YALUVD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YAERDEP%MP),PSURF%PSD_VF(:,YSD_VF%YAERLTS%MP),PSURF%PSD_VF(:,YSD_VF%YAERSCC%MP),& + & GEMSL%ZAERWS, GEMSL%ZAERGUST, GEMSL%ZAERUST,& + & PSURF%PSD_VF(:,YSD_VF%YURBF%MP), R%P(:,KDIM%KLEV), S%P(:,KDIM%KLEV), & + & PSURF%PSD_VF(:,YSD_VF%YSO2DD%MP),& + & PSURF%PSD_VF(:,YSD_VF%YDSF%MP), & + & PSURF%PSD_VF(:,YSD_VF%YDSZ%MP), & + & PSURF%PSD_VF(:,YSD_VF%YDMSO%MP),& + & PSURF%PSD_VF(:,YSD_VF%YCI%MP),& + & SURFL%ZFRTI, PSURF%PSD_VF(:,YSD_VF%YLSM%MP), PSURF%PSD_VF(:,YSD_VF%YCLK%MP), STATE%Q ,PSURF%PSD_VF(:,YSD_VF%YSST%MP), & + & ZSNM , PSURF%PSP_RR(:,YSP_RR%YT%MP9) , PAUX%PGELAM, PAUX%PGELAT, PAUX%PGEMU, SURFL%ZHSDFOR,& + & STATE%U(:,KDIM%KLEV) , STATE%V(:,KDIM%KLEV) , PSURF%PSP_SB(:,1,YSP_SB%YQ%MP9) , TSPHY, GEMSL%ZAZ0M,& + & GEMSL%ICHEM,& + & PSURF%ITVL, PSURF%ITVH, PSURF%PCVL, PSURF%PCVH, PSURF%PLAIL, PSURF%PLAIH ,& + & GEMSL%ZCFLX, GEMSL%ZTENC,GEMSL%ZDDVLC,& + & GEMSL%ZDMSO, GEMSL%ZLDAY, GEMSL%ZLISS, GEMSL%ZSO2, GEMSL%ZTDMS,& + & GEMSL%ZAERDDP, GEMSL%ZAERSDM, GEMSL%ZAERSRC, GEMSL%ZAERMAP, GEMSL%ZAERFLX, GEMSL%ZAERLIF,& + & GEMSL%ZDMSI, GEMSL%ZODMS, PSURF%PSD_XA ) IF (LECSRAD .AND. NCSRADF == 1 .AND. NACTAERO >= 12) THEN - DO JL=KDIM%KIDIA,KDIM%KFDIA - PSURF%PSD_XA(JL,15,14)=SURFL%ZHSDFOR(JL) ! stand.dev. form orography - PSURF%PSD_XA(JL,16,14)=SURFL%ZFRTI(JL,4) ! tile fraction - PSURF%PSD_XA(JL,17,14)=SURFL%ZFRTI(JL,8) ! tile fraction - PSURF%PSD_XA(JL,18,14)=0._JPRB - PSURF%PSD_XA(JL,19,14)=PSURF%PSD_VD(JL,YSD_VD%YALB%MP) ! background albedo - PSURF%PSD_XA(JL,20,14)=PSURF%PSD_VF(JL,YSD_VF%YALUVD%MP) ! diffuse UVis albedo - PSURF%PSD_XA(JL,21,14)=SURFL%ZALBD(JL,1) ! diffuse albedo 1st interval - PSURF%PSD_XA(JL,22,14)=SUM(PSURF%PSP_SG(JL,1:KDIM%KLEVSN,YSP_SG%YF%MP9),DIM=1) ! snow SNS -! - DMS-related - PSURF%PSD_XA(JL,23,14)=GEMSL%ZDMSO(JL) - PSURF%PSD_XA(JL,24,14)=GEMSL%ZLDAY(JL) - PSURF%PSD_XA(JL,25,14)=GEMSL%ZSO2(JL) - PSURF%PSD_XA(JL,26,14)=GEMSL%ZAERWS(JL) - PSURF%PSD_XA(JL,27,14)=GEMSL%ZLISS(JL) - PSURF%PSD_XA(JL,28,14)=GEMSL%ZTDMS(JL) - PSURF%PSD_XA(JL,29,14)=GEMSL%ZODMS(JL) - PSURF%PSD_XA(JL,30,14)=GEMSL%ZDMSI(JL) - ENDDO - ENDIF + DO JL=KDIM%KIDIA,KDIM%KFDIA + PSURF%PSD_XA(JL,15,14)=SURFL%ZHSDFOR(JL) ! stand.dev. form orography + PSURF%PSD_XA(JL,16,14)=SURFL%ZFRTI(JL,4) ! tile fraction + PSURF%PSD_XA(JL,17,14)=SURFL%ZFRTI(JL,8) ! tile fraction + PSURF%PSD_XA(JL,18,14)=0._JPRB + PSURF%PSD_XA(JL,19,14)=PSURF%PSD_VD(JL,YSD_VD%YALB%MP) ! background albedo + PSURF%PSD_XA(JL,20,14)=PSURF%PSD_VF(JL,YSD_VF%YALUVD%MP) ! diffuse UVis albedo + PSURF%PSD_XA(JL,21,14)=SURFL%ZALBD(JL,1) ! diffuse albedo 1st interval + PSURF%PSD_XA(JL,22,14)=SUM(PSURF%PSP_SG(JL,1:KDIM%KLEVSN,YSP_SG%YF%MP9),DIM=1) ! snow SNS + ! - DMS-related + PSURF%PSD_XA(JL,23,14)=GEMSL%ZDMSO(JL) + PSURF%PSD_XA(JL,24,14)=GEMSL%ZLDAY(JL) + PSURF%PSD_XA(JL,25,14)=GEMSL%ZSO2(JL) + PSURF%PSD_XA(JL,26,14)=GEMSL%ZAERWS(JL) + PSURF%PSD_XA(JL,27,14)=GEMSL%ZLISS(JL) + PSURF%PSD_XA(JL,28,14)=GEMSL%ZTDMS(JL) + PSURF%PSD_XA(JL,29,14)=GEMSL%ZODMS(JL) + PSURF%PSD_XA(JL,30,14)=GEMSL%ZDMSI(JL) + ENDDO + ENDIF CASE DEFAULT diff --git a/ifs-source/arpifs/phys_ec/aero_init.F90 b/ifs-source/arpifs/phys_ec/aero_init.F90 index 430cbe4a..f3989403 100644 --- a/ifs-source/arpifs/phys_ec/aero_init.F90 +++ b/ifs-source/arpifs/phys_ec/aero_init.F90 @@ -58,6 +58,11 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) ALLOCATE( GEMSL%ZAERSRC(KDIM%KLON,NACTAERO) ) ALLOCATE( GEMSL%ZAERDDP(KDIM%KLON,NACTAERO) ) ALLOCATE( GEMSL%ZAERSDM(KDIM%KLON,NACTAERO) ) + +! RCHG -> as commented in other subroutines explain what is 5, 12 and 9 +ALLOCATE( GEMSL%ZAERMAP(KDIM%KLON,5) ) +ALLOCATE( GEMSL%ZAERFLX_M7(KDIM%KLON,12,9) ) +!ALLOCATE( GEMSL%ZAERLIF(KDIM%KLON,9) ) GEMSL%ZAERSRC(:,:)=0._JPRB GEMSL%ZAERDDP(:,:)=0._JPRB GEMSL%ZAERSDM(:,:)=0._JPRB @@ -77,6 +82,7 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) ALLOCATE( GEMSL%ZAERAAOTLEV(KDIM%KLON,KDIM%KLEV,6) ) ALLOCATE( GEMSL%ZAERASYLEV(KDIM%KLON,KDIM%KLEV,6) ) ALLOCATE( GEMSL%ZAERLISI(KDIM%KLON,KDIM%KLEV,NPAERLISI_WVL,NPAERLISI_VAR) ) +GEMSL%ZAERFLX_M7(:,:,:)=0._JPRB GEMSL%ZAERFLX(:,:)=0._JPRB GEMSL%ZAERLIF(:,:)=0._JPRB GEMSL%ZTAUAER(:,:,:)=0._JPRB @@ -86,6 +92,26 @@ SUBROUTINE AERO_INIT(YGFL,YDCOMPO,YDEAERATM,KDIM,GEMSL) GEMSL%ZAERASYLEV(:,:,:)=0._JPRB GEMSL%ZAERLISI(:,:,:,:)=0._JPRB + +!M7 aerosols +IF (TRIM(YDCOMPO%AERO_SCHEME)=='hamm7') THEN + ALLOCATE( GEMSL%ZAEROTAU(KDIM%KLON,KDIM%KLEV,14) ) + ALLOCATE( GEMSL%ZAEROSSA(KDIM%KLON,KDIM%KLEV,14) ) + ALLOCATE( GEMSL%ZAEROASY(KDIM%KLON,KDIM%KLEV,14) ) + ALLOCATE( GEMSL%ZAEROTAULW(KDIM%KLON,KDIM%KLEV,16) ) + GEMSL%ZAEROTAU(:,:,:)=0._JPRB + GEMSL%ZAEROSSA(:,:,:)=0._JPRB + GEMSL%ZAEROASY(:,:,:)=0._JPRB + GEMSL%ZAEROTAULW(:,:,:)=0._JPRB +ELSE + ALLOCATE( GEMSL%ZAEROTAU(1,1,1) ) + ALLOCATE( GEMSL%ZAEROSSA(1,1,1) ) + ALLOCATE( GEMSL%ZAEROASY(1,1,1) ) + ALLOCATE( GEMSL%ZAEROTAULW(1,1,1) ) +ENDIF + + + IF (TRIM(YDCOMPO%AERO_SCHEME)=='glomap') THEN ! Extra diags for GLOMAP: dry and wet diameter/volume + effective radius ALLOCATE( GEMSL%ZDRYDIAM(KDIM%KLON,KDIM%KLEV,NMODES) ) diff --git a/ifs-source/arpifs/phys_ec/callpar.F90 b/ifs-source/arpifs/phys_ec/callpar.F90 index bc157df2..300775ed 100644 --- a/ifs-source/arpifs/phys_ec/callpar.F90 +++ b/ifs-source/arpifs/phys_ec/callpar.F90 @@ -260,8 +260,9 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& & DDH_SURF_TYPE, GEMS_LOCAL_TYPE,PERTURB_LOCAL_TYPE,SURF_AND_MORE_LOCAL_TYPE,AUX_DIAG_LOCAL_TYPE,& & KEYS_LOCAL_TYPE USE COUPLING -USE YOE_PHYS_MWAVE , ONLY : N_PHYS_MWAVE +USE YOE_PHYS_MWAVE , ONLY : N_PHYS_MWAVE USE TM5_CHEM_MODULE , ONLY : NCHEM2AER +USE YOMLUN, ONLY : NULOUT ! ------------------------------------------------------------------ IMPLICIT NONE @@ -308,6 +309,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& INTEGER(KIND=JPIM) :: IFLAG, JK, JL, JSW, JEXT, ITRC, J2D, JRF REAL(KIND=JPRB) :: ZRG, ZRCPD, ZCONS, ZCONS1 +REAL(KIND=JPRB) :: ZSNOWACL(KDIM%KLON,KDIM%KLEV) ! accretion rate of snow with cloud drops REAL(KIND=JPHOOK) :: ZHOOK_HANDLE @@ -479,7 +481,8 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, LCLDBUD_TIMEINT=>YDECLDP%LCLDBUD_TIMEINT, & & LAERSOA=>YDCOMPO%LAERSOA, & & TSPHY=>YDPHY2%TSPHY, LELIGHT=>YDEPHY%LELIGHT, LESNML=>YDEPHY%LESNML,& - & NSNMLWS=>YDEPHY%NSNMLWS) + & NSNMLWS=>YDEPHY%NSNMLWS, & + & NCLOUDACT=>YDERAD%NCLOUDACT ) ! ------------------------------------------------------------------ !* 0. INITIALIZATION @@ -529,6 +532,8 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! Initialize tendency_cml (being simple copy of tendency_dyn at the moment) CALL STATE_COPY(KDIM,TENDENCY_DYN,TENDENCY_CML) +ZSNOWACL(:,:) = 0.0_JPRB ! init accretion rate of snow with cloud drop + ! ------------------------------------------------------------------ !* 1. INITIAL COMPUTATIONS. @@ -639,7 +644,9 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ALLOCATE( ZCHEM2AER(KDIM%KLON,KDIM%KLEV,NCHEM2AER) ) ZCHEM2AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,1:NCHEM2AER)=0._JPRB ELSE - ALLOCATE( ZCHEM2AER(1,1,1) ) + ! TB needed also in case of simple sulfur scheme + ALLOCATE( ZCHEM2AER(KDIM%KLON,KDIM%KLEV,NCHEM2AER) ) + ZCHEM2AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,1:NCHEM2AER)=0._JPRB ENDIF ENDIF @@ -714,7 +721,10 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& CALL SURFRAD_LAYER(YDSURF,YDMCC,YDERAD,YDEPHY,YDRIP,KDIM,PAUX,STATE_TMP,LLKEYS,AUXL,PSURF,SURFL) !* 1.9 PROGNOSTIC AEROSOLS - INITIAL COMPUTATIONS - CALL AERINI_LAYER(YDGEOMETRY,YDSURF,YDMODEL,KDIM,PAUX,STATE_TMP,YDVARS%R, YDVARS%S, PSURF,SURFL,GEMSL) + ! (currently via YDMODEL%YRML_CHEM%YRCOMPO%AERO_SCHEME + ! several aerosols schemes can be called) + CALL AERINI_LAYER( YDGEOMETRY, YDSURF, YDMODEL, KDIM, PAUX, STATE_TMP, & + & YDVARS%R, YDVARS%S, PSURF, SURFL, GEMSL, PAUX%PGAW) ELSE GEMSL%ZCFLX(KDIM%KIDIA:KDIM%KFDIA, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB GEMSL%ZTENC(KDIM%KIDIA:KDIM%KFDIA, 1:KDIM%KLEV, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB @@ -1114,7 +1124,13 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! ------------------------------------------------------ IF (NAERCLD > 0) THEN - CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) + IF ( NACTAERO /= 0 .AND. TRIM(AERO_SCHEME) == "hamm7") THEN + ! To avoid modification within cloud_layer.F90 + AUXL%ZCCN(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YCDNC%MP9_PH) ! liquid cloud condensation nuclei + AUXL%ZNICE(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV) = PGFL(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV,YGFL%YICNC%MP9_PH) ! ice number concentration (cf. CCN) + ELSE + CALL AER_CLOUD_LAYER(YDMODEL,KDIM,PAUX,STATE_T0,PDIAG,GEMSL,AUXL) + ENDIF ELSE ! routine is by-passed AUXL%ZLCRIT_AER(KDIM%KIDIA:KDIM%KFDIA,1:KDIM%KLEV)=0.0_JPRB @@ -1345,7 +1361,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& & KDIM,LLSLPHY, PAUX, PPERT, STATE_T0, & & TENDENCY_CML, TENDENCY_DYN, TENDENCY_VDF, & & PRAD, PSURF, LLKEYS, AUXL, FLUX, PDIAG, & - & YDVARS%FSD, TENDENCY_LOC) + & YDVARS%FSD, ZSNOWACL, TENDENCY_LOC) ELSE @@ -1628,7 +1644,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& IF (NACTAERO /=0 .AND. LL_HRES) THEN IF (.NOT.LAERINIT) THEN - CALL AER_PHY3_LAYER(YDSURF,YDMODEL,KDIM, PAUX, STATE_TMP, SURFL, AUXL, PDIAG, ZCHEM2AER, PGFL, PSURF, FLUX, GEMSL, PRAD) + CALL AER_PHY3_LAYER(YDSURF,YDMODEL,KDIM, PAUX, STATE_TMP, SURFL, AUXL, PDIAG, ZCHEM2AER, PGFL, PSURF, FLUX, GEMSL, PRAD, ZSNOWACL) ELSE GEMSL%ZTENC(KDIM%KIDIA:KDIM%KFDIA, 1:KDIM%KLEV, GEMSL%IAERO(1):GEMSL%IAERO(NACTAERO))=0._JPRB ENDIF @@ -1896,7 +1912,7 @@ SUBROUTINE CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,KDIM,& ! --------------------------------- ! Releasing the allocated space for local structures IF ( (NCHEM > 0 .OR. NGEMS > 0 .OR. NACTAERO > 0) .AND. LL_HRES ) THEN - DEALLOCATE(ZCHEM2AER) + IF (ALLOCATED(ZCHEM2AER)) DEALLOCATE(ZCHEM2AER) ENDIF CALL LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) diff --git a/ifs-source/arpifs/phys_ec/cloud_layer.F90 b/ifs-source/arpifs/phys_ec/cloud_layer.F90 index 93a1d472..e2483633 100644 --- a/ifs-source/arpifs/phys_ec/cloud_layer.F90 +++ b/ifs-source/arpifs/phys_ec/cloud_layer.F90 @@ -14,7 +14,7 @@ SUBROUTINE CLOUD_LAYER( & & TENDENCY_CML, TENDENCY_DYN, TENDENCY_VDF, PRAD, & & PSURF, LLKEYS, & ! Input/Output quantities - & AUXL, FLUX, PDIAG, FSD, & + & AUXL, FLUX, PDIAG, FSD, PSNOWACL, & ! Output tendencies & TENDENCY_LOC) @@ -123,6 +123,7 @@ SUBROUTINE CLOUD_LAYER( & TYPE (AUX_DIAG_TYPE) , INTENT(INOUT) :: PDIAG TYPE (VARIABLE_3D) , INTENT(INOUT) :: FSD TYPE (STATE_TYPE) , INTENT(INOUT) :: TENDENCY_LOC +REAL(KIND=JPRB) , INTENT(INOUT) :: PSNOWACL(KDIM%KLON,KDIM%KLEV) ! accretion rate of snow with cloud droplets !----------------------------------------------------------------------- INTEGER(KIND=JPIM) :: JRF, JL, JK REAL(KIND=JPRB) :: ZGP2DSPP(KDIM%KLON, YDSPP_CONFIG%SM%NRFTOTAL) !SPP pattern @@ -138,8 +139,10 @@ SUBROUTINE CLOUD_LAYER( & ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('CLOUD_LAYER',0,ZHOOK_HANDLE) -ASSOCIATE(TSPHY=>YDPHY2%TSPHY, & - & YSD_VF=>YDSURF%YSD_VF, YSD_VD=>YDSURF%YSD_VD) +ASSOCIATE(& + & TSPHY =>YDPHY2%TSPHY, & + & YSD_VF=>YDSURF%YSD_VF, YSD_VD=>YDSURF%YSD_VD ) + ! ------------------------------------------------------------------------------ ! @@ -151,6 +154,8 @@ SUBROUTINE CLOUD_LAYER( & ZGP2DSPP(JL,JRF)=PPERT%PGP2DSPP(JL,1,JRF) ENDDO ENDDO +!-->eehol: add CDNC from PGFL field + ZFSD(:,:)=0.0_JPRB @@ -188,7 +193,7 @@ SUBROUTINE CLOUD_LAYER( & & FLUX%PFSQRF, FLUX%PFSQSF , FLUX%PFCQRNG, FLUX%PFCQSNG,& & FLUX%PFSQLTUR, FLUX%PFSQITUR , & & FLUX%PFPLSL, FLUX%PFPLSN, FLUX%PFHPSL, FLUX%PFHPSN,& - & PSURF%PSD_XA, KDIM%KFLDX) + & PSURF%PSD_XA, KDIM%KFLDX, PSNOWACL) IF(YDEPHY%LRAD_CLOUD_INHOMOG) THEN DO JK=1,KDIM%KLEV diff --git a/ifs-source/arpifs/phys_ec/cloudsc.F90 b/ifs-source/arpifs/phys_ec/cloudsc.F90 index 955a790e..9bd5070e 100644 --- a/ifs-source/arpifs/phys_ec/cloudsc.F90 +++ b/ifs-source/arpifs/phys_ec/cloudsc.F90 @@ -40,7 +40,7 @@ SUBROUTINE CLOUDSC & & PFSQRF, PFSQSF , PFCQRNG, PFCQSNG, & & PFSQLTUR, PFSQITUR , & & PFPLSL, PFPLSN, PFHPSL, PFHPSN, & - & PEXTRA, KFLDX) + & PEXTRA, KFLDX, PSNOWACL) !=============================================================================== !**** *CLOUDSC* - ROUTINE FOR PARAMETRIZATION OF CLOUD PROCESSES @@ -267,6 +267,7 @@ SUBROUTINE CLOUDSC & REAL(KIND=JPRB) ,INTENT(OUT) :: PFPLSN(KLON,KLEV+1) ! ice+snow sedim flux REAL(KIND=JPRB) ,INTENT(OUT) :: PFHPSL(KLON,KLEV+1) ! Enthalpy flux for liq REAL(KIND=JPRB) ,INTENT(OUT) :: PFHPSN(KLON,KLEV+1) ! Enthalp flux for ice +REAL(KIND=JPRB) ,INTENT(INOUT) :: PSNOWACL(KLON,KLEV) ! accretion rate of snow with cloud droplets ! Extra fields for diagnostics REAL(KIND=JPRB) ,INTENT(INOUT) :: PEXTRA(KLON,KLEV,KFLDX) ! extra fields INTEGER(KIND=JPIM),INTENT(IN) :: KFLDX ! Number of extra fields @@ -663,7 +664,8 @@ SUBROUTINE CLOUDSC & & RCL_INHOMOGAUT => YDECLDP%RCL_INHOMOGAUT, & & RCL_INHOMOGACC => YDECLDP%RCL_INHOMOGACC, & & RCL_OVERLAPLIQICE => YDECLDP%RCL_OVERLAPLIQICE, & - & RCL_EFFRIME => YDECLDP%RCL_EFFRIME ) + & RCL_EFFRIME => YDECLDP%RCL_EFFRIME, & + & NCLOUDACT => YDERAD%NCLOUDACT) !=============================================================================== @@ -2008,20 +2010,36 @@ SUBROUTINE CLOUDSC & IF (LLPERT_RCLCRIT) THEN !Apply SPP perturbations IF (PLSM(JL) > 0.5_JPRB) THEN - ZCONST = RCL_KK_CLOUD_NUM_LAND + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) ! CDNC from the cloud activation scheme + ELSE + ZCONST = RCL_KK_CLOUD_NUM_LAND ! constant value over land + END IF ! perturbed land value of RCLCRIT ZLCRIT = RCLCRIT_LAND*EXP(PN1RCLCRIT%MU(1)+PN1RCLCRIT%XMAG(1)*PGP2DSPP(JL, IPRCLCRIT)) ELSE - ZCONST = RCL_KK_CLOUD_NUM_SEA + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) + ELSE + ZCONST = RCL_KK_CLOUD_NUM_SEA ! constant value over ocean + END IF ! perturbed ocean value of RCLCRIT ZLCRIT = RCLCRIT_SEA *EXP(PN1RCLCRIT%MU(2)+PN1RCLCRIT%XMAG(2)*PGP2DSPP(JL, IPRCLCRIT)) ENDIF ELSE IF (PLSM(JL) > 0.5_JPRB) THEN ! land (unperturbed) - ZCONST = RCL_KK_CLOUD_NUM_LAND + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) ! CDNC from the cloud activation scheme + ELSE + ZCONST = RCL_KK_CLOUD_NUM_LAND ! constant value over land + END IF ZLCRIT = RCLCRIT_LAND ELSE ! ocean (unperturbed) - ZCONST = RCL_KK_CLOUD_NUM_SEA + IF (NCLOUDACT > 0) THEN + ZCONST = MAX(1.0_JPRB,PCCN(JL,JK)) + ELSE + ZCONST = RCL_KK_CLOUD_NUM_SEA ! constant value over ocean + END IF ZLCRIT = RCLCRIT_SEA ENDIF ENDIF @@ -2390,7 +2408,7 @@ SUBROUTINE CLOUDSC & !-------------------------------------------------------------- ZSUPERSATICE = (ZQSLIQ(JL,JK)-ZQSICE(JL,JK))/ZQSICE(JL,JK) - IF (ZTP1(JL,JK)<(RTT-5._JPRB) .AND. ZQXFG(JL,NCLDQL)>RLMIN) THEN ! T<273K + IF (ZTP1(JL,JK)>=RTHOMO .AND. ZTP1(JL,JK)<(RTT-5._JPRB) .AND. ZQXFG(JL,NCLDQL)>RLMIN) THEN ! 235.15=YDMODEL%YRML_PHY_RAD%YRERAD, YDPHYAER => YDMODEL%YRML_PHY_AER, & + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP& + ) + +ASSOCIATE(NSTADD=>YDRIP%NSTADD, TSTEP=>YDRIP%TSTEP) + +ASSOCIATE(YDAERSTRAT => YDPHYAER%YREAEROSTRAT) + +ASSOCIATE(& + & LSTRATAERO_UPDATED=>YDERAD%LSTRATAERO_UPDATED, CCMIP_STRAT_FULL=>YDERAD%CCMIP_STRAT_FULL, & + & CCMIP_STRAT_FULL_CLIM=>YDERAD%CCMIP_STRAT_FULL_CLIM, & + & LCMIP_STRATAER_BCKGD =>YDERAD%LCMIP_STRATAER_BCKGD, & + & LCMIP_STRATAER_CMIP6 =>YDERAD%LCMIP_STRATAER_CMIP6, & + & LCMIP_STRATAER_CMIP7 =>YDERAD%LCMIP_STRATAER_CMIP7 & + ) + +ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN,REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN, & + & AOD_SUN_MEAN=>YDAERSTRAT%AOD_SUN_MEAN, AAOD_SUN_MEAN=>YDAERSTRAT%AAOD_SUN_MEAN,REFAOD_SUN_MEAN=>YDAERSTRAT%REFAOD_SUN_MEAN, & + & AAOD_EARTH_MEAN=>YDAERSTRAT%AAOD_EARTH_MEAN, AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH& + ) + +! Number of steps since start of integration +IF(.NOT.LNF.AND.NSTADD == 0) THEN ! is restart + IF (YDDYNA%LTWOTL) THEN + IZT=NINT(TSTEP*(REAL(NSTAR2,JPRB)+0.5_JPRB), KIND=JPIB) + ELSE + ITIME=NINT(TSTEP, KIND=JPIB) + IZT=ITIME*INT(NSTAR2, KIND=JPIB) + ENDIF + ISTADD=INT(IZT/NINT(RDAY, KIND=JPIB), KIND=JPIM) +ELSE + ISTADD=NSTADD +ENDIF + +IJ0=NDD(NINDAT) +IM0=NMM(NINDAT) +IA0=NCCAA(NINDAT) +CALL UPDCAL(IJ0,IM0,IA0,ISTADD,IDAY,IMON,IMODYR,ILMOIS,NULOUT) + +! Open the file only if we begin a new month and I am the master process +NEWMONTH: IF (IMON/=IMONOLD) THEN + IMONOLD=IMON + + ROOT: IF (MYPROC==RPRC) THEN + + ! Forcing file includes 1980 months since 1850-01 for CMIP6, and 3288 months starting on 1750-01 for CMIP7 + FORC_MONTH=(IMODYR-STRATO_FIRSTYEAR)*12+IMON + !WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO: FORCING MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + !WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL) + + ! Check on transient file + LLOPEN=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL,IOSTAT=IOS,EXIST=LLSTRAT,OPENED=LLOPEN) + LLSTRAT = LLSTRAT .AND. (IOS == 0) .AND. .NOT.LLOPEN + + IF (.NOT.LLSTRAT) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE FORCING FILE IS NOT AVAILABLE OR ALREADY OPENED !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + + ! Any available month except 1st or last + AVAIL: IF (IMODYR>=STRATO_FIRSTYEAR .AND. IMODYR<=STRATO_LASTYEAR .AND. .NOT. LCMIP_STRATAER_BCKGD .AND. FORC_MONTH/=1 .AND. FORC_MONTH/=STRATO_CMIP_NTIME) THEN + + WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO [1]: GETTING FORCING FOR MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + WRITE(NULOUT,FMT='('' CCMIP_STRAT_FULL = '',A)') TRIM(CCMIP_STRAT_FULL) + + START=(/1, 1, 1, FORC_MONTH-1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NMONTH)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Fill the data for the current month and reorder the arrays + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + DO IMONTH=1,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ! Special cases of 1st and last available month + ELSE IF (.NOT. LCMIP_STRATAER_BCKGD .AND. (FORC_MONTH==1 .OR. FORC_MONTH==STRATO_CMIP_NTIME)) THEN + IF(LCMIP_STRATAER_CMIP6) THEN + WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO [2]: GETTING FORCING FOR MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + WRITE(NULOUT,*)'CMIP_STRATO_AERO [1] computing CMIP6 climatological stratospheric forcing' + + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Climatology computed on-line. Transition between climatological and time-resolved stratospheric forcing + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + + AOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + AAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + REFAOD_SUN_MEAN(ILEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + + IF (FORC_MONTH==1) THEN + + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_MEAN(ILEV,ILAT,IB) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_MEAN(ILEV,ILAT,IB) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) + + DO IMONTH=2,STRATO_CMIP_NMONTH + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + + ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_MEAN(ILEV,ILAT,IB) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_MEAN(ILEV,ILAT,IB) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_MEAN(ILEV,ILAT,IB) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + ENDDO + + ENDIF + ENDDO + + ! LW parameters + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH_MEAN(ILEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,JLEV,:))/STRATO_CMIP_NTIME + IF (FORC_MONTH==1) THEN + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + ELSE IF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_MEAN(ILEV,ILAT,IB) + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,STRATO_CMIP_NTIME+IMONTH-2) + ENDDO + ENDIF + ENDDO + + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ELSEIF (LCMIP_STRATAER_CMIP7) THEN + + ! Check on climatology file + WRITE(NULOUT,*) 'CMIP7 CCMIP_STRAT_FULL_CLIM: ',TRIM(CCMIP_STRAT_FULL_CLIM) + LLOPENC=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) + LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC + + IF (.NOT.LLSTRATC) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE CMIP7 CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + + WRITE(NULOUT,'(A,I4,A,I4,A,I4)') 'CMIP_STRATO_AERO [2]: GETTING FORCING FOR MONTH NB= ', FORC_MONTH, '/', STRATO_CMIP_NTIME, ', starting from the year ', STRATO_FIRSTYEAR + WRITE(NULOUT,*) 'CCMIP_STRAT_FULL: ',TRIM(CCMIP_STRAT_FULL) + + IF (FORC_MONTH==1) THEN + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + DO IMONTH=2,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH-1) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH-1) + ENDDO + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + !Climatological file + START=(/1, 1, 1, 12/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + + + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) + + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + !December 2023 + ELSEIF (FORC_MONTH==STRATO_CMIP_NTIME) THEN + START=(/1, 1, 1, STRATO_CMIP_NTIME-1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,2)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + !Climatological file + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,1)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + + + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) + + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) + ENDDO + ENDDO + ENDDO + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ENDIF ! 1st or last month of CMIP7 + ENDIF ! CMIP6 or CMIP7 + + ELSE ! PURE CLIMATOLOGY CASES (IMODYR<1850/1750 .OR. IMODYR>2014/2023 .OR. LCMIP_STRATAER_BCKGD) + + CMIP: IF(LCMIP_STRATAER_CMIP6) THEN + + IF (MINVAL(AOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_SUN_MEAN)==CHECK_SUN_MEAN & + & .OR. MINVAL(REFAOD_SUN_MEAN)==CHECK_SUN_MEAN .OR. MINVAL(AAOD_EARTH_MEAN)==CHECK_EARTH_MEAN) THEN + + WRITE(NULOUT,*)'CMIP_STRATO_AERO [2] computing CMIP6 climatological stratospheric forcing' + + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL ) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Climatology computed on-line, only once + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + AOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + AAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(AAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + REFAOD_SUN_MEAN(JLEV,ILAT,IB)=SUM(REFAOD_SUN_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + ENDDO + ! LW parameters + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH_MEAN(JLEV,ILAT,IB)=SUM(AAOD_EARTH_ORIG(IB,ILAT,ILEV,:))/STRATO_CMIP_NTIME + ENDDO + ENDDO + ENDDO + + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + + ENDIF + + WRITE(NULOUT,*)'CMIP_STRATO_AERO: using CMIP6 climatological stratospheric forcing' + DO IMONTH=1,STRATO_CMIP_NMONTH + ! SW parameters + AOD_SUN(:,:,:,IMONTH)=AOD_SUN_MEAN(:,:,:) + AAOD_SUN(:,:,:,IMONTH)=AAOD_SUN_MEAN(:,:,:) + REFAOD_SUN(:,:,:,IMONTH)=REFAOD_SUN_MEAN(:,:,:) + ! LW parameters + AAOD_EARTH(:,:,:,IMONTH)=AAOD_EARTH_MEAN(:,:,:) + ENDDO + + ELSEIF (LCMIP_STRATAER_CMIP7) THEN + + WRITE(NULOUT,*) 'CMIP_STRATO_AERO: Reading CMIP7 climatological stratospheric forcing (3 months)' + WRITE(NULOUT,FMT='('' CMIP7 CCMIP_STRAT_FULL_CLIM = '',A)') TRIM(CCMIP_STRAT_FULL_CLIM) + LLOPENC=.FALSE. + IOS= 0 + INQUIRE(FILE=CCMIP_STRAT_FULL_CLIM,IOSTAT=IOS,EXIST=LLSTRATC,OPENED=LLOPENC) + LLSTRATC = LLSTRATC .AND. (IOS == 0) .AND. .NOT.LLOPENC + + IF (.NOT.LLSTRATC) THEN + WRITE(NULERR,'('' ERROR IN CMIP_STRATO_AERO.F90 :'',& + & '' THE CMIP7 CLIMATOLOGICAL FORCING FILE IS NOT AVAILABLE OR ALREADY OPENED !'')') + CALL ABOR1('CMIP_STRATO_AERO') + ENDIF + + !Climatological file for CMIP7 - All months are readed + START=(/1, 1, 1, 1/) + FINAL=(/STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + FINAL_LW=(/STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12/) + + ! Allocate temporary arrays + ALLOCATE(AOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(AAOD_SUN_ORIG (STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(REFAOD_SUN_ORIG(STRATO_CMIP_NSB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + ALLOCATE(AAOD_EARTH_ORIG(STRATO_CMIP_NTB,STRATO_CMIP_NLAT,STRATO_CMIP_NALT,12)) + + ! Initialise arrays: + AOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_SUN_ORIG(:,:,:,:)=0._JPRB + REFAOD_SUN_ORIG(:,:,:,:)=0._JPRB + AAOD_EARTH_ORIG(:,:,:,:)=0._JPRB + + ! OPEN NETCDF FILE + CALL CHECK( NF90_OPEN(CCMIP_STRAT_FULL_CLIM,NF90_NOWRITE,IUNIT) ) + + ! Reading latitudes needed for the interpolation. + CALL CHECK( NF90_INQ_VARID(IUNIT, LAT_NAME, LAT_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, LAT_VARID, STRATO_CMIP_LAT) ) + + ! READ 4-D FIELDS + CALL CHECK( NF90_INQ_VARID(IUNIT, AOD_SUN_NAME, AOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AOD_SUN_VARID, AOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_SUN_NAME, AAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_SUN_VARID, AAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, REFAOD_SUN_NAME, REFAOD_SUN_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, REFAOD_SUN_VARID, REFAOD_SUN_ORIG, START, FINAL) ) + + CALL CHECK( NF90_INQ_VARID(IUNIT, AAOD_EARTH_NAME, AAOD_EARTH_VARID) ) + CALL CHECK( NF90_GET_VAR(IUNIT, AAOD_EARTH_VARID, AAOD_EARTH_ORIG, START, FINAL_LW) ) + + ! CLOSE NETCDF FILE + CALL CHECK( NF90_CLOSE(IUNIT) ) + + ! Fill the data for the current month and reorder the arrays + IF (IMON==1)THEN + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + AOD_SUN(ILEV,ILAT,IB,1)=AOD_SUN_ORIG(IB,ILAT,JLEV,12) + AAOD_SUN(ILEV,ILAT,IB,1)=AAOD_SUN_ORIG(IB,ILAT,JLEV,12) + REFAOD_SUN(ILEV,ILAT,IB,1)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,12) + DO IMONTH=2,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + AAOD_EARTH(ILEV,ILAT,IB,1)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,12) + DO IMONTH=2,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + + ELSEIF(IMON==12) THEN + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + AOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,1) + AAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,1) + REFAOD_SUN(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,1) + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + + DO IMONTH=1,STRATO_CMIP_NMONTH-1 + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + AAOD_EARTH(ILEV,ILAT,IB,STRATO_CMIP_NMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,1) + ENDDO + ENDDO + ENDDO + + ELSE + DO ILEV=1,STRATO_CMIP_NALT + JLEV=STRATO_CMIP_NALT-ILEV+1 + DO ILAT=1,STRATO_CMIP_NLAT + ! SW parameters + DO IB=1,STRATO_CMIP_NSB + ! We keep three months to make a smoothed forcing (linear interpolation along the axis time) + DO IMONTH=1,STRATO_CMIP_NMONTH + + AOD_SUN(ILEV,ILAT,IB,IMONTH)=AOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + AAOD_SUN(ILEV,ILAT,IB,IMONTH)=AAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + REFAOD_SUN(ILEV,ILAT,IB,IMONTH)=REFAOD_SUN_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + + ENDDO + ENDDO + ! LW parameter + DO IB=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + AAOD_EARTH(ILEV,ILAT,IB,IMONTH)=AAOD_EARTH_ORIG(IB,ILAT,JLEV,IMON-2+IMONTH) + ENDDO + ENDDO + ENDDO + ENDDO + ENDIF !IMON + DEALLOCATE(AOD_SUN_ORIG ) + DEALLOCATE(AAOD_SUN_ORIG ) + DEALLOCATE(REFAOD_SUN_ORIG) + DEALLOCATE(AAOD_EARTH_ORIG) + ENDIF CMIP + ENDIF AVAIL + ENDIF ROOT + + CALL BROADCAST_AER_CMIP_PROP(YDMODEL) + LSTRATAERO_UPDATED = .TRUE. ! In effect it means "need remapping" + +ENDIF NEWMONTH + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO',1,ZHOOK_HANDLE) + +CONTAINS + + SUBROUTINE CHECK(STATUS) + INTEGER, INTENT ( IN) :: STATUS + + IF(STATUS /= NF90_NOERR) THEN + CALL ABOR1('CMIP_STRATO_AERO: '//TRIM(NF90_STRERROR(STATUS))) + END IF + END SUBROUTINE CHECK + +!-------------------------------------------------------------------------------------------------------------- + + SUBROUTINE BROADCAST_AER_CMIP_PROP(YDMODEL) + !--- inherited types, functions and data + USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK + USE MPL_MODULE, ONLY: MPL_BROADCAST + + USE YOEAEROP, ONLY: STRATO_CMIP_LAT + USE TYPE_MODEL, ONLY: MODEL + + IMPLICIT NONE + + TYPE(MODEL), INTENT(INOUT) :: YDMODEL + !---local data + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + !---executable procedure + IF (LHOOK) CALL DR_HOOK('BROADCAST_AER_CMIP_PROP',0,ZHOOK_HANDLE) + + ASSOCIATE(& + & YDPHYAER => YDMODEL%YRML_PHY_AER & + ) + + ASSOCIATE(& + & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & + ) + + ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN, & + & AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH,REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN& + ) + + CALL MPL_BROADCAST(AOD_SUN, KTAG=ITAG+1,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-1: ') + CALL MPL_BROADCAST(AAOD_SUN, KTAG=ITAG+2,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-2: ') + CALL MPL_BROADCAST(REFAOD_SUN, KTAG=ITAG+3,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-3: ') + CALL MPL_BROADCAST(AAOD_EARTH, KTAG=ITAG+4,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-4: ') + CALL MPL_BROADCAST(STRATO_CMIP_LAT, KTAG=ITAG+5,KROOT=RPRC,CDSTRING='AER_CMIP_PROP-5: ') + END ASSOCIATE + END ASSOCIATE + END ASSOCIATE + IF (LHOOK) CALL DR_HOOK('BROADCAST_AER_CMIP_PROP',1,ZHOOK_HANDLE) + END SUBROUTINE BROADCAST_AER_CMIP_PROP + +END SUBROUTINE CMIP_STRATO_AERO diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 new file mode 100755 index 00000000..7fc87c93 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero_interp.F90 @@ -0,0 +1,324 @@ +SUBROUTINE CMIP_STRATO_AERO_INTERP & +&(YDMODEL, KIDIA, KFDIA, KLON ,KLEV, & +& KRINT, KSHIFT, & +& PAPRS, PGELAM, PSINLAT, & +& STRATAOD, STRATAAOD, STRATREFAOD, & +& STRATAAOD_LW) + +! PURPOSE. +! -------- + +! INTERFACE. +! ---------- +! CALL *CMIP_STRATO_AERO_INTERP* FROM *RADLSWR* + +! AUTHOR. +! ------- +! M.Ménégoz for EC-EARTH 2017 +! A.Laakso for EC-EARTH4/OIFS 2022 +! +! Horizontal interpolation of the stratospheric aerosol CMIP +! dataset. The data need to have the correct vertical resolution. +! The vertical interpolation is done off-line. +! The horizontal interpolation id done on-line. +! In the SW, the triplet (AOD, AAOD, REFAOD) is used +! In the LW, only AAOD is used, since only the aerosol absorption +! is taken into account in IFS (aerosol scattering neglected in +! the LW in IFS) + +! MODIFICATIONS. +! -------------- + +!--------------------------------------------------------------------- + +!--- inherited types, functions and data +USE PARKIND1, ONLY: JPIM, JPRB, JPRD +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE YOMLUN, ONLY: NULOUT, NULERR +USE YOMCST, ONLY: RPI +USE YOMMP0, ONLY: MYPROC + +USE YOEAEROP, ONLY: STRATO_CMIP_NLAT, STRATO_CMIP_NALT, STRATO_CMIP_NTIME, & + & STRATO_CMIP_LAT, STRATO_CMIP_SB, STRATO_CMIP_TB, & + & STRATO_CMIP_NSB, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH + +USE YOMCT3, ONLY: NSTEP +USE TYPE_MODEL, ONLY: MODEL + +IMPLICIT NONE +TYPE(MODEL), INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KRINT +INTEGER(KIND=JPIM),INTENT(IN) :: KSHIFT +REAL(KIND=JPRB) ,INTENT(IN) :: PAPRS(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PSINLAT(KLON) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATAOD(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATAAOD(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATREFAOD(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT) :: STRATAAOD_LW(KLON,KLEV,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH) + +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +INTEGER(KIND=JPIM), PARAMETER :: RPRC = 1 + +REAL(KIND=JPRB) :: ZSTRATAOD(KLON,KLEV) +REAL(KIND=JPRB) :: ZSTRATAAOD(KLON,KLEV) +REAL(KIND=JPRB) :: ZSTRATREFAOD(KLON,KLEV) +REAL(KIND=JPRB) :: ZSTRATAAOD_LW(KLON,KLEV) + +REAL(KIND=JPRB) :: ZAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZAAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZREFAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZAAOD_EARTH(STRATO_CMIP_NALT, STRATO_CMIP_NLAT) + +REAL(KIND=JPRB) :: ZLAT(KLON) +REAL(KIND=JPRB) :: ZGLAT(KLON) +REAL(KIND=JPRB) :: ZGLON(KLON) +REAL(KIND=JPRB) :: ZRPI +INTEGER(KIND=JPIM) :: IMONTH, ILEV +INTEGER(KIND=JPIM) :: JN, JL, JK + +REAL, POINTER :: AOD_SUN(:,:,:,:), AAOD_SUN(:,:,:,:), AAOD_EARTH(:,:,:,:), REFAOD_SUN(:,:,:,:) +REAL, POINTER :: STRATO_CMIP_ALT(:) + +!---executable procedure +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_INTERP',0,ZHOOK_HANDLE) + +WRITE(NULOUT,*)'Entering Subroutine CMIP_STRATO_AERO_INTERP' + +ASSOCIATE(& + & YDPHYAER => YDMODEL%YRML_PHY_AER & + ) + +ASSOCIATE(& + & YDAERSTRAT => YDPHYAER%YREAEROSTRAT & + ) + +ASSOCIATE(& + & AOD_SUN=>YDAERSTRAT%AOD_SUN,AAOD_SUN=>YDAERSTRAT%AAOD_SUN, & + & AAOD_EARTH=>YDAERSTRAT%AAOD_EARTH,STRATO_CMIP_ALT=>YDAERSTRAT%STRATO_CMIP_ALT,& + & REFAOD_SUN=>YDAERSTRAT%REFAOD_SUN& + ) + + STRATAOD(KIDIA:KFDIA,:,:,:)=0._JPRB + STRATAAOD(KIDIA:KFDIA,:,:,:)=0._JPRB + STRATREFAOD(KIDIA:KFDIA,:,:,:)=0._JPRB + STRATAAOD_LW(KIDIA:KFDIA,:,:,:)=0._JPRB + ZAOD_SUN(KIDIA:KFDIA,:)=0._JPRB + ZAAOD_SUN(KIDIA:KFDIA,:)=0._JPRB + ZREFAOD_SUN(KIDIA:KFDIA,:)=0._JPRB + ZAAOD_EARTH(KIDIA:KFDIA,:)=0._JPRB + + ZSTRATAOD(KIDIA:KFDIA,:)=0._JPRB + ZSTRATAAOD(KIDIA:KFDIA,:)=0._JPRB + ZSTRATREFAOD(KIDIA:KFDIA,:)=0._JPRB + ZSTRATAAOD_LW(KIDIA:KFDIA,:)=0._JPRB + + ZRPI=1.0_JPRB/RPI + DO JL=KIDIA,KFDIA + ZLAT(JL) = ASIN(PSINLAT(JL)) + ZGLAT(JL)= ZLAT(JL) * 180._JPRB*ZRPI + ZGLON(JL)= PGELAM(JL) * 180._JPRB*ZRPI + END DO + + IF (MYPROC==RPRC) WRITE(NULOUT,*) 'Interpolating stratospheric aerosol optical properties' + + DO JN=1,STRATO_CMIP_NSB + DO IMONTH=1,STRATO_CMIP_NMONTH + IF (STRATO_CMIP_NALT == KLEV) THEN + ! No vertical regridding, therefore no conversion to intensive properties + ZAOD_SUN(:,:)=AOD_SUN(:,:,JN,IMONTH) + ZAAOD_SUN(:,:)=AAOD_SUN(:,:,JN,IMONTH) + ZREFAOD_SUN(:,:)=REFAOD_SUN(:,:,JN,IMONTH) + ELSE + WRITE(NULERR,*) 'MITKA', STRATO_CMIP_NALT, KLEV + CALL ABOR1('Number of levels of stratospheric aerosol CMIP forcing unequal to model resolution!') + ENDIF + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZAOD_SUN, ZSTRATAOD ) + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZAAOD_SUN, ZSTRATAAOD ) + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZREFAOD_SUN, ZSTRATREFAOD) + + DO JL=KIDIA,KFDIA,KRINT + STRATAOD(JL,:,JN,IMONTH)=ZSTRATAOD(JL,:) + STRATAAOD(JL,:,JN,IMONTH)=ZSTRATAAOD(JL,:) + STRATREFAOD(JL,:,JN,IMONTH)=ZSTRATREFAOD(JL,:) + END DO + + END DO + END DO + + DO JN=1,STRATO_CMIP_NTB + DO IMONTH=1,STRATO_CMIP_NMONTH + IF (STRATO_CMIP_NALT == KLEV) THEN + ! No vertical regridding, therefore no conversion to intensive properties + ZAAOD_EARTH(:,:)=AAOD_EARTH(:,:,JN,IMONTH) + ELSE + CALL ABOR1('Number of levels of stratospheric aerosol CMIP forcing unequal to model resolution!') + ENDIF + + CALL INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, STRATO_CMIP_LAT, & + & PAPRS, ZAAOD_EARTH, ZSTRATAAOD_LW ) + + DO JL=KIDIA,KFDIA,KRINT + STRATAAOD_LW(JL,:,JN,IMONTH)=ZSTRATAAOD_LW(JL,:) + END DO + END DO + END DO + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE +WRITE(NULOUT,*)'Leaving Subroutine CMIP_STRATO_AERO_INTERP' + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_INTERP',1,ZHOOK_HANDLE) + + +CONTAINS + + !-------------------------------------------------------------------------------------------------------------- + SUBROUTINE INTERPOLATE_STRATAERO(KIDIA, KFDIA, KLON, KLEV, KRINT, KSHIFT, & + & PGELAM, PSINLAT, PSTRATO_CMIP_LAT, & + & PAPRS, PIN_FIELD, POUT_FIELD ) + +USE YOMHOOK, ONLY : LHOOK, DR_HOOK +USE YOMLUN, ONLY : NULOUT +USE YOMCST, ONLY : RPI +!---subroutine interface +INTEGER(KIND=JPIM), INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM), INTENT(IN) :: KLON +INTEGER(KIND=JPIM), INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KRINT +INTEGER(KIND=JPIM),INTENT(IN) :: KSHIFT +REAL(KIND=JPRB), INTENT(IN) :: PGELAM(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PSINLAT(KLON) +REAL(KIND=JPRB), INTENT(IN) :: PSTRATO_CMIP_LAT(STRATO_CMIP_NLAT) +REAL(KIND=JPRB), INTENT(IN) :: PIN_FIELD(STRATO_CMIP_NALT,STRATO_CMIP_NLAT) +REAL(KIND=JPRB), INTENT(IN) :: PAPRS(KLON,KLEV+1) + +REAL(KIND=JPRB), INTENT(OUT) :: POUT_FIELD(KLON,KLEV) +!---local data +INTEGER(KIND=JPIM) :: IINLA1(KLON), IINLA2(KLON) +INTEGER(KIND=JPIM) :: IINLO1(KLON), IINLO2(KLON) +INTEGER(KIND=JPIM) :: IL, JL, JLR, JK +INTEGER(KIND=JPIM) :: INLA1, INLA2, INLO1, INLO2, ILEV, INLA + +REAL(KIND=JPRB) :: ZSILAT(KLON) +REAL(KIND=JPRB) :: ZLON(KLON) +REAL(KIND=JPRB) :: ZNLO1(KLON) +REAL(KIND=JPRB) :: ZNLO2(KLON) + +REAL(KIND=JPRB) :: ZGELAM(KLON) +REAL(KIND=JPRB) :: ZAER1, ZAER2,ZRPI, Z2PI, ZZRPI +REAL(KIND=JPRB) :: ZAERLEV1, ZAERLEV2 + +REAL(KIND=JPRB) :: ZSINT + +REAL(KIND=JPRB) :: ZSINR(STRATO_CMIP_NLAT) +REAL(KIND=JPRB) :: ZGRIDR, ZLATR, ZDLONR + +!---local data +REAL(KIND=JPRB) :: ZOUT_FIELD(KLON, STRATO_CMIP_NALT) +REAL(KIND=JPRB) :: ZP_STR_LEV(KLON, STRATO_CMIP_NALT) +REAL(KIND=JPRB) :: ZINFIELD(KLON, STRATO_CMIP_NALT) +REAL(KIND=JPRB) :: ZPRE(KLON) + +REAL(KIND=JPRB) :: ZRRR +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +#include "abor1.intfb.h" +POUT_FIELD(:,:)=0._JPRB +!ZOUT_FIELD(:,:)=0._JPRB +IINLA1(:)=0 +IINLA2(:)=0 +ZSILAT(:)=0._JPRB +ZAER1=0._JPRB +!---executable procedure +IF (LHOOK) CALL DR_HOOK('INTERPOLATE_STRATAERO',0, ZHOOK_HANDLE) + +!================================================================================================ +! +ZRPI=RPI/180.0_JPRB +Z2PI=2._JPRB*RPI +ZZRPI=180._JPRB/RPI +ZSINR(:) = SIN(ZRPI*PSTRATO_CMIP_LAT(:)) + +!-- latitudinal interpolation +IL=KSHIFT +DO JL=KIDIA,KFDIA,KRINT + IL=IL+1 + IINLA1(IL)=0 + IINLA2(IL)=0 + ZSILAT(IL)=-9999._JPRB + ZSINT=PSINLAT(JL) + IF (ZSINT <= ZSINR(1)) THEN + INLA=1 + IINLA1(IL)=1 + IINLA2(IL)=1 + ZSILAT(IL)=0._JPRB + ENDIF + IF (ZSINT >= ZSINR(STRATO_CMIP_NLAT)) THEN + INLA=STRATO_CMIP_NLAT + IINLA1(IL)=STRATO_CMIP_NLAT + IINLA2(IL)=STRATO_CMIP_NLAT + ZSILAT(IL)=0._JPRB + ENDIF + + DO JLR=1,STRATO_CMIP_NLAT-1 + + IF (ZSINT >= ZSINR(JLR) .AND. ZSINT < ZSINR(JLR+1)) THEN + INLA=JLR + IINLA1(IL)=JLR + IINLA2(IL)=JLR+1 + ZSILAT(IL)=(ZSINT-ZSINR(INLA))/(ZSINR(INLA+1)-ZSINR(INLA)) + ENDIF + + ENDDO + + !IF (INLA == 0) THEN + IF (IINLA1(IL) == 0 .OR. IINLA2(IL) == 0) THEN + CALL ABOR1(' Problem with lat. interpolation in in CMIP_strato_aero_interp!') + ENDIF +ENDDO + +DO JK=1,STRATO_CMIP_NALT + !-- compute interpolated field + IL=KSHIFT + DO JL=KIDIA,KFDIA, KRINT + IL=IL+1 + INLA1=IINLA1(IL) + INLA2=IINLA2(IL) + + ZAER1=PIN_FIELD(JK,INLA1) & + & +ZSILAT(IL)*(PIN_FIELD(JK,INLA2)-PIN_FIELD(JK,INLA1)) + POUT_FIELD(IL,JK)=ZAER1 + + END DO +END DO ! JK (vertical loop) + +!================================================================================================ +! DO JL=KIDIA,KFDIA, KRINT +! POUT_FIELD(JL,:) = ZOUT_FIELD(JL,:) +! END DO + +!================================================================================================ + +IF (LHOOK) CALL DR_HOOK('INTERPOLATE_STRATAERO',1,ZHOOK_HANDLE) +END SUBROUTINE INTERPOLATE_STRATAERO + !-------------------------------------------------------------------------------------------------------------- + +END SUBROUTINE CMIP_STRATO_AERO_INTERP diff --git a/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 new file mode 100755 index 00000000..2f50c6ae --- /dev/null +++ b/ifs-source/arpifs/phys_ec/cmip_strato_aero_process.F90 @@ -0,0 +1,251 @@ +SUBROUTINE CMIP_STRATO_AERO_PROCESS & +&(YDMODEL, KIDIA , KFDIA , KLON , KLEV, & +& KRINT , KSHIFT, & +& KINDAT,KSTADD, & +& PAPF, PAPRS , ZPT, ZPTH, PGELAM, & +& STRATAOD_M, STRATAAOD_M, STRATREFAOD_M, STRATAAOD_LW_M, & +& STRATAOD , STRATAAOD , STRATREFAOD, STRATAAOD_LW, TROPOPAUSE ) + +! PURPOSE. +! -------- + +! INTERFACE. +! ---------- +! CALL *CMIP_STRATO_AERO_PROCESS* FROM *RADLSWR* + +! AUTHOR. +! ------- +! M.Ménégoz for EC-EARTH 2017 +! A.Laakso for EC-EARTH4/OIFS 2022 +! +! Time interpolation of the stratospheric aerosol CMIP dataset +! Remove the aerosols located below the tropopause and above 10 +! hPa. (WMO criteria based on the vertical lapse rate temperature) + +! MODIFICATIONS. +! -------------- + +!--------------------------------------------------------------------- + +USE YOEAEROP ,ONLY : STRATO_CMIP_NLAT,STRATO_CMIP_NALT,STRATO_CMIP_NTIME, & + & STRATO_CMIP_LAT,STRATO_CMIP_SB,STRATO_CMIP_TB,& + & STRATO_CMIP_NSB,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH + +USE YOMCT0 , ONLY : LNF +USE YOMCT2 , ONLY : NSTAR2 +USE YOMCST , ONLY : RDAY +USE YOMLUN , ONLY : NULOUT +USE PARKIND1 , ONLY : JPIM, JPIB, JPRB, JPRD !JBRD needed for fcttim.func +USE YOMHOOK, ONLY: LHOOK, DR_HOOK, JPHOOK +USE TYPE_MODEL, ONLY: MODEL + +! For the tropopause criteria: +USE YOMCST , ONLY : RD, RG + +IMPLICIT NONE + +! ----------------------------------------------------------------- +! ARGUMENTS. +! ------------- +TYPE(MODEL), INTENT(IN) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV +INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KRINT !Alaak: not used +INTEGER(KIND=JPIM),INTENT(IN) :: KSHIFT !Alaak: not used +INTEGER(KIND=JPIM),INTENT(IN) :: KINDAT +INTEGER(KIND=JPIM),INTENT(IN) :: KSTADD +REAL(KIND=JPRB) ,INTENT(IN) :: PAPF(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PAPRS(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: ZPT(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: ZPTH(KLON,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATAOD_M(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATAAOD_M(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATREFAOD_M(KLON,KLEV,STRATO_CMIP_NSB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(IN) :: STRATAAOD_LW_M(KLON,KLEV,STRATO_CMIP_NTB,STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATAOD(KLON,KLEV,STRATO_CMIP_NSB) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATAAOD(KLON,KLEV,STRATO_CMIP_NSB) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATREFAOD(KLON,KLEV,STRATO_CMIP_NSB) +REAL(KIND=JPRB) ,INTENT(OUT):: STRATAAOD_LW(KLON,KLEV,STRATO_CMIP_NTB) +INTEGER(KIND=JPIM),INTENT(OUT):: TROPOPAUSE(KLON) + +! ----------------------------------------------------------------- +! LOCAL ARRAYS. +! ------------- + +INTEGER(KIND=JPIB) :: ITIME, IZT +INTEGER(KIND=JPIM) :: ISTADD +INTEGER(KIND=JPIM) :: IMV1, IMV2, IYR1, IYR2, INYR, INDY, INMN, IT1, IT2, IMP1, IMP2 +INTEGER(KIND=JPIM) :: ILMO(12) +INTEGER(KIND=JPIM) :: IDY0,IMN0,IYR0,IYNR +INTEGER(KIND=JPIM) :: JK,JL +REAL(KIND=JPRB) :: ZW1, ZW2, ZSIG +REAL(KIND=JPRB) :: ZTRPAUS(KLON), ZPAPHD(KLON) +REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + +! For the Reichler criteria (tropopause): +REAL(KIND=JPRB) :: LAPSE_RATE, LAPSE_RATE_MEAN, DZ +INTEGER(KIND=JPIM) :: JLEV +LOGICAL :: LTEST(KLON) +INTEGER(KIND=JPIM) :: RVOLCDEC + +!---included functions +#include "fcttim.func.h" +#include "updcal.intfb.h" + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_PROCESS',0,ZHOOK_HANDLE) + +ASSOCIATE(& + & YDPHYAER => YDMODEL%YRML_PHY_AER, & + <WOTL=>YDMODEL%YRML_DYN%YRDYNA%LTWOTL,& + &YDRIP=>YDMODEL%YRML_GCONF%YRRIP & + ) + +ASSOCIATE(YDAERSTRAT => YDPHYAER%YREAEROSTRAT) +ASSOCIATE(STRATO_CMIP_ALT => YDAERSTRAT%STRATO_CMIP_ALT) + +STRATAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB +STRATAAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB +STRATREFAOD (KIDIA:KFDIA,:,:) = 0.0_JPRB +STRATAAOD_LW(KIDIA:KFDIA,:,:) = 0.0_JPRB + +! Time interpolation +! Assume monthly means valid at 0Z on the 16th of each month +! and interpolate linearly + +! prepare monthly weights +IF(.NOT.LNF.AND.KSTADD == 0) THEN + ! IN CASE OF RESTART: + IF (LTWOTL) THEN + IZT=NINT(YDRIP%TSTEP*(REAL(NSTAR2,JPRB)+0.5_JPRB), KIND=JPIB) + ELSE + ITIME=NINT(YDRIP%TSTEP, KIND=JPIB) + IZT=ITIME*INT(NSTAR2, KIND=JPIB) + ENDIF + ISTADD=INT(IZT/NINT(RDAY, KIND=JPIB), KIND=JPIM) + ELSE + ISTADD=KSTADD ! NUMBER OF DAYS SINCE START OF THE MODEL +ENDIF + +IYR0=NCCAA(KINDAT) +IMN0=NMM(KINDAT) +IDY0=NDD(KINDAT) + +CALL UPDCAL(IDY0,IMN0,IYR0, ISTADD, INDY,INMN,INYR, ILMO, NULOUT) + +! Assume monthly means valid at 0Z on the 16th of each month +! and interpolate linearly (daily values) + +IF(INDY >= 16) THEN + ! Month to consider to apply the interpolation + IMP1=2 + IMP2=3 + ! + IMV1=INMN + IMV2=1+MOD(INMN,12) + IYR1=INYR + IF(IMV1 /= 12) THEN + IYR2=INYR + ELSE + IYR2=INYR+1 + ENDIF + IT1=16 + IT2=16+ILMO(IMV1) + ELSE + ! Month to consider to apply the interpolation + IMP1=1 + IMP2=2 + ! + IMV1=1+MOD(INMN+10,12) + IMV2=INMN + IF(IMV1 /= 12) THEN + IYR1=INYR + ELSE + IYR1=INYR-1 + ENDIF + IYR2=IYNR + IT1=16-ILMO(IMV1) + IT2=16 +ENDIF + +! Weights +ZW1=REAL(IT2-INDY,JPRB)/REAL(IT2-IT1,JPRB) +ZW2=1.0_JPRB-ZW1 + +! Interpolation and application of the RVOLCDEC factor (2-year +! exponential decay if NVOLCSTOP different from 99999999) +! --ALaakso: no exponential decay, RVOLCDEC is set to 1 +RVOLCDEC=1 +STRATAOD (KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATAOD_M (KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATAOD_M (KIDIA:KFDIA,:,:,IMP2)) +STRATAAOD (KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATAAOD_M (KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATAAOD_M (KIDIA:KFDIA,:,:,IMP2)) +STRATREFAOD (KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATREFAOD_M (KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATREFAOD_M (KIDIA:KFDIA,:,:,IMP2)) +STRATAAOD_LW(KIDIA:KFDIA,:,:) = RVOLCDEC*(ZW1*STRATAAOD_LW_M(KIDIA:KFDIA,:,:,IMP1) + ZW2*STRATAAOD_LW_M(KIDIA:KFDIA,:,:,IMP2)) + +! Computing the tropopause height +DO JL=KIDIA,KFDIA + ZTRPAUS(JL)=0.1_JPRB + ZPAPHD(JL)=1.0_JPRB/PAPRS(JL,KLEV+1) +ENDDO + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! According to the WMO (1975), the tropopause is defined as the lowest +! level at which the lapse-rate decreases to 2°C/km or less, provided +! that the average lapse-rate between this level and all higher levels +! within 2 km does not exceed 2°C/km.(see Reichler et al.,2003) +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +LTEST(:)=.FALSE. + +DO JK=KLEV,1,-1 + DO JL=KIDIA,KFDIA + ! As in cloudsc.F90, the pressure level is normalized by the + ! surface pressure before checking that the level is located on + ! the tropopause altitude. + ZSIG=PAPF(JL,JK)*ZPAPHD(JL) + IF (PAPF(JL,JK)>7500._JPRB.AND.PAPF(JL,JK)<55000._JPRB) THEN + ! The lapse rate is computed for each layer (here we use the gas + ! equation and the hydrostatic approximation): + LAPSE_RATE=(ZPTH(JL,JK+1)-ZPTH(JL,JK))/(PAPRS(JL,JK+1)-PAPRS(JL,JK))*PAPF(JL,JK)/ZPT(JL,JK)*RG/RD + IF (LAPSE_RATE <= 0.002_JPRB) THEN + DZ=0 + JLEV=JK + DO WHILE (DZ <= 2000_JPRB) ! Compute the delta(P) corresponding to 2km + DZ=DZ+(PAPF(JL,JLEV)-PAPF(JL,JLEV-1))/PAPRS(JL,JLEV)*ZPTH(JL,JLEV)*RD/RG + JLEV=JLEV-1 + END DO + LAPSE_RATE_MEAN=(ZPT(JL,JK)-ZPT(JL,JLEV))/DZ ! Lapse rate over 2 km + IF (LAPSE_RATE_MEAN <= 0.002_JPRB) THEN + ZTRPAUS(JL)=MAX(ZSIG,ZTRPAUS(JL)) ! We kep the lowest value that fit the two conditions + LTEST(JL)=.TRUE. + ENDIF + ENDIF + ENDIF + ENDDO +ENDDO + +! Removing the stratospheric forcing that is located below the tropopause +! Use default tropopause at 100 hPa in case the above tropopause criteria fails +TROPOPAUSE(KIDIA:KFDIA)=KLEV +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZSIG=PAPF(JL,JK)*ZPAPHD(JL) + IF ((LTEST(JL) .AND. ZSIG>ZTRPAUS(JL)) .OR. & + & (.NOT.LTEST(JL) .AND. PAPF(JL,JK)>10000._JPRB)) THEN + STRATAOD(JL,JK,:)=0.0_JPRB + STRATAAOD(JL,JK,:)=0.0_JPRB + STRATREFAOD(JL,JK,:)=0.0_JPRB + STRATAAOD_LW(JL,JK,:)=0.0_JPRB + TROPOPAUSE(JL)=MIN(TROPOPAUSE(JL),JK) + ENDIF + ENDDO +ENDDO + +END ASSOCIATE +END ASSOCIATE +END ASSOCIATE + +IF (LHOOK) CALL DR_HOOK('CMIP_STRATO_AERO_PROCESS',1,ZHOOK_HANDLE) + +END SUBROUTINE CMIP_STRATO_AERO_PROCESS diff --git a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 index a20d1f1a..52bca6b1 100644 --- a/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 +++ b/ifs-source/arpifs/phys_ec/compo_apply_emissions.F90 @@ -16,25 +16,52 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & & PAPHIF, PBLH, & & PLSM) -!----------------------------------------------------------------------------- -! COMPO_APPLY_EMISSIONS -! -! This routine iterates over the emission fields for the composition species -! (aerosols, chemistry, GHG) and applies them either to the surface flux or -! tendency arrays as appropriate. -! -! AUTHOR: Zak Kipling -!----------------------------------------------------------------------------- +! ╭────────────────────────────────────────────────────────────────────────────╮ +! │ updated 3-Jun-2024 │ +! │ Purpose : │ +! │ ------- │ +! │ This routine iterates over the emission fields for the composition species │ +! │ (aerosols, chemistry, GHG) and applies them either to the surface flux or │ +! │ tendency arrays as appropriate. │ +! │ │ +! │ Input : │ +! │ ----- │ +! │ │ +! │ │ +! │ Output : │ +! │ ------ │ +! │ │ +! │ │ +! │ Externals : │ +! │ --------- │ +! │ │ +! │ Method : │ +! │ ------ │ +! │ │ +! │ Reference : │ +! │ --------- │ +! │ │ +! │ Author : │ +! │ ------- │ +! │ Zak Kipling (ECMWF) │ +! │ │ +! │ Modifications : │ +! │ ------------- │ +! │ May. 2024 - R. Checa-Garcia. Added aerosols-number particle emissions │ +! │ │ +! │ │ +! ╰────────────────────────────────────────────────────────────────────────────╯ USE TYPE_MODEL,ONLY : MODEL USE PARKIND1 , ONLY : JPIM, JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK -USE YOMCST , ONLY : RG +USE YOMCST , ONLY : RG, RPI USE YOMCHEM , ONLY : IEXTR_EM USE YOMCOMPO , ONLY : TCOMPO_EMIS USE YOM_YGFL , ONLY : TYPE_GFL_COMP + IMPLICIT NONE ! Standard model objects @@ -48,17 +75,17 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & REAL(KIND=JPRB), INTENT(IN) :: PDELP(KLON,KLEV) ! Tracer state, flux and tendency arrays -REAL(KIND=JPRB), INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) +REAL(KIND=JPRB), INTENT(IN) :: PCEN(KLON,KLEV,KTRAC) REAL(KIND=JPRB), INTENT(INOUT) :: PTENC(KLON,KLEV,KTRAC) REAL(KIND=JPRB), INTENT(INOUT) :: PCFLX(KLON,KTRAC) ! Emission field inputs -REAL(KIND=JPRB), INTENT(IN) :: PEMIS2D(KLON, YDMODEL%YRML_GCONF%YGFL%NEMIS2D) -REAL(KIND=JPRB), INTENT(IN) :: PEMIS3D(KLON, KLEV, YDMODEL%YRML_GCONF%YGFL%NEMIS3D) +REAL(KIND=JPRB), INTENT(IN) :: PEMIS2D(KLON, YDMODEL%YRML_GCONF%YGFL%NEMIS2D) +REAL(KIND=JPRB), INTENT(IN) :: PEMIS3D(KLON, KLEV, YDMODEL%YRML_GCONF%YGFL%NEMIS3D) REAL(KIND=JPRB), INTENT(IN), TARGET :: PEMIS2DAUX(KLON, YDMODEL%YRML_GCONF%YGFL%NEMIS2DAUX) ! Optional diagnostic output arrays -REAL(KIND=JPRB),INTENT(INOUT) :: PEXTRA(:,:,:) +REAL(KIND=JPRB), INTENT(INOUT) :: PEXTRA(:,:,:) ! Tracer index arrays INTEGER(KIND=JPIM), INTENT(IN) :: KCHEM(YDMODEL%YRML_GCONF%YGFL%NCHEM) @@ -75,11 +102,12 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & INTEGER(KIND=JPIM) :: IFOUND REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -REAL(KIND=JPRB) :: ZSFCFR_LAND, ZSFCFR_SEA, ZTANDEC -REAL(KIND=JPRB), POINTER :: ZINJF(:), ZVOLCALTI(:), ZPARAM(:) -REAL(KIND=JPRB) :: ZPROFILE(KLON, KLEV+1), ZPROFILE_LAND(KLON, KLEV+1), ZPROFILE_SEA(KLON, KLEV+1) -REAL(KIND=JPRB) :: ZFLUX(KLON) -REAL(KIND=JPRB) , DIMENSION (KLON) :: ZDIURN, ZDIURNTMP +REAL(KIND=JPRB) :: ZSFCFR_LAND, ZSFCFR_SEA, ZTANDEC +REAL(KIND=JPRB) :: ZPROFILE(KLON, KLEV+1) +REAL(KIND=JPRB) :: ZPROFILE_LAND(KLON, KLEV+1), ZPROFILE_SEA(KLON, KLEV+1) +REAL(KIND=JPRB) :: ZFLUX(KLON) +REAL(KIND=JPRB), POINTER :: ZINJF(:), ZVOLCALTI(:), ZPARAM(:) +REAL(KIND=JPRB), DIMENSION (KLON) :: ZDIURN, ZDIURNTMP LOGICAL :: LLFIREPRESENT(KLON), LLHAVEFIREPRESENT @@ -91,16 +119,20 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & !----------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS',0,ZHOOK_HANDLE) -ASSOCIATE(YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & - & YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDERIP=>YDMODEL%YRML_PHY_RAD%YRERIP) -ASSOCIATE(NAERO=>YGFL%NAERO, NACTAERO=>YGFL%NACTAERO, NGHG=>YGFL%NGHG, NCHEM=>YGFL%NCHEM, & - & YCHEM=>YGFL%YCHEM, YAERO=>YGFL%YAERO, YGHG=>YGFL%YGHG, & - & NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & - & NEMIS3D_DESC=>YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC=>YDCOMPO%YEMIS3D_DESC, & - & LCHEM_DIA=>YDCOMPO%LCHEM_DIA, & - & RSIDECM=>YDERIP%RSIDECM,RCODECM=>YDERIP%RCODECM, & - & TSPHY=>YDPHY2%TSPHY) +ASSOCIATE( & + & YDCOMPO => YDMODEL%YRML_CHEM%YRCOMPO, YDRIP => YDMODEL%YRML_GCONF%YRRIP, & + & YDPHY2 => YDMODEL%YRML_PHY_MF%YRPHY2, YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDERIP => YDMODEL%YRML_PHY_RAD%YRERIP ) +ASSOCIATE( & + ! --- [ YGL ] ----------------------------------------------------------------- + & NAERO => YGFL%NAERO, NACTAERO => YGFL%NACTAERO, NGHG => YGFL%NGHG, & + & NCHEM => YGFL%NCHEM, YCHEM => YGFL%YCHEM, YAERO => YGFL%YAERO, & + & YGHG => YGFL%YGHG, & + ! --- [ YDCOMPO, YDPHY, YDERIP ] ---------------------------------------------- + & NEMIS2D_DESC => YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC => YDCOMPO%YEMIS2D_DESC, & + & NEMIS3D_DESC => YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC => YDCOMPO%YEMIS3D_DESC, & + & LCHEM_DIA => YDCOMPO%LCHEM_DIA, TSPHY => YDPHY2%TSPHY, & + & RSIDECM => YDERIP%RSIDECM, RCODECM => YDERIP%RCODECM ) LLHAVEFIREPRESENT = .FALSE. NULLIFY(ZINJF) @@ -130,6 +162,19 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & ZTANDEC = RSIDECM / MAX(RCODECM, 1.0E-12_JPRB) ! New-style flexible 2D emissions processing for chemistry species + +!------------------------------------------------------------------------------- +! RCHG: the subroutines inside contains inherite the variables definitions. +! In particular PEMIS2D, PEMIS3D, PEMIS2DAUX are read INTENT(IN) in main subr. +! and therefore avaliable in subroutines after CONTAINS. I understand that +! definitions are not going upwards from contained subroutine to main one. +! PEMIS2D, PEMIS3D and PEMIS2DAUX has the emitted fields from grib-files already +! read. Here we try to "inject" into the tracers +! (techically assumening NON_SIMPLE_TRACER=TRUE we should either call other new +! APPLY_2D_EMISSION or modified versions. In anycase the work to be done is in +! APPLY_2D_EMISSION +!------------------------------------------------------------------------------- + DO JEMIS=1,NEMIS2D_DESC IF (.NOT. YEMIS2D_DESC(JEMIS)%NON_SIMPLE_TRACER) THEN IFOUND = 0 @@ -148,6 +193,7 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & ELSEIF (IFOUND > 1) THEN CALL ABOR1('COMPO_APPLY_EMISSIONS: (2D) Multiple tracers found for species '//TRIM(YEMIS2D_DESC(JEMIS)%SPECIES)) ENDIF + ENDIF ENDDO @@ -181,8 +227,25 @@ SUBROUTINE COMPO_APPLY_EMISSIONS(YDMODEL, & CONTAINS - SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIAGTEND, KDIAGSHIFT, KFOUND, KINDEX) - + SUBROUTINE APPLY_2D_EMISSION( KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX,& + & LDDIAGTEND, KDIAGSHIFT, KFOUND, KINDEX) + !╭─────────────────────────────────────────────────────────────────────────────╮ + !│ (updated May-2024) │ + !│ Purpose : │ + !│ ------- │ + !│ Apply 2D emissions to sfc flux and tendencies │ + !│ │ + !│ Author : │ + !│ ------- │ + !│ Zak Kipling (ECMWF) │ + !│ │ + !│ Modifications : │ + !│ ------------- │ + !│ May. 2024 - R. Checa-Garcia (KNMI) Added option for number particle emis │ + !│ │ + !│ │ + !╰─────────────────────────────────────────────────────────────────────────────╯ + IMPLICIT NONE INTEGER(KIND=JPIM), INTENT(IN) :: KSPECIES ! = NCHEM, NAERO or NGHG @@ -197,16 +260,20 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA INTEGER(KIND=JPIM) :: ITRAC ! index of current tracer in all-tracers arrays (looked up via KINDEX) INTEGER(KIND=JPIM) :: IDIAGSLOT ! index of current tracer in PEXTRA diagnostics (after adding KDIAGSHIFT) - REAL(KIND=JPRB) :: ZSFCFLUX(KLON) ! actual surface flux after elevated emissions applied + REAL(KIND=JPRB) :: ZSFCFLUX(KLON) ! actual surface flux after elevated emissions applied - REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + ! ADDITIONAL ARRAYS/VARIABLES FOR NUM_PARTICLES FLUX + REAL(KIND=JPRB) :: ZFLUX_NUM(KLON), ZSFCFLUX_NUM(KLON) + INTEGER(KIND=JPIM) :: ITRAC_NUM + + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:APPLY_2D_EMISSION',0,ZHOOK_HANDLE) - ASSOCIATE(YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & - & YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2) - ASSOCIATE(TSPHY=>YDPHY2%TSPHY) - DO JSPECIES=1,KSPECIES - IF (YDSPECIES(JSPECIES)%CNAME == YDEMIS_DESC%SPECIES) THEN + + ASSOCIATE( YDRIP=>YDMODEL%YRML_GCONF%YRRIP, YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2) + ASSOCIATE( TSPHY=>YDPHY2%TSPHY ) + DO JSPECIES=1,KSPECIES + IF (YDSPECIES(JSPECIES)%CNAME == YDEMIS_DESC%SPECIES) THEN ! YDEMIS_DESC% is the namelist for emission IF (PRESENT(KINDEX)) THEN ITRAC = KINDEX(JSPECIES) ELSE @@ -215,11 +282,12 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA IDIAGSLOT = KDIAGSHIFT + JSPECIES - CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, YDEMIS_DESC%DIURNAL_CYCLE_TYPE, & - & PGELAM, PGELAT, ZDIURN, & - & PAMPLITUDE=YDEMIS_DESC%DIURNAL_AMPLITUDE, & - & PHOURPEAK=YDEMIS_DESC%DIURNAL_PEAK_HOUR, & - & PBASELINE=YDEMIS_DESC%DIURNAL_BASELINE, & + CALL COMPO_DIURNAL(YDRIP, KIDIA, KFDIA, KLON, & + & YDEMIS_DESC%DIURNAL_CYCLE_TYPE, PGELAM, PGELAT, & + & ZDIURN, & ! [THIS IS THE OUTPUT] -> diurnal scale + & PAMPLITUDE=YDEMIS_DESC%DIURNAL_AMPLITUDE, & ! optional parameter default 0.0 + & PHOURPEAK=YDEMIS_DESC%DIURNAL_PEAK_HOUR, & ! optional parameter default 12.0 + & PBASELINE=YDEMIS_DESC%DIURNAL_BASELINE, & ! optional parameter default 0.0 & PTANDEC=ZTANDEC) ! Legacy support: override diurnal cycle where fire present @@ -231,10 +299,15 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA & PHOURPEAK=13.5_JPRB, PBASELINE=0.2_JPRB ) WHERE(LLFIREPRESENT(KIDIA:KFDIA)) ZDIURN(KIDIA:KFDIA) = ZDIURNTMP(KIDIA:KFDIA) ENDIF - + ! This is the surface / total column flux after scaling and diurnal cycle application ZFLUX(KIDIA:KFDIA) = - PEMIS2D(KIDIA:KFDIA,YDEMIS_DESC%PARAM_INDEX) * ZDIURN(KIDIA:KFDIA) * YDEMIS_DESC%SCALING - + + + ! HERE we have the ZFLUX and where is there we need to call a new function that digest the input of PSD_* + ! and change the ZFLUX of the tracer with number of particles + ! probably this is the only ammount to be changed. + IF ( YDEMIS_DESC%VERTICAL_PROFILE_TYPE == 'HeightMap' .OR. & & YDEMIS_DESC%VERTICAL_PROFILE_TYPE == 'AltitudeMap' .OR. & & YDEMIS_DESC%VERTICAL_PROFILE_TYPE == 'GFAS' ) THEN @@ -246,15 +319,16 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA NULLIFY(ZPARAM) IF (YDEMIS_DESC%VERTICAL_PARAM_INDEX > 0) ZPARAM => PEMIS2DAUX(:,YDEMIS_DESC%VERTICAL_PARAM_INDEX) - CALL COMPO_INJECTION_PROFILE(KIDIA, KFDIA, KLON, KLEV, YDEMIS_DESC%VERTICAL_PROFILE_TYPE, & - & ZPROFILE, & - & PSFCFRAC=YDEMIS_DESC%VERTICAL_SURFACE_FRACTION, & - & PBASEHEIGHT=YDEMIS_DESC%VERTICAL_BASE_HEIGHT, & - & PTOPHEIGHT=YDEMIS_DESC%VERTICAL_TOP_HEIGHT, & - & PTHRESHOLD=YDEMIS_DESC%VERTICAL_THRESHOLD, & - & KBASELEV=YDEMIS_DESC%VERTICAL_BASE_LEVEL, & - & KTOPLEV=YDEMIS_DESC%VERTICAL_TOP_LEVEL, & - & PPARAM=ZPARAM, & + CALL COMPO_INJECTION_PROFILE(KIDIA, KFDIA, KLON, KLEV, & + & YDEMIS_DESC%VERTICAL_PROFILE_TYPE, & + & ZPROFILE, & + & PSFCFRAC=YDEMIS_DESC%VERTICAL_SURFACE_FRACTION, & + & PBASEHEIGHT=YDEMIS_DESC%VERTICAL_BASE_HEIGHT, & + & PTOPHEIGHT=YDEMIS_DESC%VERTICAL_TOP_HEIGHT, & + & PTHRESHOLD=YDEMIS_DESC%VERTICAL_THRESHOLD, & + & KBASELEV=YDEMIS_DESC%VERTICAL_BASE_LEVEL, & + & KTOPLEV=YDEMIS_DESC%VERTICAL_TOP_LEVEL, & + & PPARAM=ZPARAM, & & PBLH=PBLH, PAPHIF=PAPHIF, PDELP=PDELP) ! Legacy support: override injection heights for fires, volcanoes and stacks @@ -332,6 +406,7 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA ENDIF ENDIF + ! Note: ZPROFILE is always positive, for 1:KLEV and for KLEV+1; ! ZFLUX is negative for an emission as per usual IFS convention DO JK=1,KLEV @@ -355,11 +430,27 @@ SUBROUTINE APPLY_2D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGFLUX, LDDIA ! where GHG comes first!) PEXTRA(KIDIA:KFDIA,IDIAGSLOT,IEXTR_EM) = PEXTRA(KIDIA:KFDIA,IDIAGSLOT,IEXTR_EM) - ZSFCFLUX(KIDIA:KFDIA) * TSPHY ENDIF - + + ! RCHG -> If emission descripction indicate PSD_N0_TRACER then we have to add + ! emission number to the specific mode. This is done in GET_2D_EMISSION_M7_NUMPAR + ! which has two outputs: ZFLUX for NUMPAR and the index of tracer for NUMPAR + ! In the case of EMISSION_M7_NUMPAR it is important to remember than + ! several species can contribute to PCFLX and PTENC of emission numbers as there is + ! one tracer of total number of particles per mode but several mass species per mode. + + IF (YDEMIS_DESC%PSD_N0_TRACER /= 'NONE') THEN + CALL GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC, ZPROFILE, KINDEX, & + & ZFLUX, ZFLUX_NUM, ZSFCFLUX_NUM, ITRAC_NUM) + DO JK=1,KLEV + PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) = PTENC(KIDIA:KFDIA,JK,ITRAC_NUM) - ZPROFILE(KIDIA:KFDIA,JK) * ZFLUX_NUM(KIDIA:KFDIA) + ENDDO + PCFLX(KIDIA:KFDIA,ITRAC_NUM) = PCFLX(KIDIA:KFDIA,ITRAC_NUM) + ZFLUX_NUM(KIDIA:KFDIA) + ENDIF + KFOUND = KFOUND + 1 ENDIF ENDDO - END ASSOCIATE + END ASSOCIATE END ASSOCIATE IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:APPLY_2D_EMISSION',1,ZHOOK_HANDLE) END SUBROUTINE APPLY_2D_EMISSION @@ -441,4 +532,105 @@ SUBROUTINE APPLY_3D_EMISSION(KSPECIES, YDSPECIES, YDEMIS_DESC, LDDIAGTEND, KFOUN IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:APPLY_3D_EMISSION',1,ZHOOK_HANDLE) END SUBROUTINE APPLY_3D_EMISSION + + SUBROUTINE GET_2D_EMISSION_M7_NUMPAR( JSPECIES, KSPECIES, YDSPECIES, YDEMIS_DESC, & + & ZPROFILE, KINDEX, & + & ZFLUX, ZFLUX_NUM, ZSFCFLUX_NUM, ITRAC_NUM) + + !╭─────────────────────────────────────────────────────────────────────────────╮ + !│ (updated May-2024) │ + !│ Purpose : │ + !│ ------- │ + !│ SUBROUTINE TO CALLED WHEN NON_SIMPLE_TRACER and M7 inside APPLY_2D_EMISSION │ + !│ for those modes where changes in NUMBER PARTICLES are needed │ + !│ The output of this function should be ZFLUX for number of particles and this│ + !│ Note that this is not used for CHEM species only AERO │ + !│ │ + !│ Author : │ + !│ ------- │ + !│ R.Checa-Garca (KNMI) │ + !│ │ + !│ Modifications : │ + !│ ------------- │ + !│ │ + !│ │ + !╰─────────────────────────────────────────────────────────────────────────────╯ + + USE TM5M7_DATA, ONLY : sigma_lognormal, pom_density, carbon_density + + IMPLICIT NONE + + INTEGER(KIND=JPIM) , INTENT(IN) :: KSPECIES ! = + INTEGER(KIND=JPIM) , INTENT(IN) :: JSPECIES ! = INDEX OF AEROSOL SPECIE with MASS-EMISSIONS + TYPE(TYPE_GFL_COMP), INTENT(IN) :: YDSPECIES(KSPECIES) ! = YCHEM, YAERO or YGHG + TYPE(TCOMPO_EMIS) , INTENT(IN) :: YDEMIS_DESC ! descriptor for this emission + REAL(KIND=JPRB) , INTENT(IN) :: ZFLUX(KLON) + REAL(KIND=JPRB) , INTENT(IN) :: ZPROFILE(KLON,KLEV+1) ! + INTEGER(KIND=JPIM) , INTENT(OUT) :: ITRAC_NUM ! = INDEX OF AEROSOL NUM PARTICLE TRACER + REAL(KIND=JPRB) , INTENT(OUT) :: ZFLUX_NUM(KLON) ! + REAL(KIND=JPRB) , INTENT(OUT) :: ZSFCFLUX_NUM(KLON) ! + INTEGER(KIND=JPIM) , INTENT(IN), OPTIONAL :: KINDEX(KSPECIES) ! = KCHEM, KAERO or nothing for GHG + REAL(KIND=JPHOOK) :: ZHOOK_HANDLE + + ! LOCAL VARIABLES + REAL(KIND=JPRB) :: NUM_SCALE, MASS_TO_NUM_PSD, MASS_TO_NUM_EMI + INTEGER(KIND=JPIM) :: ISPECIES + + IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:GET_2D_EMISSION_M7_NUMPAR',0,ZHOOK_HANDLE) + ! From YDEMIS_DESC%SPECIES and YDSPECIES%CNAME we need to get the mode-index for sigma + ! (below rad_emi_ are probably the radius of emissions) + ITRAC_NUM=-1 + DO ISPECIES=1,KSPECIES + IF (YDSPECIES(ISPECIES)%CNAME == YDEMIS_DESC%PSD_N0_TRACER) THEN ! YDEMIS_DESC% is the namelist for emission + IF (PRESENT(KINDEX)) THEN + ITRAC_NUM = KINDEX(ISPECIES) + ELSE + ITRAC_NUM = ISPECIES + ENDIF + ENDIF + ENDDO + IF (ITRAC_NUM==-1) THEN + CALL ABOR1 ('COMPO_APPLY_EMISSIONS:GET_2D_EMISSION_M7_NUMPAR:ISSUE_NUM_N0_TRACER ' // TRIM(YDEMIS_DESC%PSD_N0_TRACER) // 'NOT FOUND') + ENDIF + ! ---------------------------------------------------------------------------------------------- + ! RCHG -> here the implementation is general and the emission specification file and therefore + ! the emission namelist YDEMIS_DESC has the parameters of the PSD to translated the + ! mass-flux into the number-flux. + ! Note that for the mass-density and M7 this can be taken from the definition + ! of the density of each specie. In no M7-scheme we need YDEMIS_DESC%DENSITY. + ! + ! YDEMIS_DESC%PSD_SIGMA -> assumes a lognormal distribution + ! YDEMIS_DESC%PSD_RADIUS -> assumes a lognormal distribution + ! YDEMIS_DESC%DENSITY -> mass-density of particle at emission + ! + ! Currently, it is needed at the namelist but the implementation for M7 can be: + ! ---------------------------------------------------------------------------------------------- + ! IF (AERO_SCHEME="hamm7") THEN + ! DO IMODE=1,NMOD + ! DO INMODE=0,MODE_NM_SED(IMODE) + ! JN=MODE_TRACERS_SED(INMODE_IMODE) + ! IF KAERO(JN)=ITRAC_NUM + ! density = ... + ! ENDIF + ! ENDDO + ! ENDDO + ! ENDIF + ! + ! Other option is to have an data-array with the values. It should be at module/tm5m7_data.F90 + ! but we load here. This data-array should relates ITRAC_NUM to density (if possible). In other + ! words: DENSITY(1:NACTAERO) with DENSITY = DENSITY(KAERO(ITRAC_NUM)) + ! + !----------------------------------------------------------------------------------------------- + NUM_SCALE = EXP(4.5*(LOG(YDEMIS_DESC%PSD_SIGMA))**2) + MASS_TO_NUM_PSD = 3./(4.*RPI*NUM_SCALE*YDEMIS_DESC%MASS_DENSITY) ! RPI -> real pi inherited from main sub. + MASS_TO_NUM_EMI = MASS_TO_NUM_PSD/(YDEMIS_DESC%PSD_RADIUS**3) + + ! FLUX OUTPUTS + + ZFLUX_NUM(KIDIA:KFDIA) = ZFLUX(KIDIA:KFDIA)*MASS_TO_NUM_EMI + ZSFCFLUX_NUM(KIDIA:KFDIA) = ZPROFILE(KIDIA:KFDIA,KLEV+1) * ZFLUX_NUM(KIDIA:KFDIA) + + IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS:GET_2D_EMISSION_M7_NUMPAR',1,ZHOOK_HANDLE) + END SUBROUTINE GET_2D_EMISSION_M7_NUMPAR + END SUBROUTINE COMPO_APPLY_EMISSIONS diff --git a/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 b/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 index 585753af..6cd5c265 100644 --- a/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 +++ b/ifs-source/arpifs/phys_ec/compo_apply_emissions_layer.F90 @@ -49,6 +49,8 @@ SUBROUTINE COMPO_APPLY_EMISSIONS_LAYER(YDSURF, & IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS_LAYER',0,ZHOOK_HANDLE) +IF ( YDMODEL%YRML_GCONF%YGFL%NEMIS3D .GT. 0 ) THEN + ! ------------------------------------------------------------------ CALL COMPO_APPLY_EMISSIONS(YDMODEL, & & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLEV, KDIM%KLON, GEMSL%ITRAC, & @@ -63,6 +65,24 @@ SUBROUTINE COMPO_APPLY_EMISSIONS_LAYER(YDSURF, & & PLSM=PSURF%PSD_VF(:,YDSURF%YSD_VF%YLSM%MP), & & PBLH=PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) +ELSE + + ! ------------------------------------------------------------------ + CALL COMPO_APPLY_EMISSIONS(YDMODEL, & + & KDIM%KIDIA, KDIM%KFDIA, KDIM%KLEV, KDIM%KLON, GEMSL%ITRAC, & + & PAUX%PGELAT, PAUX%PGELAM, PAUX%PDELP, & + & GEMSL%ZCEN, GEMSL%ZTENC, GEMSL%ZCFLX, & + & PEMIS2D=PSURF%PSD_VF(:,YDSURF%YSD_VF%YEMIS2D(1)%MP:YDSURF%YSD_VF%YEMIS2D(YDMODEL%YRML_GCONF%YGFL%NEMIS2D)%MP), & + & PEMIS2DAUX=PSURF%PSD_VF(:,YDSURF%YSD_VF%YEMIS2DAUX(1)%MP:YDSURF%YSD_VF%YEMIS2DAUX(YDMODEL%YRML_GCONF%YGFL%NEMIS2DAUX)%MP), & + & PEMIS3D=PGFL(:,:,1:), & + & KAERO=GEMSL%IAERO, KCHEM=GEMSL%ICHEM, & + & PEXTRA=PSURF%PSD_XA, & + & PAPHIF=PAUX%PAPHIF, & + & PLSM=PSURF%PSD_VF(:,YDSURF%YSD_VF%YLSM%MP), & + & PBLH=PSURF%PSD_VD(:,YDSURF%YSD_VD%YBLH%MP)) + +ENDIF + ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('COMPO_APPLY_EMISSIONS_LAYER',1,ZHOOK_HANDLE) END SUBROUTINE COMPO_APPLY_EMISSIONS_LAYER diff --git a/ifs-source/arpifs/phys_ec/ec_phys.F90 b/ifs-source/arpifs/phys_ec/ec_phys.F90 index 31d618f4..6630e776 100644 --- a/ifs-source/arpifs/phys_ec/ec_phys.F90 +++ b/ifs-source/arpifs/phys_ec/ec_phys.F90 @@ -586,7 +586,6 @@ SUBROUTINE EC_PHYS(YDGEOMETRY,YDVARS,YDGMV,YDSURF,YDMODEL,CDCONF,DIMS,& ! ------------------------------------------------------------------------------------- !* 4.2 CALL ECMWF PHYSICS - CALL CALLPAR(YDGEOMETRY,YDVARS,YDSURF,YDMODEL,DIMS,& & PAUX, PRAD, FLUX, ZDIAG, PSURF, & & PCGPP, PCREC, ZAG, ZRECO,& diff --git a/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 b/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 index ba3951ae..082870c8 100644 --- a/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 +++ b/ifs-source/arpifs/phys_ec/ec_phys_drv.F90 @@ -619,7 +619,6 @@ SUBROUTINE EC_PHYS_DRV(YDGEOMETRY,YDFIELDS,YDVARS,YDGMV,YDSURF,YDMODEL,CDCONF,& ENDDO !$OMP END DO !$OMP END PARALLEL - CALL STATE_T0%FINAL() CALL TENDENCY_DYN%FINAL() CALL TENDENCY_CML%FINAL() diff --git a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 index a656b021..efeced83 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_fin.F90 @@ -76,8 +76,13 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) IF (ASSOCIATED(SURFL%ZEMIW)) NULLIFY(SURFL%ZEMIW) ! --- -DEALLOCATE(GEMSL%ITRAC) -DEALLOCATE(GEMSL%ZCEN,GEMSL%ZTENC,GEMSL%ZTENC_SKF,GEMSL%ZCFLX,GEMSL%ZSCAV) +IF (ASSOCIATED(GEMSL%ITRAC)) DEALLOCATE(GEMSL%ITRAC) +IF (ASSOCIATED(GEMSL%ZCEN)) DEALLOCATE(GEMSL%ZCEN) +IF (ASSOCIATED(GEMSL%ZTENC)) DEALLOCATE(GEMSL%ZTENC) +IF (ASSOCIATED(GEMSL%ZTENC_SKF)) DEALLOCATE(GEMSL%ZTENC_SKF) +IF (ASSOCIATED(GEMSL%ZCFLX)) DEALLOCATE(GEMSL%ZCFLX) +IF (ASSOCIATED(GEMSL%ZSCAV)) DEALLOCATE(GEMSL%ZSCAV) +!DEALLOCATE(GEMSL%ZCEN,GEMSL%ZTENC,GEMSL%ZTENC_SKF,GEMSL%ZCFLX,GEMSL%ZSCAV) IF (ASSOCIATED(GEMSL%IAERO)) DEALLOCATE(GEMSL%IAERO) IF (ASSOCIATED(GEMSL%ICHEM)) DEALLOCATE(GEMSL%ICHEM) IF (ASSOCIATED(GEMSL%ZAZ0M)) DEALLOCATE(GEMSL%ZAZ0M) @@ -104,11 +109,14 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) IF (ASSOCIATED(GEMSL%ZCAERO)) DEALLOCATE(GEMSL%ZCAERO) IF (ASSOCIATED(GEMSL%ZAEROP)) DEALLOCATE(GEMSL%ZAEROP) - -IF (ASSOCIATED(GEMSL%ZAERSRC)) DEALLOCATE(GEMSL%ZAERSRC) IF (ASSOCIATED(GEMSL%ZAERDDP)) DEALLOCATE(GEMSL%ZAERDDP) IF (ASSOCIATED(GEMSL%ZAERSDM)) DEALLOCATE(GEMSL%ZAERSDM) +IF (ASSOCIATED(GEMSL%ZAERSRC)) DEALLOCATE(GEMSL%ZAERSRC) +!IF (ASSOCIATED(GEMSL%ZAERDDP)) GEMSL%ZAERDDP =>NULL() +!IF (ASSOCIATED(GEMSL%ZAERSDM)) GEMSL%ZAERSDM =>NULL() +!IF (ASSOCIATED(GEMSL%ZAERSRC)) GEMSL%ZAERSRC =>NULL() +IF (ASSOCIATED(GEMSL%ZAERFLX_M7)) DEALLOCATE(GEMSL%ZAERFLX_M7) IF (ASSOCIATED(GEMSL%ZAERFLX)) DEALLOCATE(GEMSL%ZAERFLX) IF (ASSOCIATED(GEMSL%ZAERLIF)) DEALLOCATE(GEMSL%ZAERLIF) IF (ASSOCIATED(GEMSL%ZTAUAER)) DEALLOCATE(GEMSL%ZTAUAER) @@ -129,6 +137,13 @@ SUBROUTINE LOCAL_ARRAYS_FIN(LLKEYS,AUXL,SURFL,PERTL,GEMSL) IF (ASSOCIATED(GEMSL%ZMDT)) DEALLOCATE(GEMSL%ZMDT) IF (ASSOCIATED(GEMSL%ZND)) DEALLOCATE(GEMSL%ZND) + +! M7 fields +IF (ASSOCIATED(GEMSL%ZAEROTAU)) DEALLOCATE(GEMSL%ZAEROTAU) +IF (ASSOCIATED(GEMSL%ZAEROSSA)) DEALLOCATE(GEMSL%ZAEROSSA) +IF (ASSOCIATED(GEMSL%ZAEROASY)) DEALLOCATE(GEMSL%ZAEROASY) +IF (ASSOCIATED(GEMSL%ZAEROTAULW)) DEALLOCATE(GEMSL%ZAEROTAULW) + ! dry depostion and effective flux fields IF (ASSOCIATED(GEMSL%ZDDVLC)) DEALLOCATE(GEMSL%ZDDVLC) IF (ASSOCIATED(GEMSL%ZCFLXO)) DEALLOCATE(GEMSL%ZCFLXO) diff --git a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 index 384a9977..99362727 100644 --- a/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 +++ b/ifs-source/arpifs/phys_ec/local_arrays_ini.F90 @@ -126,7 +126,6 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ! ----------------------------------------- !* AUXL ! ----------------------------------------- - ! Initialization DO JL=KDIM%KIDIA,KDIM%KFDIA AUXL%ZSUDU (JL) =PRAD%PSRSWDCS(JL) @@ -294,6 +293,7 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ALLOCATE(GEMSL%ZAERDDP(1,1)) ALLOCATE(GEMSL%ZAERSDM(1,1)) + ALLOCATE(GEMSL%ZAERFLX_M7(1,1,1)) ALLOCATE(GEMSL%ZAERFLX(1,1)) ALLOCATE(GEMSL%ZAERLIF(1,1)) ALLOCATE(GEMSL%ZTAUAER(1,1,1)) @@ -303,6 +303,13 @@ SUBROUTINE LOCAL_ARRAYS_INI(YDGEOMETRY,YDSURF,YDMODEL,KDIM, LLKEYS, PAUX, AUXL, ALLOCATE(GEMSL%ZAERASYLEV(1,1,1)) ALLOCATE(GEMSL%ZAERLISI(1,1,1,1)) + !M7 aerosols + ALLOCATE(GEMSL%ZAEROTAU(1,1,1)) + ALLOCATE(GEMSL%ZAEROSSA(1,1,1)) + ALLOCATE(GEMSL%ZAEROASY(1,1,1)) + ALLOCATE(GEMSL%ZAEROTAULW(1,1,1)) + + ALLOCATE( GEMSL%ZDRYDIAM(1,1,1)) ALLOCATE( GEMSL%ZWETDIAM(1,1,1)) ALLOCATE( GEMSL%ZDRYVOL(1,1,1)) diff --git a/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 b/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 new file mode 100644 index 00000000..15613e59 --- /dev/null +++ b/ifs-source/arpifs/phys_ec/simple_sulfur_src.F90 @@ -0,0 +1,331 @@ +SUBROUTINE SIMPLE_SULFUR_SRC ( YDGEOMETRY, YDMODEL, KIDIA, KFDIA, KLON , KTDIA, KLEV,& + & KSTGLO, KTRAC, KAERO,& + & PAPHI,& + & PSO2L, PSO2H,& + & PSOGF, & + & PSOA ,& + & PSOACO, PVOLC, PVOLE, PDMS,& + & PCI , PINJF, PBLH,& + & PRS1, PRSF1, PGELAM, PGELAT, & + & PLSM , PTS , PTSPHY, & + & PWIND, & + & PDMSO, PLDAY, PLISS, PSO2 , PTDMS,& + & PODMS, PSO4SRC,PSO2SRC) + + USE PARKIND1 ,ONLY : JPIM, JPRB + USE YOMHOOK ,ONLY : LHOOK, DR_HOOK + USE YOMCST ,ONLY : RA, RPI, RDAY, RG + USE YOMLUN ,ONLY : NULOUT + USE TYPE_MODEL , ONLY : MODEL + !USE YOM_YGFL ,ONLY : YGFL + !USE YOEAERSRC ,ONLY : YREAERSRC + USE GEOMETRY_MOD , ONLY : GEOMETRY + !USE YOMCOMPO, ONLY : YRCOMPO + !USE YOEAERATM ,ONLY : YREAERATM + USE YOMCT3 , ONLY : NSTEP + USE YOMMP0 , ONLY : MYPROC, NPROC +! USE YOMRIP ,ONLY : YRRIP + +IMPLICIT NONE + +TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY +TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL +INTEGER(KIND=JPIM),INTENT(IN) :: KLON, KIDIA, KFDIA +INTEGER(KIND=JPIM),INTENT(IN) :: KLEV, KTDIA, KSTGLO +!INTEGER(KIND=JPIM),INTENT(IN) :: KSTEP +INTEGER(KIND=JPIM),INTENT(IN) :: KTRAC +INTEGER(KIND=JPIM),INTENT(IN) :: KAERO(YDMODEL%YRML_GCONF%YGFL%NAERO) + +REAL(KIND=JPRB) ,INTENT(IN) :: PAPHI(KLON,0:KLEV) + +REAL(KIND=JPRB) ,INTENT(IN) :: PSO2L(KLON), PSO2H(KLON), PSOGF(KLON), PSOA(KLON), PSOACO (KLON), PVOLC(KLON), PVOLE(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PDMS(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PGELAM(KLON), PGELAT(KLON)!, PGEMU(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PCI(KLON), PLSM(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PINJF(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PBLH(KLON) +!REAL(KIND=JPRB) ,INTENT(IN) :: PDELP(KLON,KLEV) +!REAL(KIND=JPRB) ,INTENT(IN) :: PQ(KLON,KLEV), PRHO(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PTS(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PWIND(KLON) +REAL(KIND=JPRB) ,INTENT(IN) :: PTSPHY +!DMS +REAL(KIND=JPRB) ,INTENT(INOUT) :: PDMSO(KLON), PLDAY(KLON), PLISS(KLON), PSO2(KLON), PTDMS(KLON) +REAL(KIND=JPRB) ,INTENT(INOUT) :: PODMS(KLON) +REAL(KIND=JPRB),INTENT(IN) :: PRS1(KLON,0:KLEV) +REAL(KIND=JPRB),INTENT(IN) :: PRSF1(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) ::PSO4SRC(KLON,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) ::PSO2SRC(KLON,KLEV) +!-- various alternate sources can be tested +REAL(KIND=JPRB) :: ZLOCALTIM , ZDIURN(KLON) +REAL(KIND=JPRB) :: ZSO2L(KLON) , ZSO2H(KLON) , ZSO2HD(KLON) +REAL(KIND=JPRB) :: ZSO2SOURC +REAL(KIND=JPRB) :: ZSOGF(KLON) , ZSOA(KLON) +REAL(KIND=JPRB) :: ZSO2MSS + +!-- QnD oceanic DMS +REAL(KIND=JPRB) :: ZCOS0, ZSIN0, ZRAD2DEG, Z_S_SO2, ZDMS2SO2 +REAL(KIND=JPRB) :: ZDMSMIN, ZSOA_CO +REAL(KIND=JPRB) :: ZDMSO(KLON), ZGEMU(KLON), ZLATK(KLON) + +!-- Injection height for biomass burning emissions +INTEGER(KIND=JPIM) :: ILINJ1, ILINJ2, IX(1) +REAL(KIND=JPRB) :: ZDELP + +INTEGER(KIND=JPIM) :: IGLGLO +REAL(KIND=JPRB) :: ZGRDLAT, ZGRDLAT2, ZGRDLON2, ZA, ZC, Z1GP +REAL(KIND=JPRB) :: ZDIST(KLON) , ZGRDLON(KLON), ZGDLAT(KLON), ZGDLON(KLON) +REAL(KIND=JPRB) :: ZDLAT, ZDLON +REAL(KIND=JPRB) :: ZLAT +REAL(KIND=JPRB) :: ZDEGRAD +REAL(KIND=JPRB) :: ZGLAT(KLON), ZGLON(KLON) +INTEGER(KIND=JPIM) :: IHTST, ITEST +!-- volcano-related variables +INTEGER(KIND=JPIM) :: INDLAT(KLON), JK, JL + +!AERPHYvars +REAL(KIND=JPRB) :: ZALT(KLON,0:KLEV), ZDP(KLON,KLEV), ZDZ(KLON,KLEV) + + +!LAERCHEM=>YGFL%LAERCHEM) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & + & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC, & + & YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM) + +ASSOCIATE(NDMSO=>YDEAERSRC%NDMSO,LOCNDMS=>YDEAERSRC%LOCNDMS,NDGLG=>YDGEOMETRY%YRDIM%NDGLG, & + & YDCSGLEG=>YDGEOMETRY%YRCSGLEG,NGLOBALAT=>YDGEOMETRY%YRMP%NGLOBALAT, NLOENG=>YDGEOMETRY%YRGEM%NLOENG, & + & RCOVSRA=>YDEAERSRC%RCOVSRA, RCODECA=>YDEAERSRC%RCODECA,RSIDECA=>YDEAERSRC%RSIDECA,LAERCHEM=>YGFL%LAERCHEM, & + & RSIVSRA=>YDEAERSRC%RSIVSRA, RHGMT=>YDRIP%RHGMT, LAERELVS=>YDEAERATM%LAERELVS) + +Z_S_SO2=0.5_JPRB +ZSO2MSS=64.058E-03_JPRB +ZDMS2SO2=1.0_JPRB +ZDMSMIN = 5.E-11_JPRB +ZRAD2DEG= 180._JPRB/RPI +ZSOA_CO=0.15_JPRB + +PSO4SRC(:,:)=0.0_JPRB +PSO2SRC(:,:)=0.0_JPRB + +!* 0.2 A LENGTH OF DAY INDEX +! --------------------- + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + ZGEMU(JL)=YDCSGLEG%RMU(IGLGLO) ! sine of latitude + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO))*ZRAD2DEG + ZLATK(JL)=ZLAT + ZCOS0=1._JPRB + ZSIN0=0._JPRB + PLDAY(JL)=MAX( RSIDECA*ZGEMU(JL)& + & -RCODECA*RCOVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZCOS0& + & +RCODECA*RSIVSRA*SQRT(1.0_JPRB-ZGEMU(JL)**2)* ZSIN0& + & ,0.0_JPRB) + PDMSO(JL)=0._JPRB + PLISS(JL)=0._JPRB + PSO2(JL) =0._JPRB + PTDMS(JL)=0._JPRB + PODMS(JL)=0._JPRB +ENDDO + + + +ITEST=0 +ZDEGRAD= 180._JPRB/RPI +ZDLAT = 180._JPRB / NDGLG ! distance in degrees between latitude lines +ZGRDLAT= RPI / NDGLG ! distance in radians between latitude lines +ZGRDLAT2=ZGRDLAT*0.55_JPRB + +DO JL=KIDIA,KFDIA + IGLGLO=NGLOBALAT(KSTGLO+JL-1) + INDLAT(JL)=IGLGLO + Z1GP=1.0_JPRB/REAL(NLOENG(IGLGLO),JPRB) + ZDLON=Z1GP*2.0_JPRB*RPI ! distance in radians between longitude points on a given latitude line + ZGRDLON(JL)=ZDLON + ZLAT=ASIN(YDCSGLEG%RMU(IGLGLO)) ! latitude in radians + ZA=COS(ZLAT)*SIN(ZDLON/2.0_JPRB) + ZC=2.0_JPRB * ASIN( MIN(1.0_JPRB,ZA) ) + ZDIST(JL)=RA * ZC /1000.0_JPRB ! distance in km between longitude points on a given latitude line + + ZGLON(JL)=PGELAM(JL)*ZDEGRAD + ZGLAT(JL)=ZLAT*ZDEGRAD + ZGDLAT(JL)=ZDLAT + ZGDLON(JL)=360._JPRB*Z1GP + + ZLOCALTIM =RHGMT + ZGLON(JL)/360._JPRB*RDAY + ZDIURN(JL)=COS( ((ZLOCALTIM-54000._JPRB)/RDAY) * 2._JPRB*RPI)+1._JPRB +ENDDO +!VH IF (.NOT.LAERODIU) THEN +!VH ZDIURN(KIDIA:KFDIA)=1.0_JPRB +!VH ENDIF + + +DO JK=1,KLEV + DO JL=KIDIA,KFDIA + ZDP(JL,JK)= PRS1(JL,JK) - PRS1(JL,JK-1) + ENDDO +ENDDO + +! aerphy3: +DO JL=KIDIA,KFDIA + ZALT(JL,KLEV)=PAPHI(JL,KLEV)/RG +ENDDO +! IF (LAERCHEM) THEN +!MOVE OUTSIDE AER dependent + +! DO JL=KIDIA,KFDIA +! PCFLX(JL,KAERO(INBAER+1))= 0._JPRB +! ENDDO +! INBAER=INBAER+1 + +! ELSE +!-- originally, quick fix to produce a flux of oceanic DMS, following Liss & Merlivat, +! 1986, in "The Role of Air-Sea Exchange in Geochemical Cycling", +! ed. Buat-Menard, 113-128. + +IF (NDMSO /= 0 .AND. LOCNDMS) THEN + + CALL AER_DMSO (KIDIA, KFDIA, KLON,& + & PCI, PDMS, PLDAY, PLSM, PTS, PWIND,& + & ZDMSO, PLISS, PTDMS,& + & PODMS) + + IF (NDMSO == 1) THEN + DO JL=KIDIA,KFDIA + PDMSO(JL)=ZDMSO(JL) + ENDDO + ELSEIF (NDMSO == 2) THEN + DO JL=KIDIA,KFDIA + PDMSO(JL)=PODMS(JL) + ENDDO + ENDIF +ENDIF +!-- whatever the source representation (from parametrisation =1 or file =2) +! apply a weighting coefficient representing transfer from DMS to SO2 +! 30% from Kloster et al., 2005 +DO JL=KIDIA,KFDIA + PDMSO(JL)=ZDMS2SO2 * PDMSO(JL) +ENDDO + +!VH IF(.NOT.LAERELVS) THEN +!VH DO JL=KIDIA,KFDIA +!VH ! renormalise by the mass of SO2 : no need with MACCity! +!VH ZSO2L(JL)=PSO2L(JL) +!VH ZSO2H(JL)=PSO2H(JL) +!VH ZSO2SOURC=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) + PDMSO(JL) +!VH PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) +!VH IF (LFIRE) THEN +!VH IF (PSOGF(JL) < 0._JPRB) THEN +!VH ZSOGF(JL) = -PSOGF(JL) +!VH ELSE +!VH ZSOGF(JL) = PSOGF(JL) +!VH ENDIF +!VH ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS +!VH ! Height of injection for biomass burning emissions : update tendancy +!VH IF (LINJ) THEN +!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN +!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) +!VH ILINJ1=IX(1) +!VH ILINJ2=ILINJ1 +!VH ! calculate total detltap over injected levels +!VH ZDELP=0.0_JPRB +!VH DO JK = ILINJ1, ILINJ2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = ILINJ1, ILINJ2 +!VH +!VH PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ELSE +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-3, KLEV-2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-3, KLEV-2 +!VH PSO2SRC(JL,JK) = ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ENDIF +!VH ELSE +!VH ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) +!VH !PSO2SRC(JL,KLEV) = ZSOGF(JL) +!VH ENDIF +!VH ENDIF +!VH PSO2SRC(JL,KLEV)= ZSO2SOURC +!VH PSO4SRC(JL,KLEV)= 0.0_JPRB +!VH !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC +!VH !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB +!VH ENDDO +!VH +!VH ELSE !LAERELVS +!VH DO JL=KIDIA,KFDIA +!VH ! renormalise by the mass of SO2 : no need with MACCity! +!VH ZSO2L(JL)=PSO2L(JL) +!VH ZSO2H(JL)=PSO2H(JL) +!VH ZSO2SOURC=ZSO2L(JL)*ZDIURN(JL) + PDMSO(JL) +!VH PSO2(JL)=(ZSO2L(JL)*ZDIURN(JL)+ZSO2H(JL)) +!VH IF (LFIRE) THEN +!VH !THIS NEEDS a CHANGE for NETs!!!!!!! +!VH IF (PSOGF(JL) < 0._JPRB) THEN +!VH ZSOGF(JL) = -PSOGF(JL) +!VH ELSE +!VH ZSOGF(JL) = PSOGF(JL) +!VH ENDIF +!VH +!VH ZSOGF(JL)=ZSOGF(JL)*ZSO2MSS +!VH IF (LINJ) THEN +!VH IF (PINJF(JL) > 200._JPRB .AND. PBLH(JL) > 1500._JPRB) THEN +!VH IX=MINLOC( ABS( (PAPHI(JL,1:KLEV)-PAPHI(JL,KLEV))/RG - PINJF(JL))) +!VH ILINJ1=IX(1) +!VH ILINJ2=ILINJ1 +!VH ! calculate total detltap over injected levels +!VH ZDELP=0.0_JPRB +!VH DO JK = ILINJ1, ILINJ2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = ILINJ1, ILINJ2 +!VH PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ELSE +!VH ZDELP=0.0_JPRB +!VH DO JK = KLEV-3, KLEV-2 +!VH ZDELP = ZDELP + ZDP(JL,JK) +!VH ENDDO +!VH DO JK = KLEV-3, KLEV-2 +!VH PSO2SRC(JL,JK) = PSO2SRC(JL,JK) + ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH !PTENC(JL,JK,KAERO(INBAER+2)) = PTENC(JL,JK,KAERO(INBAER+2)) +& +!VH !& ZSOGF(JL) * RG *ZDIURN(JL) / ZDELP +!VH ENDDO +!VH ENDIF +!VH ELSE +!VH ZSO2SOURC=ZSO2SOURC+ZSOGF(JL) +!VH !PSO2SRC(JL,KLEV) = PSO2SRC(JL,KLEV)+ZSOGF(JL) +!VH ENDIF +!VH ENDIF +!VH ! MOVE OUTSIDE +!VH ! aerosol module depnedent +!VH !PCFLX(JL,KAERO(INBAER+2))= -ZSO2SOURC !so2 +!VH !PCFLX(JL,KAERO(INBAER+1))= 0._JPRB !so4 +!VH PSO2SRC(JL,KLEV)= ZSO2SOURC +!VH PSO4SRC(JL,KLEV)= 0.0_JPRB +!VH ENDDO +!VH ! distributing the elevated source of SO2 over the four lowest layers +!VH ! original SO2 flux in kg m-2 s-1 (ZSO2H) +!VH ! Flux (kg m-2 s-1) = concentration (kg kg-1) DeltaPress(kg m-1 s-2) / [timestep (s) * gravity (m s-2)] +!VH ! therefore, increment concentration (kg kg-1 s-1) = flux * timestep * gravity / [DeltaPress * timestep ] +!VH +!VH ! TB +!VH ! TENDENCY update moved to respective aerosol modules +!VH ! +!VH ENDIF! LAERELVS + +!----------------------------------------------------------------------- +END ASSOCIATE +END ASSOCIATE +END SUBROUTINE SIMPLE_SULFUR_SRC diff --git a/ifs-source/arpifs/phys_ec/su_aerw.F90 b/ifs-source/arpifs/phys_ec/su_aerw.F90 index 70cfc357..2b8f2c13 100644 --- a/ifs-source/arpifs/phys_ec/su_aerw.F90 +++ b/ifs-source/arpifs/phys_ec/su_aerw.F90 @@ -98,11 +98,11 @@ SUBROUTINE SU_AERW(YDMODEL) ! ---------------------------------------------------------------- LOGICAL, POINTER :: LAERCLIMG, LAERCLIMZ, LAERCLIST, LAERDRYDP, LAERELVS,& - & LAEREXTR, LAERGBUD, LAERHYGRO, LAERNGAT, LAERPRNT, & + & LAEREXTR, LAERGBUD, LAERHYGRO, LAERLISI, LAERNGAT, LAERPRNT, LAERSCAV, & & LAERSEDIM, LAERSURF, LAERGTOP, LAER6SDIA, LAERCCN, LAERSEDIMSS, & - & LAERINIT, LAERCSTR, LAERRRTM, LAERDIAG1, LAERDIAG2, LAERUVP,& - & LAERVOL, LEPAERO, LAEROMIN, LOCNDMS,& - & LSEASALT_RH80, LAERDUSTSOURCE, LAERDUST_NEWBIN, LAERDUSTSIZEVAR + & LAERINIT, LAERCSTR, LAERRRTM, LAERDIAG1, LAERDIAG2, LAERUVP, LUVINDX, & + & LAERVOL, LAERCALIP, LEPAERO, LAEROMIN, LOCNDMS ,LAERSCAV_CHEM,LAERSOA_CHEM, LDRYDEPVEL_DYN, & + & LSEASALT_RH80, LAERDUSTSOURCE, LAERDUST_NEWBIN, LAERDUSTSIZEVAR, GUSTS,NOSEASALT INTEGER(KIND=JPIM), POINTER :: NAERCONF, NXT3DAER, NINIDAY, NBCOPTP,& & NDDOPTP, NOMOPTP, NSSOPTP, NSUOPTP, NVISWL, NDRYDEP, NDRYDEPVEL_DYN, & @@ -111,7 +111,7 @@ SUBROUTINE SU_AERW(YDMODEL) & NVOLERUZ(:), NVOLOPTP, NVOLHOMO, NINTERPT, NAER_BLNUCL, NVOLDATE(:), NAERSCAV REAL(KIND=JPRB), POINTER :: RAERDUB, RDDUAER(:), RFCTDUR, RFCTSSR, RLATVOL,& & RLONVOL, RSUCV1, RSUCV2, RAERDUST_REBOUND, & - & RAERVOLC(:,:), RAERVOLE(:,:), RVOLERUZ(:) + & RAERVOLC(:,:), RAERVOLE(:,:), RVOLERUZ(:), DCAL TYPE(TYPE_AERO_DESC), POINTER :: YAERO_DESC(:) @@ -152,6 +152,7 @@ SUBROUTINE SU_AERW(YDMODEL) ! Associate pointers for variables in namelist LAERCLIMG => YDEAERATM%LAERCLIMG NDRYDEPVEL_DYN=> YDEAERSNK%NDRYDEPVEL_DYN +LDRYDEPVEL_DYN=> YDEAERSNK%LDRYDEPVEL_DYN LAERCLIMZ => YDEAERATM%LAERCLIMZ LAERCLIST => YDEAERATM%LAERCLIST LAERDRYDP => YDEAERATM%LAERDRYDP @@ -163,8 +164,10 @@ SUBROUTINE SU_AERW(YDMODEL) LAERDUST_NEWBIN=>YDEAERATM%LAERDUST_NEWBIN LAERDUSTSIZEVAR=>YDEAERATM%LAERDUSTSIZEVAR LAERHYGRO => YDEAERATM%LAERHYGRO +LAERLISI => YDEAERATM%LAERLISI LAERNGAT => YDEAERATM%LAERNGAT LAERPRNT => YDEAERATM%LAERPRNT +LAERSCAV => YDEAERATM%LAERSCAV LAERSEDIM => YDEAERATM%LAERSEDIM LAERSEDIMSS => YDEAERATM%LAERSEDIMSS LAERSURF => YDEAERATM%LAERSURF @@ -177,7 +180,9 @@ SUBROUTINE SU_AERW(YDMODEL) LAERDIAG1 => YDEAERATM%LAERDIAG1 LAERDIAG2 => YDEAERATM%LAERDIAG2 LAERUVP => YDEAERATM%LAERUVP +LUVINDX => YDEAERATM%LUVINDX LAERVOL => YDEAERATM%LAERVOL +LAERCALIP => YDEAERATM%LAERCALIP NAERCONF => YDEAERATM%NAERCONF NXT3DAER => YDEAERATM%NXT3DAER NINIDAY => YDEAERATM%NINIDAY @@ -187,6 +192,8 @@ SUBROUTINE SU_AERW(YDMODEL) NSSOPTP => YDEAERATM%NSSOPTP NSUOPTP => YDEAERATM%NSUOPTP NVISWL => YDEAERATM%NVISWL +LAERSCAV_CHEM => YDEAERATM%LAERSCAV_CHEM +LAERSOA_CHEM => YDEAERATM%LAERSOA_CHEM NAERSCAV => YDEAERATM%NAERSCAV LSEASALT_RH80=> YDEAERATM%LSEASALT_RH80 NTYPAER => YDEAERATM%NTYPAER @@ -195,6 +202,9 @@ SUBROUTINE SU_AERW(YDMODEL) LAEROMIN => YDEAERSRC%LAEROMIN LOCNDMS => YDEAERSRC%LOCNDMS NDDUST => YDEAERSRC%NDDUST +DCAL => YDEAERSRC%DCAL +GUSTS => YDEAERSRC%GUSTS +NOSEASALT => YDEAERSRC%NOSEASALT NSO4SCHEME => YDEAERSRC%NSO4SCHEME NAER_BLNUCL => YDEAERATM%NAER_BLNUCL NSSALT => YDEAERSRC%NSSALT @@ -294,6 +304,11 @@ SUBROUTINE SU_AERW(YDMODEL) ! Default to backwards compatibility for now LSEASALT_RH80 = .TRUE. +! Applies to case of active aerosols: +NOSEASALT = .FALSE. ! Switch on/off sea salt emissions +GUSTS = .FALSE. ! Not used yet +DCAL = 0._JPRB ! Scale factor for Tegen dust (NDDUST==8) only + IF (NAERO == 0) THEN LEPAERO =.FALSE. LAERCLIMG=.FALSE. @@ -305,6 +320,9 @@ SUBROUTINE SU_AERW(YDMODEL) LAERGTOP =.FALSE. LAERHYGRO=.FALSE. LAERNGAT =.FALSE. + LAERSCAV=.FALSE. + LAERSCAV_CHEM =.FALSE. + LAERSOA_CHEM =.FALSE. NAERSCAV = 0 LAERDUSTSOURCE =.FALSE. LAERDUST_NEWBIN =.FALSE. @@ -371,6 +389,62 @@ SUBROUTINE SU_AERW(YDMODEL) !-- define a default configuration that can be modified through the "naeaer" namelist CASE ("glomap") CALL ABOR1("OIFS - glomap should never be called from OIFS, EXIT") +!-- define a default configuration that can be modified through the "naeaer" namelist + ! HAM-M7 only solves micro-physics, all other processes are handled + ! by the TM5-M7 routines. We therefore set all TM5-M7 switches, but + ! use HAM-M7-specific switches in the micro-physics routines. + CASE ("hamm7") + + LEPAERO =.FALSE. + LAERRAD =.FALSE. + + LAERCLIMG=.FALSE. + LAERCLIMZ=.FALSE. + LAERCLIST=.FALSE. + + LAERDRYDP=.TRUE. + LAERGTOP =.TRUE. + LAERLISI =.FALSE. + LAERCALIP=.FALSE. + LAERNGAT =.TRUE. + LAERSCAV =.TRUE. + LAERSCAV_CHEM =.FALSE. + LAERSEDIM=.TRUE. + LAERSURF =.TRUE. + LAERELVS =.FALSE. + LAER6SDIA=.FALSE. + LAERCCN =.FALSE. + LAERCSTR =.FALSE. + LAERRRTM =.FALSE. + LAERUVP =.FALSE. + LUVINDX =.FALSE. + LAERNITRATE = .FALSE. + LDRYDEPVEL_DYN=.FALSE. + + REPSCAER=1.E-20_JPRB ! minimum value for AOD + + !-- minimum oceanic production of DMS + RDMSMIN = 5.E-11_JPRB + NDMSO = 2 + NPIST = 1 + ! -- Dust scheme (Recommend 3 as default, 8 for Tegen) + NDDUST =3 + ! See scheme 'aer' below for other possible default + !NSSALT =3 ! not used - superseded by HAMM7 dedicated scheme + + !-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU + ! Use 2 by default, and if Tegen (nddust=8) then use 0 + NAERWND = 2 +!-- other values would be: (see *aer_src*) +!- NAERWND = 0 for "plain" 10-m wind as predictor for sea salt and desert dust emissions +!- NAERWND = 1 for wind+gust in sea salt emission +!- NAERWND = 2 for wind+gust in dust emission +!- NAERWND = 3 for wind+gust in sea salt and dust emissions + +!-- Sulphate scheme + NSO4SCHEME = 2 + WRITE(UNIT=NULOUT,FMT='('' NAERWND= '',I1)') & + & NAERWND CASE ("aer") @@ -473,7 +547,7 @@ SUBROUTINE SU_AERW(YDMODEL) RAERVOLE(:,:)=0._JPRB RVOLERUZ(:)= 1._JPRB - LAERINIT =.FALSE. + ! LAERINIT =.FALSE. -> RCHG FIXME (is this needed) !-- default value are for use of "plain" or "gusty" 10-m wind as predictor for SS and DU NAERWND = 2 @@ -493,7 +567,7 @@ SUBROUTINE SU_AERW(YDMODEL) ! 4 is Nabat et al 2012 with roughness length of smooth erodible ! surfaces NDDUST =3 -!-- Sulphate sceheme : 1 is operational +!-- Sulphate scheme : 1 is operational ! 2 is "mocage like" from MF J.Bock NSO4SCHEME = 1 RAERDUB=1.E-11_JPRB ! dust emission potential modulated by the areas' RDDUAER @@ -850,8 +924,8 @@ SUBROUTINE SU_AERW(YDMODEL) & ,'' LAERNITRATE = '',L5 & & ,'' NMAXTAER = '',I2 ,'' NDDUST = '',I1 & & ,'' NSSALT = '',I1,'' NSO4SCHEME = '',I1 & - & ,'' NINIDAY = '',I8)') & - & AERO_SCHEME,LEPAERO,LAERNITRATE,NMAXTAER,NDDUST,NSSALT,NSO4SCHEME,NINIDAY + & ,'' NINIDAY = '',I8,'' DCAL = '',F10.4,'' NOSEASALT = '',L5,'' GUSTS = '',L5)') & + & AERO_SCHEME,LEPAERO,LAERNITRATE,NMAXTAER,NDDUST,NSSALT,NSO4SCHEME,NINIDAY,DCAL,NOSEASALT,GUSTS WRITE(UNIT=NULOUT,FMT='('' NAERO = '',I2,'' NACTAERO = '',I2,& &'' NXT3DAER = '',I2,'' NAERCONF = '',I3)') & diff --git a/ifs-source/arpifs/phys_ec/sucldp.F90 b/ifs-source/arpifs/phys_ec/sucldp.F90 index 1bf26514..cdf6bf94 100644 --- a/ifs-source/arpifs/phys_ec/sucldp.F90 +++ b/ifs-source/arpifs/phys_ec/sucldp.F90 @@ -421,8 +421,8 @@ SUBROUTINE SUCLDP(YDSTA,YDDIMV,YDPHY2,YDECLDP) RCL_KKAAU = 1350._JPRB ! s-1 RCL_KKBAUQ = 2.47_JPRB RCL_KKBAUN = -1.79_JPRB -RCL_KK_CLOUD_NUM_SEA = 50._JPRB ! m-3 -RCL_KK_CLOUD_NUM_LAND = 300._JPRB ! m-3 +RCL_KK_CLOUD_NUM_SEA = 50._JPRB ! cm-3 +RCL_KK_CLOUD_NUM_LAND = 300._JPRB ! cm-3 ! default false: use constant ZEaut, ZEacc ! if true, use regime-dependent FSD to calculate ! ZEaut and ZEacc diff --git a/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 b/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 index a9e5cb55..d4aee888 100644 --- a/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 +++ b/ifs-source/arpifs/phys_radi/ice_effective_radius.F90 @@ -43,7 +43,7 @@ SUBROUTINE ICE_EFFECTIVE_RADIUS & ! INPUT ARGUMENTS ! *** Array dimensions and ranges -TYPE(TERAD) ,INTENT(INOUT):: YDERAD +TYPE(TERAD) ,INTENT(IN) :: YDERAD TYPE(TSPP_CONFIG) ,INTENT(IN) :: YDSPP_CONFIG INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA ! Start column to process INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA ! End column to process diff --git a/ifs-source/arpifs/phys_radi/raddrv.F90 b/ifs-source/arpifs/phys_radi/raddrv.F90 index a1721699..4ad6d294 100644 --- a/ifs-source/arpifs/phys_radi/raddrv.F90 +++ b/ifs-source/arpifs/phys_radi/raddrv.F90 @@ -83,7 +83,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) USE GEOMETRY_MOD , ONLY : GEOMETRY USE PARKIND1 , ONLY : JPIM, JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK, JPHOOK - +USE YOMCT3 , ONLY : NSTEP ! ------------------------------------------------------------------ IMPLICIT NONE @@ -196,6 +196,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) REAL(KIND=JPRB) :: ZTRENU9T(KGPTOT) REAL(KIND=JPRB) :: ZVFLSMT (KGPTOT) +REAL(KIND=JPRB), ALLOCATABLE :: ZRE_LIQT(:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZRE_ICET(:,:) + !-- REAL(KIND=JPRB) :: ZFRTED (KGPTOT,YDMODEL%YRML_PHY_RAD%YRERAD%NLWOUT) REAL(KIND=JPRB) :: ZTRSODT (KGPTOT) @@ -245,6 +248,13 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) REAL(KIND=JPRB), ALLOCATABLE :: Z2T9T (:,:) REAL(KIND=JPRB), ALLOCATABLE :: Z2O39T (:,:) REAL(KIND=JPRB), ALLOCATABLE :: ZAEROT(:,:,:) + + +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROTAU(:,:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROASYM(:,:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROSSA(:,:,:) +REAL(KIND=JPRB), ALLOCATABLE :: ZAEROTAULW(:,:,:) + REAL(KIND=JPRB), ALLOCATABLE :: ZLWDERIVATIVE(:,:) INTEGER(KIND=JPIM) :: IBL, IEND, IFDIA, IGL1,& @@ -269,11 +279,14 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV, YDGEM=>YDGEOMETRY%YRGEM, & & YDGSGEOM=>YDGEOMETRY%YRGSGEOM, YDOROG=>YDGEOMETRY%YROROG, YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & ! use this to transfer AOD, SSA and ASY to rad scheme + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP, & & YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, & & YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM, YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG, YDSPP=>YDMODEL%YRML_SPP) ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, NDIM=>YGFL%NDIM, & & YAERO=>YGFL%YAERO, YI=>YGFL%YI, YL=>YGFL%YL, YO3=>YGFL%YO3, YQ=>YGFL%YQ, & + & YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & & YR=>YGFL%YR, YS=>YGFL%YS,NFSD=>YGFL%NFSD, & & GFL=>YDGFL%GFL,GMVT1=>YDGMV%GMVT1,GMVT1S=>YDGMV%GMVT1S, & & GMV=>YDGMV%GMV,GMVS=>YDGMV%GMVS,YT1=>YDGMV%YT1,YPH9=>YDGMV%YPH9, & @@ -281,9 +294,11 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & NFLEVG=>YDDIMV%NFLEVG, LERADIMPL=>YDEPHY%LERADIMPL, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & & LEPO3RA=>YDERAD%LEPO3RA, NMODE=>YDERAD%NMODE, NRPROMA=>YDERAD%NRPROMA, & + & NCLOUDACT=>YDERAD%NCLOUDACT, & & NTSW=>YDERAD%NTSW, NLWEMISS=>YDERAD%NLWEMISS, NLWOUT=>YDERAD%NLWOUT, & & RCARDI=>YDERDI%RCARDI, & & NGPTOT=>YDGEM%NGPTOT, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & NDIMGMV=>YDGMV%NDIMGMV, NDIMGMVS=>YDGMV%NDIMGMVS, & & DERIVATIVELW=>YDRADF%DERIVATIVELW, EMTC=>YDRADF%EMTC, EMTD=>YDRADF%EMTD, & & SRCDIR=>YDRADF%SRCDIR, SRFDIR=>YDRADF%SRFDIR, SRLWD=>YDRADF%SRLWD, & @@ -334,13 +349,30 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ALLOCATE(ZFSDT(KGPTOT,NFLEVG)) ELSE ALLOCATE(ZFSDT(1,1)) -ENDIF +ENDIF + IF(NACTAERO > 0) THEN ALLOCATE(ZAEROT(KGPTOT,NFLEVG,NAERO)) + ALLOCATE(ZAEROTAU(KGPTOT,NFLEVG,14)) + ALLOCATE(ZAEROSSA(KGPTOT,NFLEVG,14)) + ALLOCATE(ZAEROASYM(KGPTOT,NFLEVG,14)) + ALLOCATE(ZAEROTAULW(KGPTOT,NFLEVG,16)) ELSE ALLOCATE(ZAEROT(1,1,1)) + ALLOCATE(ZAEROTAU(1,1,1)) + ALLOCATE(ZAEROSSA(1,1,1)) + ALLOCATE(ZAEROASYM(1,1,1)) + ALLOCATE(ZAEROTAULW(1,1,1)) ENDIF +IF (NCLOUDACT > 0) THEN + ALLOCATE(ZRE_LIQT(KGPTOT,NFLEVG)) + ALLOCATE(ZRE_ICET(KGPTOT,NFLEVG)) +ELSE + ALLOCATE(ZRE_LIQT(1,1)) + ALLOCATE(ZRE_ICET(1,1)) +END IF + IF( LRAYFM )THEN CALL GSTATS(1201,0) ! METEO FRANCE REQUIRE THESE ARRAYS @@ -510,6 +542,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDIF ENDDO ENDIF + DO JSW=1,NTSW DO JL=IST,IEND ZALBDT (JSTGLO+JL-1,JSW) =ZALBD (JL,JSW) @@ -579,6 +612,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) Z2Q9T (JSTGLO+JL-1,JK)=GFL(JL,JK,YQ%MP9_PH,IBL) ENDDO ENDDO + DO JK=1,NFLEVG if(LERADIMPL)THEN !DIR$ IVDEP @@ -592,6 +626,7 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO endif ENDDO + IF(LEPO3RA) THEN IF(YO3%LGP .AND. .NOT. (YGFL%NCHEM>0 .AND. YDCHEM%LCHEM_O3RAD) ) THEN DO JK=1,NFLEVG @@ -610,6 +645,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ENDDO ENDIF ENDIF + + IF (NFSD > 0) THEN DO JK=1,NFLEVG !DIR$ IVDEP @@ -617,17 +654,68 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ZFSDT(JSTGLO+JL-1,JK)=GFL(JL,JK,YFSD%MP9_PH,IBL) ENDDO ENDDO - ENDIF + ENDIF + + IF (NACTAERO > 0) THEN - DO JAER=1,NAERO + IF (TRIM(AERO_SCHEME) == "aer" ) THEN + DO JAER=1,NAERO + DO JK=1,NFLEVG + !DIR$ IVDEP + DO JL=IST,IEND + ZAEROT(JSTGLO+JL-1,JK,JAER)=GFL(JL,JK,YAERO(JAER)%MP9_PH,IBL) + ENDDO + ENDDO + ENDDO + ENDIF!nstep + + DO JAER=1,14 DO JK=1,NFLEVG -!DIR$ IVDEP DO JL=IST,IEND - ZAEROT(JSTGLO+JL-1,JK,JAER)=GFL(JL,JK,YAERO(JAER)%MP9_PH,IBL) + ZAEROTAU(JSTGLO+JL-1,JK,JAER) =0.0_JPRB + ZAEROSSA(JSTGLO+JL-1,JK,JAER) =0.0_JPRB + ZAEROASYM(JSTGLO+JL-1,JK,JAER)=0.0_JPRB ENDDO ENDDO - ENDDO - ENDIF + ENDDO + DO JAER=1,16 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=0.0_JPRB + ENDDO + ENDDO + ENDDO + + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + + DO JAER=1,14 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAU(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROSSA(JSTGLO+JL-1,JK,JAER) = YDAERM7%M7SSA(JL,JK,JAER,IBL) ! This weighting is done in add_aerosol_optics_direct: *YDAERM7%M7AOD(JL,JK,JAER,IBL) + ZAEROASYM(JSTGLO+JL-1,JK,JAER)= YDAERM7%M7ASYM(JL,JK,JAER,IBL) ! This weighting is done in add_aerosol_optics_direct: *YDAERM7%M7SSA(JL,JK,JAER,IBL)*YDAERM7%M7AOD(JL,JK,JAER,IBL) + ENDDO + ENDDO + ENDDO + DO JAER=1,16 + DO JK=1,NFLEVG + DO JL=IST,IEND + ZAEROTAULW(JSTGLO+JL-1,JK,JAER)=YDAERM7%M7AODLW(JL,JK,JAER,IBL) + ENDDO + ENDDO + ENDDO + + IF (NCLOUDACT > 0) THEN + DO JK=1,NFLEVG + DO JL=IST,IEND + ZRE_LIQT(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_LIQ%MP9_PH,IBL) + ZRE_ICET(JSTGLO+JL-1,JK) = GFL(JL,JK,YRE_ICE%MP9_PH,IBL) + END DO + END DO + END IF + ENDIF ! M7 + ENDIF ! NACTAERO + DO JK=1,NFLEVG DO JL=IST,IEND ZDELP9T (JSTGLO+JL-1,JK)=ZDELP9(JL,JK) @@ -690,7 +778,8 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) & NFLEVG ,NMODE,& & ZALBDT ,ZALBPT ,ZCCNLT ,ZCCNOT ,ZPRE9T ,ZPRE9FT ,RCARDI ,ZNEBT,& & ZQO3 ,ZAER ,ZAERMACCS,ZAERMACCL,ZAERMACCSJ,ZAERMACCLJ,& - & ZAERTGS,ZAERTGL,ZAEROT ,ZGHG,& + & ZAERTGS ,ZAERTGL ,ZAEROT ,ZGHG,& + & ZAEROTAU ,ZAEROSSA ,ZAEROASYM ,ZAEROTAULW,& & ZDELP9T ,ZSPECTRALEMISST,& & ZMU0MT ,Z2Q9T,& & ZQSATT ,ZQICET ,ZQSNOWT ,ZQLIT ,ZFSDT ,ZQRAIT ,ZRAITT,& @@ -700,7 +789,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) ! ML: move zpertt before flux outputs & ZPERTT,& & ZEMITT ,ZTHT ,ZFRTED, ZTRSODT ,ZTRSODCT,ZTRTEDCT,ZSUDUT ,ZUVDFT ,ZPARFT ,ZPARCFT, ZTINCFT,& - & ZFDIRT ,ZCDIRT , ZLWDERIVATIVE ) + & ZFDIRT ,ZCDIRT , ZLWDERIVATIVE, & + & ZRE_LIQT, ZRE_ICET) + ! PERFORM RADIATION DIAGNOSTICS @@ -840,6 +931,9 @@ SUBROUTINE RADDRV(YDGEOMETRY,YDFIELDS,YDMODEL,KGPTOT,KFLDS,KBLOCKS,PGPIN) IF(ALLOCATED(ZAERTGS))DEALLOCATE(ZAERTGS) IF(ALLOCATED(ZAERTGL))DEALLOCATE(ZAERTGL) IF(ALLOCATED(ZLWDERIVATIVE)) DEALLOCATE(ZLWDERIVATIVE) +IF(ALLOCATED(ZRE_LIQT))DEALLOCATE(ZRE_LIQT) +IF(ALLOCATED(ZRE_ICET))DEALLOCATE(ZRE_ICET) + ! ------------------------------------------------------------------ END ASSOCIATE diff --git a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 index 52537c5b..60887a6b 100644 --- a/ifs-source/arpifs/phys_radi/radiation_scheme.F90 +++ b/ifs-source/arpifs/phys_radi/radiation_scheme.F90 @@ -6,26 +6,29 @@ ! granted to it by virtue of its status as an intergovernmental organisation ! nor does it submit to any jurisdiction SUBROUTINE RADIATION_SCHEME & - & (YDMODEL,KIDIA, KFDIA, KLON, KLEV, KAEROSOL, & - & PSOLAR_IRRADIANCE, & - & PMU0, PTEMPERATURE_SKIN, PALBEDO_DIF, PALBEDO_DIR, & - & PSPECTRALEMISS, & - & PCCN_LAND, PCCN_SEA, & - & PGELAM, PGEMU, PLAND_SEA_MASK, & - & PPRESSURE, PTEMPERATURE, & - & PPRESSURE_H, PTEMPERATURE_H, & - & PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, & - & PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, & - & PAEROSOL_OLD, PAEROSOL, & - & PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, & - & PFLUX_SW_DN, PFLUX_LW_DN, PFLUX_SW_DN_CLEAR, PFLUX_LW_DN_CLEAR, & - & PFLUX_DIR, PFLUX_DIR_CLEAR, PFLUX_DIR_INTO_SUN, & - & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & - & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & - & PSWDIFFUSEBAND, PSWDIRECTBAND, PPERT, PFSD) + & (YDMODEL,KIDIA, KFDIA, KLON, KLEV, KBL, KAEROSOL, & + & PSOLAR_IRRADIANCE, & + & PMU0, PTEMPERATURE_SKIN, PALBEDO_DIF, PALBEDO_DIR, & + & PSPECTRALEMISS, & + & PCCN_LAND, PCCN_SEA, & + & PGELAM, PGEMU, PLAND_SEA_MASK, & + & PPRESSURE, PTEMPERATURE, & + & PPRESSURE_H, PTEMPERATURE_H, & + & PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, & + & PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, & + & PAEROSOL_OLD, PAEROSOL, & + & PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, & + & PFLUX_SW_DN, PFLUX_LW_DN, PFLUX_SW_DN_CLEAR, PFLUX_LW_DN_CLEAR, & + & PFLUX_DIR, PFLUX_DIR_CLEAR, PFLUX_DIR_INTO_SUN, & + & PFLUX_UV, PFLUX_PAR, PFLUX_PAR_CLEAR, & + & PFLUX_SW_DN_TOA, PEMIS_OUT, PLWDERIVATIVE, & + & PSWDIFFUSEBAND, PSWDIRECTBAND, & + & PAEROM7_TAU, PAEROM7_SSA, PAEROM7_ASYM, PAEROM7_TAULW, & ! added for M7 aerosol + & PRE_LIQ, PRE_ICE, & + & PPERT, PFSD) ! RADIATION_SCHEME - Interface to modular radiation scheme -! +! ! PURPOSE ! ------- ! The modular radiation scheme is contained in a separate @@ -71,7 +74,7 @@ SUBROUTINE RADIATION_SCHEME & USE YOMRIP0 , ONLY : NINDAT USE YOMCT3 , ONLY : NSTEP USE YOMCST , ONLY : RPI, RSIGMA ! Stefan-Boltzmann constant -USE YOMLUN , ONLY : NULERR +USE YOMLUN , ONLY : NULERR, NULOUT USE SPP_GEN_MOD , ONLY : SPP_PERT USE MPL_MYRANK_MOD , ONLY : MPL_MYRANK USE RADIATION_SETUP, ONLY : ITYPE_TROP_BG_AER, ITYPE_STRAT_BG_AER @@ -80,15 +83,19 @@ SUBROUTINE RADIATION_SCHEME & USE RADIATION_CONFIG, ONLY : ISOLVERSPARTACUS USE RADIATION_SINGLE_LEVEL, ONLY : SINGLE_LEVEL_TYPE USE RADIATION_THERMODYNAMICS, ONLY : THERMODYNAMICS_TYPE -USE RADIATION_GAS, ONLY : GAS_TYPE,& - & IMASSMIXINGRATIO, IVOLUMEMIXINGRATIO,& - & IH2O, ICO2, ICH4, IN2O, ICFC11, ICFC12, IHCFC22, ICCL4, IO3, IO2 +USE RADIATION_GAS, ONLY : GAS_TYPE, & + & IMASSMIXINGRATIO, IVOLUMEMIXINGRATIO, & + & IH2O, ICO2, ICH4, IN2O, ICFC11, ICFC12, & + & IHCFC22, ICCL4, IO3, IO2 USE RADIATION_CLOUD, ONLY : CLOUD_TYPE USE RADIATION_AEROSOL, ONLY : AEROSOL_TYPE USE RADIATION_FLUX, ONLY : FLUX_TYPE USE RADIATION_INTERFACE, ONLY : RADIATION, SET_GAS_UNITS USE RADIATION_SAVE, ONLY : SAVE_INPUTS, SAVE_FLUXES +! CMIP6/7 straotspheric aerosols +USE YOEAEROP, ONLY: STRATO_CMIP_NMONTH, STRATO_CMIP_NTB, STRATO_CMIP_NSB + IMPLICIT NONE ! INPUT ARGUMENTS @@ -99,6 +106,7 @@ SUBROUTINE RADIATION_SCHEME & INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA ! End column to process INTEGER(KIND=JPIM),INTENT(IN) :: KLON ! Number of columns INTEGER(KIND=JPIM),INTENT(IN) :: KLEV ! Number of levels +INTEGER(KIND=JPIM),INTENT(IN) :: KBL ! Block to read strat aerosols INTEGER(KIND=JPIM),INTENT(IN) :: KAEROSOL ! Number of aerosol types ! *** Single-level fields @@ -146,6 +154,11 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(IN) :: PAEROSOL_OLD(KLON,6,KLEV) REAL(KIND=JPRB), INTENT(IN) :: PAEROSOL(KLON,KLEV,KAEROSOL) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_TAU(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_SSA(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_ASYM(KLON,KLEV,14) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PAEROM7_TAULW(KLON,KLEV,16) + REAL(KIND=JPRB), INTENT(IN) :: PCCN_LAND(KLON) REAL(KIND=JPRB), INTENT(IN) :: PCCN_SEA(KLON) @@ -193,6 +206,9 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPRB), INTENT(OUT) :: PSWDIFFUSEBAND(KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) REAL(KIND=JPRB), INTENT(OUT) :: PSWDIRECTBAND (KLON,YDMODEL%YRML_PHY_RAD%YRERAD%NSW) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PRE_LIQ(KLON,KLEV) +REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PRE_ICE(KLON,KLEV) + ! SPP perturbations REAL(KIND=JPRB), INTENT(IN), OPTIONAL :: PPERT(KLON, YDMODEL%YRML_GCONF%YRSPP_CONFIG%SM%NRFTOTAL_RADGRID) @@ -205,6 +221,7 @@ SUBROUTINE RADIATION_SCHEME & TYPE(GAS_TYPE) :: GAS TYPE(CLOUD_TYPE) :: YLCLOUD TYPE(AEROSOL_TYPE) :: AEROSOL +TYPE(AEROSOL_TYPE) :: STRAT_AEROSOL TYPE(FLUX_TYPE) :: FLUX ! Mass mixing ratio of ozone (kg/kg) @@ -241,7 +258,7 @@ SUBROUTINE RADIATION_SCHEME & INTEGER(KIND=JPIM) :: ITIM, IDAY ! Loop indices -INTEGER(KIND=JPIM) :: JLON, JLEV, JBAND, JAER +INTEGER(KIND=JPIM) :: JLON, JLEV, JBAND, JAER, JIW, IJLEV, JSW_ORDERED_BIS ! Have any fluxes been returned that are out of a physically ! reasonable range? This integer stores the number of blocks of fluxes @@ -260,6 +277,16 @@ SUBROUTINE RADIATION_SCHEME & REAL(KIND=JPHOOK) :: ZHOOK_HANDLE +! CMIP6/7 stratospheric aerosols - ALaakso +REAL(KIND=JPRB) :: ZAODSTRAT_M (KLON,KLEV, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAAODSTRAT_M (KLON,KLEV, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZREFAODSTRAT_M (KLON,KLEV, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAAODSTRAT_LW_M(KLON,KLEV, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH) +REAL(KIND=JPRB) :: ZAODSTRAT (KLON,KLEV, STRATO_CMIP_NSB) +REAL(KIND=JPRB) :: ZAAODSTRAT (KLON,KLEV, STRATO_CMIP_NSB) +REAL(KIND=JPRB) :: ZREFAODSTRAT (KLON,KLEV, STRATO_CMIP_NSB) +REAL(KIND=JPRB) :: ZAAODSTRAT_LW (KLON,KLEV, STRATO_CMIP_NTB) +INTEGER(KIND=JPIM) :: KTROPPAUSE(KLON) ! Import time functions for iseed calculation #include "fcttim.func.h" @@ -270,35 +297,60 @@ SUBROUTINE RADIATION_SCHEME & #include "satur.intfb.h" !#include "abor1.intfb.h" +!CMIP7 stratospheric aerosols +#include "cmip_strato_aero_interp.intfb.h" +#include "cmip_strato_aero_process.intfb.h" + IF (LHOOK) CALL DR_HOOK('RADIATION_SCHEME',0,ZHOOK_HANDLE) -ASSOCIATE(YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION, & - & YRERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) -ASSOCIATE(RAD_CONFIG=>YDRADIATION%RAD_CONFIG, & - & NWEIGHT_UV=>YDRADIATION%NWEIGHT_UV, & - & IBAND_UV =>YDRADIATION%IBAND_UV(:), & - & WEIGHT_UV =>YDRADIATION%WEIGHT_UV(:), & - & NWEIGHT_PAR=>YDRADIATION%NWEIGHT_PAR, & - & IBAND_PAR =>YDRADIATION%IBAND_PAR(:), & - & WEIGHT_PAR=>YDRADIATION%WEIGHT_PAR(:), & - & TROP_BG_AER_MASS_EXT=>YDRADIATION%TROP_BG_AER_MASS_EXT, & - & STRAT_BG_AER_MASS_EXT=>YDRADIATION%STRAT_BG_AER_MASS_EXT) +ASSOCIATE(YDRADIATION => YDMODEL%YRML_PHY_RAD%YRADIATION, & + & YRERAD => YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDSPP_CONFIG => YDMODEL%YRML_GCONF%YRSPP_CONFIG, & + & YDEAERATM => YDMODEL%YRML_PHY_RAD%YREAERATM, & + & YDCOMPO => YDMODEL%YRML_CHEM%YRCOMPO) +ASSOCIATE(NCLOUDACT => YRERAD%NCLOUDACT, & + & RAD_CONFIG => YDRADIATION%RAD_CONFIG, & + & NWEIGHT_UV => YDRADIATION%NWEIGHT_UV, & + & IBAND_UV => YDRADIATION%IBAND_UV(:), & + & WEIGHT_UV => YDRADIATION%WEIGHT_UV(:), & + & NWEIGHT_PAR => YDRADIATION%NWEIGHT_PAR, & + & IBAND_PAR => YDRADIATION%IBAND_PAR(:), & + & WEIGHT_PAR => YDRADIATION%WEIGHT_PAR(:), & + & TROP_BG_AER_MASS_EXT => YDRADIATION%TROP_BG_AER_MASS_EXT, & + & STRAT_BG_AER_MASS_EXT => YDRADIATION%STRAT_BG_AER_MASS_EXT, & + & AERO_SCHEME => YDCOMPO%AERO_SCHEME) + +ASSOCIATE(YDPHYAER => YDMODEL%YRML_PHY_AER ) +ASSOCIATE(YDAERSTRAT => YDPHYAER%YREAEROSTRAT ) + ! Allocate memory in radiation objects CALL SINGLE_LEVEL%ALLOCATE(KLON, YRERAD%NSW, YRERAD%NLWEMISS, & & USE_SW_ALBEDO_DIRECT=.TRUE.) CALL THERMODYNAMICS%ALLOCATE(KLON, KLEV, USE_H2O_SAT=.TRUE.) CALL GAS%ALLOCATE(KLON, KLEV) CALL YLCLOUD%ALLOCATE(KLON, KLEV) -IF (YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN & - & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & - & .OR. YRERAD%NAERMACC == 1) THEN - CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) ! MACC aerosols + +! LAERCCN -> .T. if we use prognostic aerosols to define the Re of liq.wat.clds +! LAERRRTM -> .T. if RRTM uses information from prognostic aerosols +! NAERMACC -> 0 => Tegen climatology || 1 => MACC based climatology +IF (YDEAERATM%LAERCCN .OR. YDEAERATM%LAERRRTM .OR. YRERAD%NAERMACC == 1) THEN + ! For "aer" and MACC clim. -> allocates arrays mixing-ratio -> used to calc. opt. prop. + ! For "hamm7" -> allocates directly arrays of optical properties if used by RRTM + ! else we fallback on MACC clim. + IF ( TRIM(AERO_SCHEME) == "hamm7" .AND. YDEAERATM%LAERRRTM ) THEN + CALL AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) + ELSE + CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, KAEROSOL) + ! MACC aerosols (Number of columns, istartlev, iendlev, number of SW+LW bands) + ENDIF ELSE CALL AEROSOL%ALLOCATE(KLON, 1, KLEV, 6) ! Tegen climatology ENDIF CALL FLUX%ALLOCATE(RAD_CONFIG, 1, KLON, KLEV) +! Stratospheric aerosols. Fields are 0 if LCMIP6_STRATAER_FULL = FALSE +CALL STRAT_AEROSOL%ALLOCATE_DIRECT(RAD_CONFIG, KLON, 1, KLEV) + ! Set thermodynamic profiles: simply copy over the half-level ! pressure and temperature THERMODYNAMICS%PRESSURE_HL (KIDIA:KFDIA,:) = PPRESSURE_H (KIDIA:KFDIA,:) @@ -341,7 +393,7 @@ SUBROUTINE RADIATION_SCHEME & ! the thermodynamics structure !CALL thermodynamics%calc_saturation_wrt_liquid(KIDIA, KFDIA) -! Set single-level fileds +! Set single-level fields SINGLE_LEVEL%SOLAR_IRRADIANCE = PSOLAR_IRRADIANCE SINGLE_LEVEL%COS_SZA(KIDIA:KFDIA) = PMU0(KIDIA:KFDIA) SINGLE_LEVEL%SKIN_TEMPERATURE(KIDIA:KFDIA) = PTEMPERATURE_SKIN(KIDIA:KFDIA) @@ -404,20 +456,27 @@ SUBROUTINE RADIATION_SCHEME & YLCLOUD%Q_ICE(KIDIA:KFDIA,:) = PQ_ICE(KIDIA:KFDIA,:) + PQ_SNOW(KIDIA:KFDIA,:) YLCLOUD%FRACTION(KIDIA:KFDIA,:) = PCLOUD_FRAC(KIDIA:KFDIA,:) +! Get/Compute effective radii and convert to metres +IF(NCLOUDACT > 0) THEN + ZRE_LIQUID_UM(KIDIA:KFDIA,:) = MAX(2.0E-06_JPRB, PRE_LIQ(KIDIA:KFDIA,:)) * 1.E6_JPRB + ZRE_ICE_UM(KIDIA:KFDIA,:) = PRE_ICE(KIDIA:KFDIA,:) * 1.E6_JPRB +ELSE ! Compute effective radii and convert to metres -CALL LIQUID_EFFECTIVE_RADIUS(YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDMODEL%YRML_PHY_EC%YRECLDP,YDSPP_CONFIG,YDMODEL%YRML_GCONF%YGFL, & - & KIDIA, KFDIA, KLON, KLEV, & - & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQUID, PQ_RAIN, & - & PLAND_SEA_MASK, PCCN_LAND, PCCN_SEA, & - & ZRE_LIQUID_UM, PPERT=PPERT) -YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB + CALL LIQUID_EFFECTIVE_RADIUS(YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDMODEL%YRML_PHY_EC%YRECLDP,YDSPP_CONFIG,YDMODEL%YRML_GCONF%YGFL, & + & KIDIA, KFDIA, KLON, KLEV, & + & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQUID, PQ_RAIN, & + & PLAND_SEA_MASK, PCCN_LAND, PCCN_SEA, & + & ZRE_LIQUID_UM, PPERT=PPERT) + + CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & + & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, & + & ZRE_ICE_UM, PPERT=PPERT) +ENDIF -CALL ICE_EFFECTIVE_RADIUS(YRERAD, YDSPP_CONFIG, KIDIA, KFDIA, KLON, KLEV, & - & PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, & - & ZRE_ICE_UM, PPERT=PPERT) -YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB +YLCLOUD%RE_LIQ(KIDIA:KFDIA,:) = MIN((MAX((ZRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB),2.0E-6_JPRB)), 50.0E-6_JPRB) ! threshold liq effective radius 2-50 um +YLCLOUD%RE_ICE(KIDIA:KFDIA,:) = MIN((MAX((ZRE_ICE_UM(KIDIA:KFDIA,:) * 1.0E-6_JPRB), 10.0E-6_JPRB)),150.0E-6_JPRB) ! threshold ice effective radius 10-150 um ! Get the cloud overlap decorrelation length (for cloud boundaries), ! in km, according to the parameterization specified by NDECOLAT, @@ -427,7 +486,6 @@ SUBROUTINE RADIATION_SCHEME & CALL CLOUD_OVERLAP_DECORR_LEN(YDMODEL%YRML_PHY_EC%YRECLD,KIDIA,KFDIA,KLON, & & PGEMU,YRERAD%NDECOLAT, & & PDECORR_LEN_EDGES_KM=ZDECORR_LEN_KM, PDECORR_LEN_RATIO=ZDECORR_LEN_RATIO) - ! prepare SPP IF (YDSPP_CONFIG%LSPP) THEN @@ -461,9 +519,9 @@ SUBROUTINE RADIATION_SCHEME & ! Compute cloud overlap parameter from decorrelation length RAD_CONFIG%CLOUD_INHOM_DECORR_SCALING = ZDECORR_LEN_RATIO DO JLON = KIDIA,KFDIA - CALL YLCLOUD%SET_OVERLAP_PARAM(THERMODYNAMICS,& - & ZDECORR_LEN_KM(JLON)*1000.0_JPRB,& - & ISTARTCOL=JLON, IENDCOL=JLON) + CALL YLCLOUD%SET_OVERLAP_PARAM( THERMODYNAMICS, & + & ZDECORR_LEN_KM(JLON)*1000.0_JPRB, & + & ISTARTCOL=JLON, IENDCOL=JLON) ENDDO ! Cloud water content fractional standard deviation is configurable @@ -506,41 +564,77 @@ SUBROUTINE RADIATION_SCHEME & ! kg m-2, needed to scale some of the aerosol inputs CALL THERMODYNAMICS%GET_LAYER_MASS(KIDIA,KFDIA,ZLAYER_MASS) -! Copy over aerosol mass mixing ratio -IF (YDMODEL%YRML_PHY_RAD%YREAERATM%LAERCCN & - & .OR. YDMODEL%YRML_PHY_RAD%YREAERATM%LAERRRTM & - & .OR. YRERAD%NAERMACC == 1) THEN - - - ! MACC aerosol from climatology or prognostic aerosol variables - - ! this is already in mass mixing ratio units with the required array - ! orientation so we can copy it over directly - ! AB need to cap the minimum mass mixing ratio/AOD to avoid instability - ! in case of negative values in input - DO JAER = 1,KAEROSOL - DO JLEV = 1,KLEV - DO JLON = KIDIA,KFDIA - AEROSOL%MIXING_RATIO(JLON,JLEV,JAER) = MAX(PAEROSOL(JLON,JLEV,JAER),0.0_JPRB) +! Copy over aerosol mass mixing ratio or optical properties +IF ( YDEAERATM%LAERCCN .OR. YDEAERATM%LAERRRTM .OR. YRERAD%NAERMACC == 1) then + + IF ( .NOT. AEROSOL%is_direct) THEN + ! MACC aerosol from climatology or prognostic AER aerosol variables - + ! this is already in mass mixing ratio units with the required array + ! orientation so we can copy it over directly + ! AB need to cap the minimum mass mixing ratio/AOD to avoid instability + ! in case of negative values in input + DO JAER = 1,KAEROSOL + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%MIXING_RATIO(JLON,JLEV,JAER) = MAX(PAEROSOL(JLON,JLEV,JAER),0.0_JPRB) + ENDDO ENDDO ENDDO - ENDDO - IF (YRERAD%NAERMACC == 1) THEN - ! Add the tropospheric and stratospheric backgrounds contained in the - ! old Tegen arrays - this is very ugly! - IF (TROP_BG_AER_MASS_EXT > 0.0_JPRB) THEN - AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& - & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& - & + PAEROSOL_OLD(KIDIA:KFDIA,1,:)& - & / (ZLAYER_MASS * TROP_BG_AER_MASS_EXT) + IF (YRERAD%NAERMACC == 1) THEN + ! Add the tropospheric and stratospheric backgrounds contained in the + ! old Tegen arrays - this is very ugly! + IF (TROP_BG_AER_MASS_EXT > 0.0_JPRB) THEN + AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& + & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_TROP_BG_AER)& + & + PAEROSOL_OLD(KIDIA:KFDIA,1,:)& + & / (ZLAYER_MASS * TROP_BG_AER_MASS_EXT) + ENDIF + IF (STRAT_BG_AER_MASS_EXT > 0.0_JPRB) THEN + AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& + & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& + & + PAEROSOL_OLD(KIDIA:KFDIA,6,:)& + & / (ZLAYER_MASS * STRAT_BG_AER_MASS_EXT) + ENDIF ENDIF - IF (STRAT_BG_AER_MASS_EXT > 0.0_JPRB) THEN - AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& - & = AEROSOL%MIXING_RATIO(KIDIA:KFDIA,:,ITYPE_STRAT_BG_AER)& - & + PAEROSOL_OLD(KIDIA:KFDIA,6,:)& - & / (ZLAYER_MASS * STRAT_BG_AER_MASS_EXT) - ENDIF - ENDIF + ELSE ! AEROSOL%IS_DIRECT=TRUE, which occurs only if "hamm7" .and. LAERRRTM=T + + ! Copy optical properties of HAMM7 aerosols + + ! reset + IF (RAD_CONFIG%DO_SW) THEN + AEROSOL%OD_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%SSA_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + AEROSOL%G_SW(1:YRERAD%NTSW,:,KIDIA:KFDIA) = 0.0_JPRB + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW(1:STRATO_CMIP_NTB,:,KIDIA:KFDIA) = 0.0_JPRB + ENDIF + + ! fill with M7 values + IF (YRERAD%NAEROOPT>0) THEN + IF (RAD_CONFIG%DO_SW) THEN + DO JAER = 1,YRERAD%NTSW + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%OD_SW(JAER,JLEV,JLON) = PAEROM7_TAU(JLON,JLEV,JAER) + AEROSOL%SSA_SW(JAER,JLEV,JLON) = PAEROM7_SSA(JLON,JLEV,JAER) + AEROSOL%G_SW(JAER,JLEV,JLON) = PAEROM7_ASYM(JLON,JLEV,JAER) + ENDDO + ENDDO + ENDDO + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + DO JAER = 1,STRATO_CMIP_NTB + DO JLEV = 1,KLEV + DO JLON = KIDIA,KFDIA + AEROSOL%OD_LW(JAER,JLEV,JLON) = PAEROM7_TAULW(JLON,JLEV,JAER) + ENDDO + ENDDO + ENDDO + ENDIF + ENDIF + ENDIF ELSE ! Tegen aerosol climatology - the array PAEROSOL_OLD contains the @@ -560,6 +654,118 @@ SUBROUTINE RADIATION_SCHEME & ENDDO ENDDO +ENDIF + +!CMIP6/7 Stratospheric aerosols +ZAODSTRAT(:,:,:)=0.0_JPRB +ZAAODSTRAT(:,:,:)=0.0_JPRB +ZREFAODSTRAT(:,:,:)=0.0_JPRB +ZAAODSTRAT_LW(:,:,:)=0.0_JPRB +IF (YRERAD%LCMIP_STRATAER_CMIP6 .OR. YRERAD%LCMIP_STRATAER_CMIP7) THEN + + ! Interpolate only if new data have been read + IF (YRERAD%LSTRATAERO_UPDATED) THEN + + CALL CMIP_STRATO_AERO_INTERP (YDMODEL, KIDIA, KFDIA, KLON, KLEV, 1 , 0, & + & PPRESSURE_H, PGELAM, PGEMU, & + & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M) + + YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) = ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL)= ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) + YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) = ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) + ELSE + ! no new data, use the last computed values + ZAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AOD(KIDIA:KFDIA,:,:,:,KBL) + ZAAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD(KIDIA:KFDIA,:,:,:,KBL) + ZREFAODSTRAT_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_REFAOD(KIDIA:KFDIA,:,:,:,KBL) + ZAAODSTRAT_LW_M(KIDIA:KFDIA,:,:,:) = YDAERSTRAT%STRAT_AAOD_LW(KIDIA:KFDIA,:,:,:,KBL) + ENDIF + + ! Time interpolation and excluding the data below the tropopause, each timestep. + CALL CMIP_STRATO_AERO_PROCESS (YDMODEL,KIDIA, KFDIA, KLON, KLEV, 1 , 0, & + & NINDAT, YDMODEL%YRML_GCONF%YRRIP%NSTADD, & + & PPRESSURE, PPRESSURE_H, PTEMPERATURE, PTEMPERATURE_H, PGELAM, & + & ZAODSTRAT_M, ZAAODSTRAT_M, ZREFAODSTRAT_M, ZAAODSTRAT_LW_M, & + & ZAODSTRAT, ZAAODSTRAT, ZREFAODSTRAT, ZAAODSTRAT_LW, KTROPPAUSE) + + ! Excluding optical properties of M7 aerosols above stratosphere + IF ( AEROSOL%IS_DIRECT ) THEN + DO JLON=KIDIA,KFDIA + IF (RAD_CONFIG%DO_SW) THEN + AEROSOL%OD_SW (1:YRERAD%NTSW, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + AEROSOL%SSA_SW(1:YRERAD%NTSW, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + AEROSOL%G_SW (1:YRERAD%NTSW, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + ENDIF + IF (RAD_CONFIG%DO_LW) THEN + AEROSOL%OD_LW(1:STRATO_CMIP_NTB, 1:KTROPPAUSE(JLON)-1, JLON) = 0.0_JPRB + ENDIF + ENDDO + ELSE + ! TODO: this needs to be confirmed + DO JAER = 1,KAEROSOL + DO JLON = KIDIA,KFDIA + AEROSOL%MIXING_RATIO(JLON, 1:KTROPPAUSE(JLON)-1, JAER) = 0.0_JPRB + ENDDO + ENDDO + ENDIF + +ELSE + ZAODSTRAT(:,:,:)=0.0_JPRB + ZAAODSTRAT(:,:,:)=0.0_JPRB + ZREFAODSTRAT(:,:,:)=0.0_JPRB + ZAAODSTRAT_LW(:,:,:)=0.0_JPRB +ENDIF + +STRAT_AEROSOL%OD_SW(:,:,KIDIA:KFDIA)=0.0_JPRB +STRAT_AEROSOL%SSA_SW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%G_SW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%OD_LW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%SSA_LW(:,:,KIDIA:KFDIA) = 0.0_JPRB +STRAT_AEROSOL%G_LW(:,:,KIDIA:KFDIA) = 0.0_JPRB +IF (RAD_CONFIG%DO_SW) THEN + IF (YRERAD%LCMIP_STRATAER_CMIP6) THEN + DO JLEV = 1,KLEV + IJLEV=KLEV+1-JLEV + DO JAER=1,YRERAD%NTSW ! SW radiation + ! ! IFS wavelength intervals 1..14 as defined in SUSRTAER correspond to 2..14,1 in the CMIP6 forcing + JSW_ORDERED_BIS=JAER+1 + IF (JAER==14) THEN + JSW_ORDERED_BIS=1 + ENDIF + STRAT_AEROSOL%OD_SW(JAER,JLEV,KIDIA:KFDIA)=ZAODSTRAT(KIDIA:KFDIA,IJLEV,JSW_ORDERED_BIS) + STRAT_AEROSOL%SSA_SW(JAER,JLEV,KIDIA:KFDIA) = & + &ZAODSTRAT(KIDIA:KFDIA,IJLEV,JSW_ORDERED_BIS)-ZAAODSTRAT(KIDIA:KFDIA,JLEV,JSW_ORDERED_BIS) + STRAT_AEROSOL%G_SW(JAER,JLEV,KIDIA:KFDIA) = ZREFAODSTRAT(KIDIA:KFDIA,IJLEV,JSW_ORDERED_BIS) + + ENDDO + ENDDO + + ELSEIF(YRERAD%LCMIP_STRATAER_CMIP7) THEN + DO JLEV = 1,KLEV + IJLEV=KLEV+1-JLEV + DO JAER=1,YRERAD%NTSW ! SW radiation + ! CMIP7 wavelengts are already in right order + STRAT_AEROSOL%OD_SW(JAER,JLEV,KIDIA:KFDIA)=ZAODSTRAT(KIDIA:KFDIA,IJLEV,JAER) + STRAT_AEROSOL%SSA_SW(JAER,JLEV,KIDIA:KFDIA) = & + &ZAODSTRAT(KIDIA:KFDIA,IJLEV,JAER)-ZAAODSTRAT(KIDIA:KFDIA,JLEV,JAER) + STRAT_AEROSOL%G_SW(JAER,JLEV,KIDIA:KFDIA) = ZREFAODSTRAT(KIDIA:KFDIA,IJLEV,JAER) + + ENDDO + ENDDO + + ENDIF +ENDIF + +IF (RAD_CONFIG%DO_LW) THEN + DO JLEV = 1,KLEV + IJLEV=KLEV+1-JLEV + DO JAER=1,STRATO_CMIP_NTB !LW radiation + STRAT_AEROSOL%OD_LW(JAER,JLEV,KIDIA:KFDIA)=ZAAODSTRAT_LW(KIDIA:KFDIA,IJLEV,JAER) + STRAT_AEROSOL%SSA_LW(JAER,JLEV,KIDIA:KFDIA)=0.0_JPRB !only absorbtion for LW + STRAT_AEROSOL%G_LW(JAER,JLEV,KIDIA:KFDIA)=0.0_JPRB + ENDDO + ENDDO ENDIF @@ -588,8 +794,8 @@ SUBROUTINE RADIATION_SCHEME & CALL SET_GAS_UNITS(RAD_CONFIG, GAS) ! Call radiation scheme -CALL RADIATION(KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG,& - & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, FLUX) +CALL RADIATION( KLON, KLEV, KIDIA, KFDIA, RAD_CONFIG, & + & SINGLE_LEVEL, THERMODYNAMICS, GAS, YLCLOUD, AEROSOL, STRAT_AEROSOL, FLUX) ! Check fluxes are within physical bounds IF (YRERAD%NDUMPBADINPUTS /= 0 & @@ -720,11 +926,13 @@ SUBROUTINE RADIATION_SCHEME & CALL GAS%DEALLOCATE CALL YLCLOUD%DEALLOCATE CALL AEROSOL%DEALLOCATE +CALL STRAT_AEROSOL%DEALLOCATE CALL FLUX%DEALLOCATE END ASSOCIATE END ASSOCIATE - +END ASSOCIATE +END ASSOCIATE IF (LHOOK) CALL DR_HOOK('RADIATION_SCHEME',1,ZHOOK_HANDLE) END SUBROUTINE RADIATION_SCHEME diff --git a/ifs-source/arpifs/phys_radi/radintg.F90 b/ifs-source/arpifs/phys_radi/radintg.F90 index ee696a52..b70e52b7 100644 --- a/ifs-source/arpifs/phys_radi/radintg.F90 +++ b/ifs-source/arpifs/phys_radi/radintg.F90 @@ -10,20 +10,22 @@ #ifdef RS6K @PROCESS NOCHECK #endif -SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& - & PALBD , PALBP , PCCNL , PCCNO,& - & PAPRS , PAPRSF, PCCO2 , PCLFR,& - & PQO3 , PAER , PAERMACCS,PAERMACCL,PAERMACCSJ,PAERMACCLJ,& - & PAERTGS,PAERTGL, PAERO , PGHG,& - & PDP , PSPECTRALEMISS,& - & PMU0 , PQ,& - & PQS , PQIWP , PQSWP , PQLWP , PFSDP , PQRAIN, PRAINT, PSLM , PT,& - & PECPO3, PTS,& - & PEMTD , PEMTU , PTRSO , PTRSC , PEMTC , PNTOP , PNBAS,& - & PPERTT,& - & PEMIT , PTH , PFRTED, PTRSOD, PTRSODC, PEMTDC,& - & PSUDU , PUVDF , PPARF , PPARCF, PTINCF,& - & PFDIR , PCDIR , PLWDERIVATIVE) +SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE, & + & PALBD , PALBP , PCCNL , PCCNO, & + & PAPRS , PAPRSF, PCCO2 , PCLFR, & + & PQO3 , PAER , PAERMACCS, PAERMACCL, PAERMACCSJ, PAERMACCLJ, & + & PAERTGS,PAERTGL, PAERO , PGHG, & + & PAEROTAU,PAEROSSA, PAEROASYM, PAEROTAULW, & + & PDP , PSPECTRALEMISS, & + & PMU0 , PQ, & + & PQS , PQIWP , PQSWP , PQLWP , PFSDP , PQRAIN, PRAINT, PSLM, PT, & + & PECPO3, PTS, & + & PEMTD , PEMTU , PTRSO , PTRSC , PEMTC , PNTOP , PNBAS, & + & PPERTT, & + & PEMIT , PTH , PFRTED, PTRSOD, PTRSODC, PEMTDC, & + & PSUDU , PUVDF , PPARF , PPARCF, PTINCF, & + & PFDIR , PCDIR , PLWDERIVATIVE, & + & PRE_LIQ, PRE_ICE ) !**** *RADINTG* - RADIATION INTERFACE TO ACTUAL RADIATION SCHEME @@ -211,7 +213,13 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !extra diagnostics to debug new aerosols REAL(KIND=JPRB) ,INTENT(IN) :: PAERO(YDGEOMETRY%YRGEM%NGPTOT,KLEV,YDMODEL%YRML_GCONF%YGFL%NAERO) -REAL(KIND=JPRB) ,INTENT(OUT) :: PGHG(YDGEOMETRY%YRGEM%NGPTOT,8,KLEV) +REAL(KIND=JPRB) ,INTENT(OUT) :: PGHG(YDGEOMETRY%YRGEM%NGPTOT,8,KLEV) + +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROTAU(YDGEOMETRY%YRGEM%NGPTOT, KLEV,14) +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROSSA(YDGEOMETRY%YRGEM%NGPTOT, KLEV,14) +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROASYM(YDGEOMETRY%YRGEM%NGPTOT, KLEV,14) +REAL(KIND=JPRB) ,INTENT(IN) :: PAEROTAULW(YDGEOMETRY%YRGEM%NGPTOT,KLEV,16) + REAL(KIND=JPRB) ,INTENT(IN) :: PDP(YDGEOMETRY%YRGEM%NGPTOT,KLEV) REAL(KIND=JPRB) ,INTENT(IN) :: PSPECTRALEMISS(YDGEOMETRY%YRGEM%NGPTOT,YDMODEL%YRML_PHY_RAD%YRERAD%NLWEMISS) REAL(KIND=JPRB) ,INTENT(IN) :: PMU0(YDGEOMETRY%YRGEM%NGPTOT) @@ -247,6 +255,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& REAL(KIND=JPRB) ,INTENT(OUT) :: PPARCF(YDGEOMETRY%YRGEM%NGPTOT),PTINCF(YDGEOMETRY%YRGEM%NGPTOT) REAL(KIND=JPRB) ,INTENT(OUT) :: PFDIR(YDGEOMETRY%YRGEM%NGPTOT) ,PCDIR(YDGEOMETRY%YRGEM%NGPTOT) REAL(KIND=JPRB) ,INTENT(OUT) :: PLWDERIVATIVE(YDGEOMETRY%YRGEM%NGPTOT,KLEV+1) +REAL(KIND=JPRB) ,INTENT(IN) :: PRE_LIQ(YDGEOMETRY%YRGEM%NGPTOT,KLEV) +REAL(KIND=JPRB) ,INTENT(IN) :: PRE_ICE(YDGEOMETRY%YRGEM%NGPTOT,KLEV) + + ! ------------------------------------------------------------------ REAL(KIND=JPRB) :: ZAMU0 (YDGEOMETRY%YRGEM%NGPTOT) @@ -336,11 +348,13 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& INTEGER(KIND=JPIM) :: IL0S(YDMODEL%YRML_PHY_RAD%YRERAD%NRPROMA,1,0:3) INTEGER(KIND=JPIM) :: IL0ULI(YDMODEL%YRML_PHY_RAD%YRERAD%NRPROMA,2,2), IL0UDI(YDMODEL%YRML_PHY_RAD%YRERAD%NRPROMA,0:3,0:3) -INTEGER(KIND=JPIM) :: I,IBEG,IEND,IB,IL,I1,I2,IM,IMD,IRD,ICNT,& - & J,JAERO,JARP,JIR,JB,JK,JL,JM,JN,JLEV,JRL,JSW,JLW,JSTGLO,JFLD,JGL,& - & INEXT,IINBEG,IINEND,IOUTBEG,IOUTEND,IFLD,IARP,& - & IFLDSIN,IFLDSOUT,IFLDSTOT,IGPBLKS,IGPBLKS_RAD,IGI,IGIX,& - & IWIS,IFLDN,IFLDX,IGLGLO , ISUPP +INTEGER(KIND=JPIM) :: I, IBEG, IEND, IB, IL, I1, I2, IM, IMD, IRD, & + & J, JARP, JIR, JB, JK, JL, JM, JN, JLEV, JRL, & + & JSW, JLW, JSTGLO, JFLD, JGL, JAERO, & + & INEXT, IINBEG, IINEND, IOUTBEG, IOUTEND, IFLD, ICNT, & + & IARP, IFLDSIN, IFLDSOUT, IFLDSTOT, IGPBLKS, IGPBLKS_RAD, & + & IGI, IGIX, IWIS, IFLDN, IFLDX, IGLGLO, & + & ISUPP INTEGER(KIND=JPIM) :: IFIXRADFLD(2) @@ -348,14 +362,19 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !INTEGER(KIND=JPIM) :: JAER !-- debug -INTEGER(KIND=JPIM) :: IMU0,IAMU0,IEMISS,ITS,ISLM,IBAS,ITOP,& - & IFRSOD,IFRTED,IFRSODC,IFRTEDC,IEMIT,& - & ISUDU,IUVDF,IPARF,IPARCF,ITINCF,IFDIR,IFDIF,ICDIR,& - & ILWDERIVATIVE,ISWDIRECTBAND,ISWDIFFUSEBAND,& - & IALD,IALP,ITI,IPR,IQS,IWV,ICLC,ILWA,IIWA,ISWA,IRWA,& - & IRRA,IDP,IOZ,IHTI,IHPR,IFRSO,ISWFC,IFRTH,ILWFC,IAE,IAER,IAERO,IPERT,& - & IAPRS,IGELAM,IGEMU,ICLON,ISLON,IECPO3,ICCNL,ICCNO,& - & ICO2,ICH4,IN2O,INO2,IC11,IC12,IC22,ICL4,IFSD +INTEGER(KIND=JPIM) :: IMU0, IAMU0, IEMISS, ITS, ISLM, IBAS, ITOP, & + & IFRSOD, IFRTED, IFRSODC, IFRTEDC, IEMIT, ISUDU, IUVDF, & + & IPARF, IPARCF, ITINCF, IFDIR, IFDIF, ICDIR, IALD, & + & IALP, ITI, IPR, IQS, IWV, ICLC, ILWA, & + & IIWA, ISWA, IRWA, IRRA, IDP, IOZ, IHTI, & + & IHPR, IFRSO, ISWFC, IFRTH, ILWFC, IAE, IAER, & + & IAERO, IPERT, IAPRS, IGELAM, IGEMU, ICLON, ISLON, & + & IECPO3, ICCNL, ICCNO, ICO2, ICH4, IN2O, INO2, & + & IC11, IC12, IC22, ICL4, IFSD, & + & ILWDERIVATIVE, ISWDIRECTBAND, ISWDIFFUSEBAND, & + & IHAMAEROAOD, IHAMAEROSSA, IHAMAEROASYM, IHAMAEROAODLW + +INTEGER(KIND=JPIM) :: IRE_LIQ, IRE_ICE INTEGER(KIND=JPIM) :: IDUMARR(2) INTEGER(KIND=JPIM) :: IULTMP @@ -363,9 +382,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& LOGICAL, parameter :: LLDEBUG = .false. LOGICAL, parameter :: LLDEBUGRW = .false. LOGICAL :: LLINC, LLDOLAST, LLERROR, LLREAD, LLPRINT, LLACTAERO -! BEN - introduce flag to activate aerosols in the radiation code -LOGICAL :: LLAERORAD - LOGICAL :: LLSPPRAD ! local switch for SPP scheme INTEGER(KIND=JPIM) :: IRADAER, IRADAER2 @@ -413,7 +429,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& REAL(KIND=JPHOOK) :: ZHOOK_HANDLE -INTEGER(KIND=JPIM) :: IAUX +INTEGER(KIND=JPIM) :: IAUX, INLWTEMP ! ------------------------------------------------------------------- @@ -441,9 +457,12 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('RADINTG',0,ZHOOK_HANDLE) -ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & - & YDGSGEOM_NB=>YDGEOMETRY%YRGSGEOM_NB, YDHSLMER=>YDMODEL%YRML_DYN%YRSLINT%YRHSLMER, YDLAP=>YDGEOMETRY%YRLAP, & - & YDCSGLEG=>YDGEOMETRY%YRCSGLEG, YDVAB=>YDGEOMETRY%YRVAB, YDVETA=>YDGEOMETRY%YRVETA, & + +ASSOCIATE(& + & YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV, & + & YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & + & YDGSGEOM_NB=>YDGEOMETRY%YRGSGEOM_NB, YDHSLMER=>YDMODEL%YRML_DYN%YRSLINT%YRHSLMER, YDLAP=>YDGEOMETRY%YRLAP, & + & YDCSGLEG=>YDGEOMETRY%YRCSGLEG, YDVAB=>YDGEOMETRY%YRVAB, YDVETA=>YDGEOMETRY%YRVETA, & & YDVFE=>YDGEOMETRY%YRVFE, YDSTA=>YDGEOMETRY%YRSTA, & & YDCSGEOM=>YDGEOMETRY%YRCSGEOM, & & YDCSGEOM_NB=>YDGEOMETRY%YRCSGEOM_NB, YDSPGEOM=>YDGEOMETRY%YSPGEOM, YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY, & @@ -457,7 +476,8 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & RADGRID=>YDMODEL%YRML_PHY_RAD%RADGRID, YDRI=>YDMODEL%YRML_PHY_RAD%YRRI, YDRO=>YDMODEL%YRML_PHY_RAD%YRRO, & & YDSPP_CONFIG=>YDMODEL%YRML_GCONF%YRSPP_CONFIG) -ASSOCIATE(NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YO3=>YGFL%YO3, & +ASSOCIATE(& + & NACTAERO=>YGFL%NACTAERO, NAERO=>YGFL%NAERO, YO3=>YGFL%YO3, & & NDGLG=>YDDIM%NDGLG, NRESOL=>YDDIM%NRESOL, NSMAX=>YDDIM%NSMAX, & & NSPEC2=>YDDIM%NSPEC2, NUMP=>YDDIM%NUMP, & & REPSCAER=>YDEAERATM%REPSCAER, & @@ -469,10 +489,12 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & YSURF=>YDEPHY%YSURF, & & LAERNITRATE=>YDCOMPO%LAERNITRATE, & & LAERSOA=>YDCOMPO%LAERSOA, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & LAERVOL=>YDEAERATM%LAERVOL, & + & LAERRRTM=>YDEAERATM%LAERRRTM, & & LAPPROXLWUPDATE=>YDERAD%LAPPROXLWUPDATE, & & LAPPROXSWUPDATE=>YDERAD%LAPPROXSWUPDATE, LDIAGFORCING=>YDERAD%LDIAGFORCING, & - & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, & + & LEPO3RA=>YDERAD%LEPO3RA, LHVOLCA=>YDERAD%LHVOLCA, NCLOUDACT=>YDERAD%NCLOUDACT, & & LNOTROAER=>YDERAD%LNOTROAER, LSRTM=>YDERAD%LSRTM, NAER=>YDERAD%NAER, & & NAERMACC=>YDERAD%NAERMACC, NGHGRAD=>YDERAD%NGHGRAD, NOZOCL=>YDERAD%NOZOCL, & & NPERTAER=>YDERAD%NPERTAER, NPERTOZ=>YDERAD%NPERTOZ, NRADINT=>YDERAD%NRADINT, & @@ -494,7 +516,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !* 1. PREPARATORY WORK ! ---------------- -WRITE(NULOUT,'(a)') 'Calling radiation scheme (RADINTG)' ZEPSILON=1000._JPRB*TINY(ZEPSILON) @@ -540,7 +561,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& LLDEBUGRW=.FALSE. ENDIF #endif - +INLWTEMP=16 !-- NAERO > 0 and <= 16 is GEMS/MACC active configuration !-- YDERAD%NAERMACC = 1 is MACC-derived aerosol climatology !-- NACTAERO is the number of aerosol active in the prognostic scheme @@ -570,8 +591,6 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ELSE IRADAER=12 !dummy in this case, not used. ENDIF -!BEN -LLAERORAD=.FALSE. !* 1.01 PARAMETERS EXTRACTED FROM COMDECKS (NON-TRANSPORTABLE) ! ------------------------------------------------------ @@ -637,6 +656,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& IAPRS =INDRAD(INEXT,KLEV+1,.TRUE.) IHTI =INDRAD(INEXT,KLEV+1,.TRUE.) IAERO =INDRAD(INEXT,IRADAER*KLEV,.NOT.LRAYFM .AND. LLACTAERO .AND. NAERMACC == 0) +IHAMAEROAOD =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +IHAMAEROSSA =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +IHAMAEROASYM =INDRAD(INEXT,KLEV*NTSW,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) +IHAMAEROAODLW =INDRAD(INEXT,KLEV*INLWTEMP,(TRIM(AERO_SCHEME) == "hamm7" .AND. LAERRRTM)) + IPERT =INDRAD(INEXT,YDSPP_CONFIG%SM%NRFTOTAL_RADGRID, LLSPPRAD ) !ICO2 =INDRAD(INEXT,KLEV,.TRUE.) @@ -648,6 +672,11 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& !IC22 =INDRAD(INEXT,KLEV,.TRUE.) !ICL4 =INDRAD(INEXT,KLEV,.TRUE.) +!IF (TRIM(AERO_SCHEME) == "hamm7" .AND. NCLOUDACT > 0) THEN + IRE_LIQ = INDRAD(INEXT,KLEV,(TRIM(AERO_SCHEME) == "hamm7" .AND. NCLOUDACT > 0)) + IRE_ICE = INDRAD(INEXT,KLEV,(TRIM(AERO_SCHEME) == "hamm7" .AND. NCLOUDACT > 0)) +!ENDIF + IINEND =INEXT-1 ! end of input variables IOUTBEG=INEXT ! start of output variables @@ -758,6 +787,10 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& WRITE(NULOUT,'("RADINTG: IGI =",I0)')IGI WRITE(NULOUT,'("RADINTG: IAER =",I0)')IAER WRITE(NULOUT,'("RADINTG: IAERO =",I0)')IAERO + WRITE(NULOUT,'("RADINTG: IHAMAEROAOD =",I0)')IHAMAEROAOD + WRITE(NULOUT,'("RADINTG: IHAMAEROSSA =",I0)')IHAMAEROSSA + WRITE(NULOUT,'("RADINTG: IHAMAEROASYM =",I0)')IHAMAEROASYM + WRITE(NULOUT,'("RADINTG: IHAMAEROASYM =",I0)')IHAMAEROAODLW WRITE(NULOUT,'("RADINTG: IPERT =",I0)')IPERT WRITE(NULOUT,'("RADINTG: ICO2 =",I0)')ICO2 WRITE(NULOUT,'("RADINTG: ICH4 =",I0)')ICH4 @@ -767,6 +800,8 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& WRITE(NULOUT,'("RADINTG: IC12 =",I0)')IC12 WRITE(NULOUT,'("RADINTG: IC22 =",I0)')IC22 WRITE(NULOUT,'("RADINTG: ICL4 =",I0)')ICL4 + WRITE(NULOUT,'("RADINTG: IRE_LIQ =",I0)')IRE_LIQ + WRITE(NULOUT,'("RADINTG: IRE_ICE =",I0)')IRE_ICE ENDIF @@ -774,17 +809,18 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& IFLDSOUT= IOUTEND-IOUTBEG +1 IFLDSTOT= INEXT - 1 -!IF( .TRUE. )THEN +IF ( LLDEBUG ) THEN WRITE(NULOUT,'("RADINTG: IFLDSIN =",I12)')IFLDSIN WRITE(NULOUT,'("RADINTG: IFLDSOUT =",I12)')IFLDSOUT WRITE(NULOUT,'("RADINTG: IFLDSTOT =",I12)')IFLDSTOT -!ENDIF +ENDIF IF( NRADRES /= NSMAX )THEN ALLOCATE(ZRGP(NRPROMA,IFLDSIN,IGPBLKS)) ELSE ALLOCATE(ZRGP(NRPROMA,IFLDSTOT,IGPBLKS)) ENDIF + ZRGP=0.0_JPRB ALLOCATE(ZDGEMU(NRPROMA,IGPBLKS)) ZDGEMU=0.0_JPRB @@ -793,7 +829,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& CALL GSTATS(1205,0) !$OMP PARALLEL DO SCHEDULE(STATIC)& -!$OMP& PRIVATE(JSTGLO,JK,JSW,JLW,JL,IAE,IBEG,IEND,IL,IB,IARP,JARP,& +!$OMP& PRIVATE(JSTGLO,JK,JSW,JLW,JL,IAE,IBEG,IEND,IL,IB,IARP,JARP,JAERO,& !$OMP& ZCLC,ZQLWP,ZQIWP,ZQRWP,ZQSWP,ZPQO3,ZCAPH,ZCHTI) DO JSTGLO=1,NGPTOT,NRPROMA IBEG=JSTGLO @@ -927,8 +963,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDIF LLPRINT=.FALSE. + !-- configuration with prognostic aerosols in radiation - IF( .NOT.LRAYFM .AND. NACTAERO > 0 .AND. NAERMACC == 0) THEN + AERORAD: IF( .NOT.LRAYFM .AND. NACTAERO > 0 .AND. NAERMACC == 0) THEN !-- debug ! IF (NSTEP == YDRIP%NSTART) THEN @@ -939,33 +976,63 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ! ENDIF !-- debug - DO JAERO=1,IRADAER2 - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) - IF (JAERO <= NTYPAER(1)) THEN - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) = ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) * RSS_RH80_MASSFAC - ENDIF - ENDDO - IF (.NOT. LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN - DO JAERO=IRADAER2+1,IRADAER2+ISUPP + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) + ZRGP(1:IL,IHAMAEROAOD+IAE:IHAMAEROAOD+IAE+KLEV-1,IB) = PAEROTAU(IBEG:IEND,1:KLEV,JAERO) ENDDO - ENDIF - ! SR 05 2018 if LAERCHEM, shift one variable - IF (LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN - DO JAERO=IRADAER2+1,IRADAER2+ISUPP + + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO-1)) + ZRGP(1:IL,IHAMAEROSSA+IAE:IHAMAEROSSA+IAE+KLEV-1,IB) = PAEROSSA(IBEG:IEND,1:KLEV,JAERO) ENDDO + + DO JAERO=1,YDMODEL%YRML_PHY_RAD%YRERAD%NTSW + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROASYM+IAE:IHAMAEROASYM+IAE+KLEV-1,IB) = PAEROASYM(IBEG:IEND,1:KLEV,JAERO) + ENDDO + + DO JAERO=1,16 ! ALaak: Need to be changed to some variable + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IHAMAEROAODLW+IAE:IHAMAEROAODLW+IAE+KLEV-1,IB) = PAEROTAULW(IBEG:IEND,1:KLEV,JAERO) + ENDDO + + ELSE + DO JAERO=1,IRADAER2 + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) + IF (JAERO <= NTYPAER(1)) THEN + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) = ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) * RSS_RH80_MASSFAC + ENDIF + ENDDO + + IF (.NOT. LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN + DO JAERO=IRADAER2+1,IRADAER2+ISUPP + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO)) + ENDDO + ENDIF + + ! SR 05 2018 if LAERCHEM, shift one variable + IF (LAERCHEM .AND. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN + DO JAERO=IRADAER2+1,IRADAER2+ISUPP + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =MAX(REPSCAER, PAERO(IBEG:IEND,1:KLEV,JAERO-1)) + ENDDO + ENDIF + + ! SR 06 2020 LAERCHEM and no nitrate/SOA + IF (LAERCHEM .AND. .NOT. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN + JAERO=IRADAER2+1 + IAE=(JAERO-1)*KLEV + ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER + ENDIF + ENDIF - ! SR 06 2020 LAERCHEM and no nitrate/SOA - IF (LAERCHEM .AND. .NOT. (LAERSOA .OR. LAERNITRATE .OR. LAERVOL)) THEN - JAERO=IRADAER2+1 - IAE=(JAERO-1)*KLEV - ZRGP(1:IL,IAERO+IAE:IAERO+IAE+KLEV-1,IB) =REPSCAER - ENDIF - ENDIF + ENDIF AERORAD + + !SPP: compute and store SPP random patterns on radiation grid IF (LLSPPRAD) THEN DO JARP=1,YDSPP_CONFIG%SM%NRFTOTAL_RADGRID @@ -974,6 +1041,18 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDDO ENDIF + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + IF (NCLOUDACT > 0) THEN + IF (NSTEP == YDRIP%NSTART) THEN + ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = 2.E-6_JPRB + ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = 30.E-6_JPRB + ELSE + ZRGP(1:IL,IRE_LIQ:IRE_LIQ+KLEV-1,IB) = PRE_LIQ(IBEG:IEND,1:KLEV) + ZRGP(1:IL,IRE_ICE:IRE_ICE+KLEV-1,IB) = PRE_ICE(IBEG:IEND,1:KLEV) + END IF + END IF + END IF + ZRGP(1:IL,IHPR:IHPR+KLEV ,IB) =ZCAPH (1:IL,1:KLEV+1) ZRGP(1:IL,IAPRS:IAPRS+KLEV ,IB) =PAPRS (IBEG:IEND,1:KLEV+1) ZRGP(1:IL,IHTI:IHTI+KLEV ,IB) =ZCHTI (1:IL,1:KLEV+1) @@ -1244,7 +1323,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& CALL GSTATS(1209,0) !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1)& -!$OMP& PRIVATE(JSTGLO,J,JLEV,JSW,JL,IAE,IBEG,IEND,I,I1,I2,IL,IB,LLDOLAST,& +!$OMP& PRIVATE(JSTGLO,J,JLEV,JSW,JL,IAE,IBEG,IEND,I,I1,I2,IL,IB,LLDOLAST,JAERO,& !$OMP& ZQAERO,ZQAER,ZQOZ,ZQCO2,ZQCH4,ZQN2O,ZQNO2,ZQC11,ZQC12,ZQOZO,ZQC22,ZQCL4,ZECPO3) DO JSTGLO=1,RADGRID%NGPTOT,NRPROMA IBEG=JSTGLO @@ -1508,7 +1587,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& CALL GSTATS(1210,0) !$OMP PARALLEL DO SCHEDULE(DYNAMIC,1)& -!$OMP&PRIVATE(JRL,IBEG,IEND,IL,IB) +!$OMP& PRIVATE(JRL,IBEG,IEND,IL,IB) DO JRL=1,RADGRID%NGPTOT,NRPROMA IBEG=JRL @@ -1576,10 +1655,9 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& ENDIF ELSE - ! Use the modular radiation scheme "ecRad" CALL RADIATION_SCHEME & - & (YDMODEL, 1, IL, NRPROMA, KLEV, IRADAER, & + & (YDMODEL, 1, IL, NRPROMA, KLEV, IB, IRADAER, & ! IB required to read stratosospheric aerosols & ZRII0, & & ZRGP(1,IAMU0,IB), ZRGP(1,ITS,IB), ZRGP(1,IALD,IB), ZRGP(1,IALP,IB), & & ZRGP(1,IEMISS,IB), & @@ -1603,12 +1681,20 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& & ZRGP(1,IEMIT,IB) ,ZRGP(1,ILwDerivative,IB), & & ZRGP(1,ISwDiffuseBand,IB), ZRGP(1,ISwDirectBand,IB),& ! OPTIONAL ARGUMENTS - & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) + & PAEROM7_TAU=ZRGP(1,IHAMAEROAOD,IB), PAEROM7_SSA=ZRGP(1,IHAMAEROSSA,IB), PAEROM7_ASYM=ZRGP(1,IHAMAEROASYM,IB), & + & PAEROM7_TAULW=ZRGP(1,IHAMAEROAODLW,IB), & + & PRE_LIQ=ZRGP(1,IRE_LIQ,IB), PRE_ICE=ZRGP(1,IRE_ICE,IB),& + & PPERT=ZRGP(1,IPERT,IB), PFSD=ZRGP(1,IFSD,IB) ) ENDIF ENDDO !$OMP END PARALLEL DO +! Reset the strat aero remap flag: remapping was done in RADIATION_SCHEME if +! needed and does not need to be done until new data are read. +! Reset here after ALL blocks have been processed to avoid race condition. +YDERAD%LSTRATAERO_UPDATED = .FALSE. + CALL GSTATS(1210,1) ! OUTPUT INTERPOLATION IF REQUIRED @@ -1899,7 +1985,7 @@ SUBROUTINE RADINTG(YDGEOMETRY, YDMODEL,KLEV , KMODE,& CALL GSTATS(1213,0) !$OMP PARALLEL DO SCHEDULE(STATIC) & -!$OMP& PRIVATE(JSTGLO,JK,IBEG,IEND,IL,IB,JSW,& +!$OMP& PRIVATE(JSTGLO,JK,IBEG,IEND,IL,IB,JSW,JL,I,IAUX,& !$OMP& ZTRSO,ZEMTD,ZEMTU,ZTRSC,ZEMTC,ZTRSOD,ZTRSODC,ZEMTDC,ZAERMACCM,ZRHCL,ZQSAT,IFLAG,& !$OMP& ZAERTAUL, ZAERASYL, ZAEROMGL, ZAERTAUS, ZAERASYS, ZAEROMGS,ZTAUAER,IAE,ZAERTAULJ,ZAERTAUSJ,& !$OMP& ZFRSOD,ZFRTED,ZFRSODC,ZFRTEDC,ZEMIT,ZSUDU,ZUVDF,ZPARF,& diff --git a/ifs-source/arpifs/phys_radi/suecrad.F90 b/ifs-source/arpifs/phys_radi/suecrad.F90 index 5c871120..095f4790 100644 --- a/ifs-source/arpifs/phys_radi/suecrad.F90 +++ b/ifs-source/arpifs/phys_radi/suecrad.F90 @@ -155,7 +155,12 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) USE YOMSOLARIRRADIANCE, ONLY :YSOLARIRRADIANCE ! Total solar irradiance multi-annual timeseries USE YOERADGHG , ONLY : YRADGHG ! Climatology interpolated to current model time USE RADIATION_SETUP , ONLY : SETUP_RADIATION_SCHEME - +USE YOEDUST , ONLY : YDUSTCLIM +USE YOEAEROP , ONLY : STRATO_CMIP_NMONTH, STRATO_CMIP_NTB, & + & STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, & + & CHECK_SUN_MEAN, CHECK_EARTH_MEAN, & + & STRATO_FIRSTYEAR, STRATO_LASTYEAR, STRATO_CMIP_NTIME +USE ND_PARAM , ONLY : ND_PARAM_SETUP !------------------------------------------------------------------------------- IMPLICIT NONE @@ -188,7 +193,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) INTEGER(KIND=JPIM) :: I_MIN_HALO INTEGER(KIND=JPIM) :: ISW,JUV,IDAYUV INTEGER(KIND=JPIM) :: IDGSAH,IDGENH - +INTEGER(KIND=JPIM) :: IGPBLKS_RAD ! CMIP strat.aerosols LOGICAL :: LLINEAR_GRID, LLREDURAD LOGICAL :: LLDEBUG,LLP,LLGRIDONLY @@ -269,7 +274,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LAER3D, LINTERPINCLOUDMEAN INTEGER(KIND=JPIM), POINTER :: NICEOPT, NLIQOPT, NSWICEOPT, NLWICEOPT, NSWLIQOPT,& - & NLWLIQOPT, NMCICA, NRADIP, NRADLP,& + & NLWLIQOPT, NMCICA, NRADIP, NRADLP, NCLOUDACT, NAEROOPT, & & NREDGLW, NREDGSW, NAER, NMODE, NOZOCL, NINHOM, NLAYINH, NOVLP, NSW,& & NRADFR, NLNGR1H, NRADELG, NRADPFR, NRADPLA, NRPROMA, NRADINT, NRADRES,& & NGHGRAD, NDECOLAT, NMINICE, NVOLCVERT, NPERTAER, NPERTOZ, NHINCSOL, NSCEN,& @@ -287,6 +292,10 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) CHARACTER (LEN=80), POINTER :: CO3DATAFIL CHARACTER (LEN=256), POINTER :: CGHGCLIMFILE, CGHGTIMESERIESFILE, CSOLARIRRADIANCEFILE +CHARACTER(LEN=500), POINTER ::CCMIP_STRAT_FULL, CCMIP_STRAT_FULL_CLIM +LOGICAL, POINTER :: LCMIP_STRATAER_BCKGD, LCMIP_STRATAER_CMIP6, LCMIP_STRATAER_CMIP7 +LOGICAL, POINTER :: LSTRATAERO_UPDATED + #include "naerad.nam.h" #include "naercli.nam.h" #include "namrgri.nam.h" @@ -305,6 +314,9 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & YGFL=>YDMODEL%YRML_GCONF%YGFL, & & YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY,YDEAERATM=>YDMODEL%YRML_PHY_RAD%YREAERATM, & & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, & + & YDAERM7=>YDMODEL%YRML_PHY_AER%YREAEROPT,&! use this to transfer AOD, SSA and ASY to rad scheme + & YDAERSTRAT=>YDMODEL%YRML_PHY_AER%YREAEROSTRAT,& + & NDDUST=>YDMODEL%YRML_PHY_AER%YREAERSRC%NDDUST, & & YDEAERD=>YDMODEL%YRML_PHY_RAD%YREAERD, RADGRID=>YDMODEL%YRML_PHY_RAD%RADGRID, & & YDPHNC=>YDMODEL%YRML_PHY_SLIN%YRPHNC, YDRADF=>YDMODEL%YRML_PHY_RAD%YRRADF, YDRI=>YDMODEL%YRML_PHY_RAD%YRRI, & & YDRO=>YDMODEL%YRML_PHY_RAD%YRRO,YDRADIATION=>YDMODEL%YRML_PHY_RAD%YRADIATION) @@ -332,6 +344,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & NRADE1H=>YDERAD%NRADE1H, NRADE3H=>YDERAD%NRADE3H, NRADNFR=>YDERAD%NRADNFR, & & NRADSFR=>YDERAD%NRADSFR, NSPMAPL=>YDERAD%NSPMAPL, NSPMAPS=>YDERAD%NSPMAPS, & & NSWNL=>YDERAD%NSWNL, NSWTL=>YDERAD%NSWTL, NTSW=>YDERAD%NTSW, & + & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & & RNS=>YDERAD%RNS, RSIGAIR=>YDERAD%RSIGAIR, & & RCCCL4=>YDERDI%RCCCL4, RCCFC22=>YDERDI%RCCFC22, RCNO2=>YDERDI%RCNO2, & & RSOLINC=>YDERDI%RSOLINC, & @@ -347,7 +360,17 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) & LRAY=>YDPHY%LRAY, LRAYFM=>YDPHY%LRAYFM,LRAYFM15=>YDPHY%LRAYFM15,& & LPHYLIN=>YDMODEL%YRML_PHY_SLIN%YREPHLI%LPHYLIN, & & LHLRADUPD=>YDPHY%LHLRADUPD, RADGR=>YDPARAR%RADGR, RADSN=>YDPARAR%RADSN) + ! Associate pointers for variables in namelist NAERAD +CCMIP_STRAT_FULL => YDERAD%CCMIP_STRAT_FULL +CCMIP_STRAT_FULL_CLIM => YDERAD%CCMIP_STRAT_FULL_CLIM +LCMIP_STRATAER_BCKGD => YDERAD%LCMIP_STRATAER_BCKGD +LCMIP_STRATAER_CMIP6 => YDERAD%LCMIP_STRATAER_CMIP6 +LCMIP_STRATAER_CMIP7 => YDERAD%LCMIP_STRATAER_CMIP7 +LSTRATAERO_UPDATED => YDERAD%LSTRATAERO_UPDATED +NCLOUDACT => YDERAD%NCLOUDACT +NAEROOPT => YDERAD%NAEROOPT + LERAD1H => YDERAD%LERAD1H LEPO3RA => YDERAD%LEPO3RA LONEWSW => YDERAD%LONEWSW @@ -457,6 +480,7 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) RCLOUD_SEPARATION_SCALE_TOA => YDERAD%RCLOUD_SEPARATION_SCALE_TOA RCLOUD_SEPARATION_SCALE_SURF => YDERAD%RCLOUD_SEPARATION_SCALE_SURF LFU_LW_ICE_OPTICS_BUG => YDERAD%LFU_LW_ICE_OPTICS_BUG + NSOLARSPECTRUM => YDERAD%NSOLARSPECTRUM NSWWVCONTINUUM => YDERAD%NSWWVCONTINUUM NDUMPBADINPUTS => YDERAD%NDUMPBADINPUTS @@ -513,6 +537,23 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IDUM=0 !* 2.1 PRESET INDICES IN *YOERAD* ! -------------------------- +!CMIP6/CMIP7 stratospheric aerosols +LCMIP_STRATAER_BCKGD=.FALSE. +LCMIP_STRATAER_CMIP6=.FALSE. +LCMIP_STRATAER_CMIP7=.FALSE. +CCMIP_STRAT_FULL='' +CCMIP_STRAT_FULL_CLIM='' +LSTRATAERO_UPDATED = .FALSE. + +! Cloud activation scheme +NCLOUDACT= 0 ! 0: effective radius from IFS code and default activation + ! 1: use Morales & Nenes activation scheme from HAMM7 + ! 2: use Abdul-Razzak & Ghan activation scheme from HAMM7 + +! Computation of M7 aerosols optical properties +NAEROOPT = 2 ! 2: HAM optics (faster and calculated for LW too) + ! 1: TM5 optics (slower and only for SW) + ! 0: No optical properties calculated LERAD1H=.FALSE. NLNGR1H=12 @@ -2094,7 +2135,6 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ENDIF WRITE(UNIT=KULOUT,FMT='('' INBLW,NTSW,NSW SET EQUAL TO:'',3I3)') INBLW,NTSW,NSW - !-- routine specific to the UV processor IF (LUVPROC) THEN NUVTIM = NUVTIM * INT(RDAY) @@ -2105,7 +2145,67 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) !* 6. INITIALIZE AEROSOL OPTICAL PARAMETERS AND DISTRIBUTION ! ------------------------------------------------------ +! - 6.0. PARAMETERS FOR M7 AEROSOL +! +IF (NACTAERO > 0) THEN + IF (TRIM(AERO_SCHEME) == "hamm7" ) THEN + + ALLOCATE(YDAERM7%M7AOD( NPROMA, NFLEVG, NTSW, NGPBLKS)) + ALLOCATE(YDAERM7%M7SSA( NPROMA, NFLEVG, NTSW, NGPBLKS)) + ALLOCATE(YDAERM7%M7ASYM( NPROMA, NFLEVG, NTSW, NGPBLKS)) + ALLOCATE(YDAERM7%M7AODLW(NPROMA, NFLEVG, NTSW+2,NGPBLKS)) + ! RCHG -> be careful with this initializations in the case of parallel programming. + YDAERM7%M7AOD(:,:,:,:) = 0.0_JPRB + YDAERM7%M7SSA(:,:,:,:) = 0.0_JPRB + YDAERM7%M7ASYM(:,:,:,:) = 0.0_JPRB + YDAERM7%M7AODLW(:,:,:,:) = 0.0_JPRB + + IF (NCLOUDACT == 1) CALL ND_PARAM_SETUP + ENDIF +ENDIF + +! - 6.0.1 PARAMETERS FOR stratospheric aerosols + +IF (LCMIP_STRATAER_CMIP7 .AND. LCMIP_STRATAER_CMIP6) THEN + WRITE(UNIT=KULOUT,FMT='(A)')& + & 'Only one of CMIP6 or CMIP7 Stratospheric Aerosols can be used, not both!' + CALL ABOR1('SUECRAD: ABORT') +ENDIF +IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN + IGPBLKS_RAD=(RADGRID%NGPTOT-1)/NRPROMA+1 + ! Note assumption that NTSW == STRATO_CMIP_NSB + ALLOCATE(YDAERSTRAT%STRAT_AOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_AAOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_REFAOD (NRPROMA, NFLEVG, NTSW, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + ALLOCATE(YDAERSTRAT%STRAT_AAOD_LW(NRPROMA, NFLEVG, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH, IGPBLKS_RAD)) + + STRATO_CMIP_NALT=NFLEVG + ALLOCATE(YDAERSTRAT%STRATO_CMIP_ALT(STRATO_CMIP_NALT)) + ALLOCATE(YDAERSTRAT%AOD_SUN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AAOD_SUN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%REFAOD_SUN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AAOD_EARTH(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NTB, STRATO_CMIP_NMONTH)) + ALLOCATE(YDAERSTRAT%AOD_SUN_MEAN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%AAOD_SUN_MEAN (STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%REFAOD_SUN_MEAN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NSB)) + ALLOCATE(YDAERSTRAT%AAOD_EARTH_MEAN(STRATO_CMIP_NALT, STRATO_CMIP_NLAT, STRATO_CMIP_NTB)) + + YDAERSTRAT%AOD_SUN_MEAN=CHECK_SUN_MEAN + YDAERSTRAT%AAOD_SUN_MEAN=CHECK_SUN_MEAN + YDAERSTRAT%REFAOD_SUN_MEAN=CHECK_SUN_MEAN + YDAERSTRAT%AAOD_EARTH_MEAN=CHECK_EARTH_MEAN +ENDIF +IF (LCMIP_STRATAER_CMIP6) THEN + STRATO_FIRSTYEAR = 1850 + STRATO_LASTYEAR = 2014 + STRATO_CMIP_NTIME = 1980 +ENDIF +IF (LCMIP_STRATAER_CMIP7) THEN + STRATO_FIRSTYEAR = 1750 + STRATO_LASTYEAR = 2023 + STRATO_CMIP_NTIME = 3288 +ENDIF ! - 6.1. PARAMETERS FOR THE STANDARD TEGEN AEROSOL CLIMATOLOGY ! ----------------------------------------------------- @@ -2523,6 +2623,19 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) IF (ALLOCATED(YDESWRT%RSUN2))& & WRITE(UNIT=KULOUT,FMT='('' RSUN2 FROM YOESW = '',6F10.5)')(YDESWRT%RSUN2(I),I=1,NSW) +! ! Only print M7 options if used +! IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN + WRITE(UNIT=KULOUT,FMT='('' NCLOUDACT (M7) = '',I1)') NCLOUDACT + WRITE(UNIT=KULOUT,FMT='('' NAEROOPT (M7) = '',I1)') NAEROOPT +! ELSE +! WRITE(UNIT=KULOUT,FMT='(A)') 'NCLOUDACT/NAEROOPT not used' +! ENDIF + + ! CMIP stratospheric aerosols + WRITE(UNIT=KULOUT,FMT='('' LCMIP_STRATAER_BCKGD = '',L5)') LCMIP_STRATAER_BCKGD + WRITE(UNIT=KULOUT,FMT='('' LCMIP_STRATAER_CMIP6 = '',L5)') LCMIP_STRATAER_CMIP6 + WRITE(UNIT=KULOUT,FMT='('' LCMIP_STRATAER_CMIP7 = '',L5)') LCMIP_STRATAER_CMIP7 + ENDIF ! Load total solar irradiance @@ -2536,6 +2649,14 @@ SUBROUTINE SUECRAD(YDGEOMETRY,YDMODEL,KULOUT,KLEV,PETAH) ENDIF ENDIF +IF (.NOT. ASSOCIATED(YDUSTCLIM)) THEN + ALLOCATE(YDUSTCLIM) +ENDIF +IF (NDDUST==8) THEN + WRITE(UNIT=KULOUT,FMT='(" TEGEN DUST CLIM: Reading dust fields ")') + CALL YDUSTCLIM%READ() +ENDIF + ! Load greenhouse-gas climatology IF (.NOT. ASSOCIATED(YGHGCLIM)) THEN ALLOCATE(YGHGCLIM) diff --git a/ifs-source/arpifs/setup/su0yomb.F90 b/ifs-source/arpifs/setup/su0yomb.F90 index 9d6a3c7d..c33e1adb 100644 --- a/ifs-source/arpifs/setup/su0yomb.F90 +++ b/ifs-source/arpifs/setup/su0yomb.F90 @@ -185,7 +185,8 @@ SUBROUTINE SU0YOMB(YDFPOS,YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTC TYPE(CLASS_VARBC), INTENT(INOUT) :: YDVARBC TYPE(TOVSCV), INTENT(INOUT) :: YDTCV TYPE(TOVSCV_BGC), INTENT(INOUT) :: YDTCV_BGC -CLASS(DBASE), INTENT(OUT) :: YDODB +!CLASS(DBASE), INTENT(OUT) :: YDODB +CLASS(DBASE) :: YDODB CHARACTER (LEN = 35) :: CLINE CHARACTER(LEN=40) :: CLFILE @@ -504,7 +505,7 @@ SUBROUTINE SU0YOMB(YDFPOS,YDGEOMETRY,YDFIELDS,YDMTRAJ,YDMODEL,YDJOT,YDVARBC,YDTC WRITE(NULOUT,*) '---- Set up MCC climate model keys (lagged part) --',CLINE CALL SUMCCLAG(YDGEM,YDMODEL%YRML_GCONF,YDMODEL%YRML_AOC,YDMODEL%YRML_CHEM%YRCOMPO, & & YDMODEL%YRML_CHEM%YRCHEM, YDMODEL%YRML_PHY_AER%YREAERSRC, & - & YDMODEL%YRML_PHY_EC%YREPHY, NULOUT, YDSURF=YDSURF) + & YDMODEL%YRML_PHY_EC%YREPHY, NULOUT, YDSURF=YDSURF, NFLEVG=YDDIMV%NFLEVG) ENDIF !* Initialize cumulated fluxes requests diff --git a/ifs-source/arpifs/setup/su_surf_flds.F90 b/ifs-source/arpifs/setup/su_surf_flds.F90 index bd4aa0fe..2912c9e0 100644 --- a/ifs-source/arpifs/setup/su_surf_flds.F90 +++ b/ifs-source/arpifs/setup/su_surf_flds.F90 @@ -194,7 +194,9 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NGRBALUVI,NGRBALUVV,NGRBALUVG,& & NGRBALNII,NGRBALNIV,NGRBALNIG,& & NGRBAERDEP,NGRBAERLTS,NGRBAERSCC,NGRBAERDSF, NGRBAERDSZ, & - & NGRBAERLS13,& + & NGRBAERLS13, NGRBSOILTYPE, NGRBINJFIRE, & + & NGRBAERLS01,NGRBAERLS02,NGRBAERLS10,NGRBAERLS03,NGRBAERLS04,NGRBAERLS11,& + & NGRBAERLS05,NGRBAERLS06,NGRBAERLS12,NGRBAERLS07,NGRBAERLS08,NGRBAERLS09,& & NGRBAEODSS ,NGRBAEODDU ,NGRBAEODOM ,NGRBAEODBC ,NGRBAEODSU ,& & NGRBAEODNI ,NGRBAEODAM, NGRBAEODSOA,& & NGRBAEODVFA,NGRBAEODVSU,NGRBACCAOD550,NGRBAEPM1 ,NGRBAEPM25 ,NGRBAEPM10 ,& @@ -315,12 +317,13 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & NCOM=>YDDPHY%NCOM, NVEXTRRAD=>YDDPHY%NVEXTRRAD, NCXP=>YDDPHY%NCXP, & & NVECOUT=>YDDPHY%NVECOUT, NSURFEXCTLMAX=>YDMSE%NSURFEXCTLMAX, & & LMSE=>YDARPHY%LMSE, NFPCLI=>YLNAMFPSCI%NFPCLI,NFPSWI=>YLNAMFPSCI%NFPSWI, & - & YGHG=>YGFL%YGHG, & + & YGHG=>YGFL%YGHG, NGEMS=>YGFL%NGEMS, NCHEM_FLX=> YGFL%NCHEM_FLX, & & YCHEM=>YGFL%YCHEM, NGHG=>YGFL%NGHG, & & NCHEM_TC=>YGFL%NCHEM_TC, NCHEM_DV=>YGFL%NCHEM_DV, & & NCHEM_FLXO=>YGFL%NCHEM_FLXO, NCHEM=>YGFL%NCHEM, & & NCHEM_WDFLX=>YGFL%NCHEM_WDFLX, NCHEM_DDFLX=>YGFL%NCHEM_DDFLX, & & NEMIS2D=>YGFL%NEMIS2D, NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & + & LAEROSFC=>YDCOMPO%LAEROSFC, LINJ=> YDCOMPO%LINJ, & & NEMIS2DAUX=>YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC=>YDCOMPO%YEMIS2DAUX_DESC, & & NACTAERO=>YGFL%NACTAERO, YAERO=>YGFL%YAERO, YAERO_DESC=>YDEAERATM%YAERO_DESC, & & NGP5_OOPS=>YDSURF%NGP5_OOPS, NTRAJ_CST_OOPS=>YDSURF%NTRAJ_CST_OOPS, & @@ -1107,21 +1110,26 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) YSD_VF%YDSZ => YSD_VF%YVF(JPMAXSFLDS) YSD_VF%YDMSO => YSD_VF%YVF(JPMAXSFLDS) YSD_VF%YURBF => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YFCA1 => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YFCA2 => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YSO2DD => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YFCA1 => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YFCA2 => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YSO2DD => YSD_VF%YVF(JPMAXSFLDS) +! + +IF ( TRIM(AERO_SCHEME)=="hamm7" ) THEN + YSD_VF%YSOILTYPE=> YSD_VF%YVF(JPMAXSFLDS) +ENDIF YSD_VF%YCHEMFLXO => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCHEMDDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCHEMWDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCHEMDV => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YEMIS2D => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YEMIS2DAUX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) -YSD_VF%YCGPP => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YCREC => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YFP1 => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YNUDM => YSD_VF%YVF(JPMAXSFLDS) -YSD_VF%YSSS => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YCHEMDDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YCHEMWDFLX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YCHEMDV => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YEMIS2D => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YEMIS2DAUX => YSD_VF%YVF(JPMAXSFLDS:JPMAXSFLDS) +YSD_VF%YCGPP => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YCREC => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YFP1 => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YNUDM => YSD_VF%YVF(JPMAXSFLDS) +YSD_VF%YSSS => YSD_VF%YVF(JPMAXSFLDS) ! - set-up attributes for active fields: IF(LECMWF) THEN @@ -1185,10 +1193,10 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) & KGRIB=NGRBSLT ,CDNAME='SOIL TYPE ',KTRAJ=2,KREQIN=1) YSD_VF%YCLK => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YCLK ,& - & KGRIB=NGRBCL ,CDNAME='LAKE COVER ',KTRAJ=2,KREQIN=IREQINLAKE) + & KGRIB=NGRBCL , CDNAME='LAKE COVER ',KTRAJ=2,KREQIN=IREQINLAKE) YSD_VF%YDL => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YDL ,& - & KGRIB=NGRBDL ,CDNAME='LAKE DEPTH ',KTRAJ=2,KREQIN=IREQINLAKE) + & KGRIB=NGRBDL , CDNAME='LAKE DEPTH ',KTRAJ=2,KREQIN=IREQINLAKE) YSD_VF%YCI => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YCI ,& & KGRIB=NGRBCI ,CDNAME='SEA ICE COVER ',KTRAJ=ISURFTRAJ,KREQIN=1) @@ -1235,7 +1243,7 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ! Near-IR diffuse albedo YSD_VF%YALNID => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YALNID,& - & KGRIB=NGRBALNID,CDNAME='M_ALB.N-IR DIFFU',KTRAJ=2,KREQIN=IREQIN_MODIS4) + & KGRIB=NGRBALNID, CDNAME='M_ALB.N-IR DIFFU',KTRAJ=2,KREQIN=IREQIN_MODIS4) ! Six-component MODIS land albedo scheme ! UV/Vis albedo: isotropic component @@ -1263,6 +1271,10 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YALNIG,& & KGRIB=NGRBALNIG,CDNAME='M_ALB.N-IRPARALG',KTRAJ=2,KREQIN=IREQIN_MODIS6) + + + + IF (NACTAERO > 0) THEN YSD_VF%YAERDEP => YSD_VF%YVF(YSD_VFD%IPTR) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YAERDEP,& @@ -1287,7 +1299,6 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YDSF,& & KGRIB=NGRBAERDSF,CDNAME='Dust source fctn',KTRAJ=2,KREQIN=IREQIN) - IF (LAERDUSTSIZEVAR) THEN IREQIN=1 ELSE @@ -1301,12 +1312,31 @@ SUBROUTINE SU_SURF_FLDS(YDDIMV,YDSURF,YDMODEL,LDVERBOSE) ENDIF +! IF (NGEMS > 0 .OR. NCHEM_FLX > 0) THEN +! IREQIN=-1 +! IF (LINJ) IREQIN=1 +! IREQIN=0 +! !YSD_VF%YINJF => YSD_VF%YVF(YSD_VFD%IPTR) +! !CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YINJF ,& +! !& KGRIB=NGRBINJFIRE ,CDNAME='BIOMASS BURN. EMIS HEIGHT. ',KTRAJ=2,KREQIN=IREQIN) +! ENDIF + + + !HAM_M7 ancillary data + IF ( TRIM(AERO_SCHEME) == "hamm7" ) THEN + YSD_VF%YSOILTYPE => YSD_VF%YVF(YSD_VFD%IPTR) + IREQIN=-1 ! This is relevant for dust emission in Tegen scheme (nddust=4), Lianghai Wu + CALL SETUP_SFLP2(YSD_VFD,YSD_VF%YSOILTYPE, & + & KGRIB=NGRBSOILTYPE, CDNAME='TM5M7 soil type ',KTRAJ=2,KREQIN=IREQIN) + END IF + IF (NACTAERO > 0) THEN ! ZKFIXME: revert to LAEROSFC once emission refactoring complete IF (LAERCHEM) THEN IREQIN=-1 ELSE IREQIN=1 ENDIF + YSD_VF%YSO2DD => YSD_VF%YVF(YSD_VFD%IPTR) IF (LAERCHEM .AND. .NOT.(LAERSOA .AND. .NOT. LAERSOA_COUPLED)) THEN IREQIN=-1 diff --git a/ifs-source/arpifs/setup/suctrl_gflattr.F90 b/ifs-source/arpifs/setup/suctrl_gflattr.F90 index d7dbc2d9..f982064f 100644 --- a/ifs-source/arpifs/setup/suctrl_gflattr.F90 +++ b/ifs-source/arpifs/setup/suctrl_gflattr.F90 @@ -1186,6 +1186,9 @@ SUBROUTINE SUCTRL_GFLATTR(YDEPHY,YDML_GCONF,YDARPHY,YDPHY,YDSIMPHL,YDDYNA) IF (LLCOMAD_GFL .NEQV. LCOMAD_GFL) THEN + + WRITE(NULOUT,*) ' INCONSISTENCY BETWEEN LCOMAD_GFL AND GFL ATTRIBUTE LCOMAD.' + WRITE(NULOUT,*) LLCOMAD_GFL, LCOMAD_GFL WRITE(NULERR,*) ' INCONSISTENCY BETWEEN LCOMAD_GFL AND GFL ATTRIBUTE LCOMAD.' CALL ABOR1(' SUCTRL_GFLATTR: 1.6a') ENDIF diff --git a/ifs-source/arpifs/setup/sudefo_gflattr.F90 b/ifs-source/arpifs/setup/sudefo_gflattr.F90 index b95cb186..e3ddf69d 100644 --- a/ifs-source/arpifs/setup/sudefo_gflattr.F90 +++ b/ifs-source/arpifs/setup/sudefo_gflattr.F90 @@ -112,8 +112,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUDEFO_GFLATTR',0,ZHOOK_HANDLE) -ASSOCIATE(YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDARPHY=>YDMODEL%YRML_PHY_MF%YRARPHY,YDPHNC=>YDMODEL%YRML_PHY_SLIN%YRPHNC,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA) + +ASSOCIATE(& + & YDPHY => YDMODEL%YRML_PHY_MF%YRPHY, & + & YGFL => YDMODEL%YRML_GCONF%YGFL, & + & YDEPHY => YDMODEL%YRML_PHY_EC%YREPHY, & + & YDARPHY => YDMODEL%YRML_PHY_MF%YRARPHY, & + & YDPHNC => YDMODEL%YRML_PHY_SLIN%YRPHNC, & + & YDDYNA => YDMODEL%YRML_DYN%YRDYNA) + ASSOCIATE(LRDUST=>YDARPHY%LRDUST, LRDEPOS=>YDARPHY%LRDEPOS, & & LUSECHEM=>YDARPHY%LUSECHEM, LMDUST=>YDARPHY%LMDUST, LRCO2=>YDARPHY%LRCO2, & & LORILAM=>YDARPHY%LORILAM, LMPA=>YDARPHY%LMPA, & @@ -130,6 +137,7 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) & YAEROCLIM_NL=>YGFL%YAEROCLIM_NL, & & YQ_NL=>YGFL%YQ_NL, NGFL_EXT=>YGFL%NGFL_EXT, YEFB1_NL=>YGFL%YEFB1_NL, & & YLRCH4_NL=>YGFL%YLRCH4_NL, YEZDIAG_NL=>YGFL%YEZDIAG_NL, YG_NL=>YGFL%YG_NL, & + & YCDNC_NL=>YGFL%YCDNC_NL, YICNC_NL=>YGFL%YICNC_NL, YRE_LIQ_NL=>YGFL%YRE_LIQ_NL, YRE_ICE_NL=>YGFL%YRE_ICE_NL, & !eehol: added cloud properties & YERA40_NL=>YGFL%YERA40_NL, YTTE_NL=>YGFL%YTTE_NL, NSLDIA=>YGFL%NSLDIA, & & YNOGW_NL=>YGFL%YNOGW_NL, YCOMP=>YGFL%YCOMP, YIRAD_NL=>YGFL%YIRAD_NL, & & YUNEBH_NL=>YGFL%YUNEBH_NL, YDAL_NL=>YGFL%YDAL_NL, YRKTQV_NL=>YGFL%YRKTQV_NL, & @@ -299,6 +307,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LGP=.FALSE. ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LGP =.TRUE. +YICNC_NL%LGP =.TRUE. +YRE_LIQ_NL%LGP =.TRUE. +YRE_ICE_NL%LGP =.TRUE. +!END IF + ! * Default for attribute LSP ! (some of them will be readjusted after some namelists reading). IF (LECMWF) THEN @@ -431,6 +447,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LSP=.FALSE. YPHYCTY_NL%LSP=.FALSE. ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LSP=.FALSE. +YICNC_NL%LSP=.FALSE. +YRE_LIQ_NL%LSP=.FALSE. +YRE_ICE_NL%LSP=.FALSE. +!END IF ! * Default for attribute NREQIN IF (ANY(SPREAD(ICONF,1,4) == (/1,302,601,801/))) THEN @@ -613,6 +636,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%NREQIN=0 YPHYCTY_NL%NREQIN=0 ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%NREQIN=0 +YICNC_NL%NREQIN=0 +YRE_LIQ_NL%NREQIN=-1 +YRE_ICE_NL%NREQIN=-1 +!END IF ! * Default for attribute REFVALI ! REFVALI is useful only when NREQIN=-1, @@ -797,6 +827,12 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%REFVALI= ZREFVALI_USELESS YFSD_NL%REFVALI= ZREFVALI_USELESS ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%REFVALI = ZREFVALI_USELESS +YICNC_NL%REFVALI = ZREFVALI_USELESS +YRE_LIQ_NL%REFVALI = 4.0_JPRB +YRE_ICE_NL%REFVALI = 20.0_JPRB ! * Default for attribute LREQOUT ! ky: I don't know exactly what to do for conf other than 1,601,801. @@ -934,6 +970,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LREQOUT= .FALSE. ENDIF + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LREQOUT = .FALSE. +YICNC_NL%LREQOUT = .FALSE. +YRE_LIQ_NL%LREQOUT = .FALSE. +YRE_ICE_NL%LREQOUT = .FALSE. +!END IF + ! * Default for attribute LGPINGP IF (LECMWF) THEN LLEC_GPINGP=ANY(SPREAD(ICONF,1,4) == (/1,302,601,801/)) .OR. & @@ -1067,7 +1112,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LGPINGP= .FALSE. ENDIF ENDIF -YRSPEC_NL%LGPINGP= .TRUE. +YRSPEC_NL%LGPINGP = .TRUE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LGPINGP = .FALSE. +YICNC_NL%LGPINGP = .FALSE. +YRE_LIQ_NL%LGPINGP = .FALSE. +YRE_ICE_NL%LGPINGP = .FALSE. +!END IF ! * Default for attribute LTRAJIO IF (LECMWF) THEN @@ -1184,6 +1236,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LTRAJIO= .FALSE. ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LTRAJIO = .FALSE. +YICNC_NL%LTRAJIO = .FALSE. +YRE_LIQ_NL%LTRAJIO = .FALSE. +YRE_ICE_NL%LTRAJIO = .FALSE. +!END IF + ! * Default for attribute LDIAG YQ_NL%LDIAG = .FALSE. YL_NL%LDIAG = .FALSE. @@ -1228,6 +1288,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LDIAG= .FALSE. YPHYCTY_NL%LDIAG= .FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LDIAG = .FALSE. +YICNC_NL%LDIAG = .FALSE. +YRE_LIQ_NL%LDIAG = .FALSE. +YRE_ICE_NL%LDIAG = .FALSE. +!END IF + ! * Default for attribute LADV IF (LECMWF) THEN IF (YDDYNA%LSLAG) THEN @@ -1560,6 +1629,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) ! True means TL/AD SL advection of GFL fields uses ! trajectory wind only, making 4D-VAR univariate ! apart from the observation operators +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LADV = .FALSE. +YICNC_NL%LADV = .FALSE. +YRE_LIQ_NL%LADV = .FALSE. +YRE_ICE_NL%LADV = .FALSE. +!END IF IF (LECMWF) THEN IF (YDDYNA%LSLAG) THEN @@ -1622,6 +1698,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LPT= .FALSE. YPHYCTY_NL%LPT= .FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LPT = .FALSE. +YICNC_NL%LPT = .FALSE. +YRE_LIQ_NL%LPT = .FALSE. +YRE_ICE_NL%LPT = .FALSE. +!END IF + ! * Default for attribute LPC YQ_NL%LPC = .TRUE. YL_NL%LPC = .TRUE. @@ -1665,6 +1749,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRKTQC_NL%LPC= .FALSE. YRSPEC_NL%LPC= .FALSE. YPHYCTY_NL%LPC= .FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LPC = .FALSE. +YICNC_NL%LPC = .FALSE. +YRE_LIQ_NL%LPC = .FALSE. +YRE_ICE_NL%LPC = .FALSE. +!END IF ! * Default for attribute CNAME ! This value is automatically computed in SUGFL2. @@ -1791,6 +1882,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%NCOUPLING= 0 ENDIF + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%NCOUPLING = 0 +YICNC_NL%NCOUPLING = 0 +YRE_LIQ_NL%NCOUPLING = 0 +YRE_ICE_NL%NCOUPLING = 0 +!END IF + ! * Default for attribute REFVALC ! REFVALC is useful only when NCOUPLING=-1, ! but to avoid unitialised values, REFVALC is set to -999 in the other cases. @@ -1883,6 +1983,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%REFVALC= ZREFVALC_USELESS ENDIF +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%REFVALC= ZREFVALC_USELESS +YICNC_NL%REFVALC= ZREFVALC_USELESS +YRE_LIQ_NL%REFVALC= ZREFVALC_USELESS +YRE_ICE_NL%REFVALC= ZREFVALC_USELESS +!END IF + ! * Default for attribute LTDIABLIN YQ_NL%LTDIABLIN=.FALSE. YL_NL%LTDIABLIN=.FALSE. @@ -1927,6 +2035,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LTDIABLIN=.FALSE. YPHYCTY_NL%LTDIABLIN=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LTDIABLIN= .FALSE. +YICNC_NL%LTDIABLIN= .FALSE. +YRE_LIQ_NL%LTDIABLIN= .FALSE. +YRE_ICE_NL%LTDIABLIN= .FALSE. +!END IF + ! * Default for attribute LHORTURB YQ_NL%LHORTURB=.FALSE. YL_NL%LHORTURB=.FALSE. @@ -1971,6 +2087,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LHORTURB=.FALSE. YPHYCTY_NL%LHORTURB=.FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LHORTURB= .FALSE. +YICNC_NL%LHORTURB= .FALSE. +YRE_LIQ_NL%LHORTURB= .FALSE. +YRE_ICE_NL%LHORTURB= .FALSE. +!END IF + + ! * Default for attribute LSLHD YQ_NL%LSLHD=.FALSE. YL_NL%LSLHD=.FALSE. @@ -2015,6 +2141,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LSLHD=.FALSE. YPHYCTY_NL%LSLHD=.FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LSLHD = .FALSE. +YICNC_NL%LSLHD = .FALSE. +YRE_LIQ_NL%LSLHD = .FALSE. +YRE_ICE_NL%LSLHD = .FALSE. +!END IF + + ! * Default for attribute LCOMAD YQ_NL%LCOMAD=.FALSE. YL_NL%LCOMAD=.FALSE. @@ -2058,6 +2194,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LCOMAD=.FALSE. YPHYCTY_NL%LCOMAD=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LCOMAD= .FALSE. +YICNC_NL%LCOMAD= .FALSE. +YRE_LIQ_NL%LCOMAD= .FALSE. +YRE_ICE_NL%LCOMAD= .FALSE. +!END IF + ! * Default for attribute LVSPLIP YQ_NL%LVSPLIP=.FALSE. YL_NL%LVSPLIP=.FALSE. @@ -2102,6 +2246,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LVSPLIP=.FALSE. YPHYCTY_NL%LVSPLIP=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LVSPLIP = .FALSE. +YICNC_NL%LVSPLIP = .FALSE. +YRE_LIQ_NL%LVSPLIP = .FALSE. +YRE_ICE_NL%LVSPLIP = .FALSE. +!END IF + ! * Default for attribute LQM IF (LECMWF) THEN ! ky: this must be checked by ECMWF @@ -2239,6 +2391,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YPHYCTY_NL%LQM=.FALSE. ENDIF + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQM = .FALSE. +YICNC_NL%LQM = .FALSE. +YRE_LIQ_NL%LQM = .FALSE. +YRE_ICE_NL%LQM = .FALSE. +!END IF + + ! * Default for attribute LQMH YQ_NL%LQMH=.FALSE. YL_NL%LQMH=.FALSE. @@ -2283,6 +2445,16 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LQMH=.FALSE. YPHYCTY_NL%LQMH=.FALSE. + +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQMH = .FALSE. +YICNC_NL%LQMH = .FALSE. +YRE_LIQ_NL%LQMH = .FALSE. +YRE_ICE_NL%LQMH = .FALSE. +!END IF + + ! * Default for attribute LQM3D IF (LECMWF) THEN YQ_NL%LQM3D=.FALSE. @@ -2337,6 +2509,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LQM3D=.FALSE. YPHYCTY_NL%LQM3D=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQM3D = .FALSE. +YICNC_NL%LQM3D = .FALSE. +YRE_LIQ_NL%LQM3D = .FALSE. +YRE_ICE_NL%LQM3D = .FALSE. +!END IF + ! * Default for attribute LQML3D YQ_NL%LQML3D=.FALSE. YL_NL%LQML3D=.FALSE. @@ -2381,6 +2561,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LQML3D=.FALSE. YPHYCTY_NL%LQML3D=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LQML3D = .FALSE. +YICNC_NL%LQML3D = .FALSE. +YRE_LIQ_NL%LQML3D = .FALSE. +YRE_ICE_NL%LQML3D = .FALSE. +!END IF + ! * Default for attribute LHV YQ_NL%LHV=.FALSE. YL_NL%LHV=.FALSE. @@ -2425,6 +2613,15 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LHV=.FALSE. YPHYCTY_NL%LHV=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LHV = .FALSE. +YICNC_NL%LHV = .FALSE. +YRE_LIQ_NL%LHV = .FALSE. +YRE_ICE_NL%LHV = .FALSE. +!END IF + + ! * Default for attribute LINTLIN YQ_NL%LINTLIN=.FALSE. YL_NL%LINTLIN=.FALSE. @@ -2469,6 +2666,13 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LINTLIN=.FALSE. YPHYCTY_NL%LINTLIN=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LINTLIN = .FALSE. +YICNC_NL%LINTLIN = .FALSE. +YRE_LIQ_NL%LINTLIN = .FALSE. +YRE_ICE_NL%LINTLIN = .FALSE. +!END IF ! * Default for attribute LVWENO IF (LECMWF) THEN @@ -2617,6 +2821,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LMASSFIX=.FALSE. YPHYCTY_NL%LMASSFIX=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LMASSFIX = .FALSE. +YICNC_NL%LMASSFIX = .FALSE. +YRE_LIQ_NL%LMASSFIX = .FALSE. +YRE_ICE_NL%LMASSFIX = .FALSE. +!END IF + ! * Default for attribute LNEGFIX (mass fixer attribute) YQ_NL%LNEGFIX=.FALSE. YL_NL%LNEGFIX=.FALSE. @@ -2661,6 +2873,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LNEGFIX=.FALSE. YPHYCTY_NL%LNEGFIX=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LNEGFIX = .FALSE. +YICNC_NL%LNEGFIX = .FALSE. +YRE_LIQ_NL%LNEGFIX = .FALSE. +YRE_ICE_NL%LNEGFIX = .FALSE. +!END IF + ! * Default for attribute BETAMFBC YQ_NL%BETAMFBC=1.0_JPRB YL_NL%BETAMFBC=1.0_JPRB @@ -2705,6 +2925,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%BETAMFBC=1.0_JPRB YPHYCTY_NL%BETAMFBC=1.0_JPRB +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%BETAMFBC = 1.0_JPRB +YICNC_NL%BETAMFBC = 1.0_JPRB +YRE_LIQ_NL%BETAMFBC = 1.0_JPRB +YRE_ICE_NL%BETAMFBC = 1.0_JPRB +!END IF + ! * Default for attribute LQMGRID YQ_NL%LMGRID=.FALSE. YL_NL%LMGRID=.FALSE. @@ -2809,6 +3037,14 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) YRSPEC_NL%LPHY=.FALSE. YPHYCTY_NL%LPHY=.FALSE. +!eehol: added cloud properties +!IF (LECEARTH .OR. LECEARTH_UNCOUP) THEN +YCDNC_NL%LPHY = .FALSE. +YICNC_NL%LPHY = .FALSE. +YRE_LIQ_NL%LPHY = .FALSE. +YRE_ICE_NL%LPHY = .FALSE. +!END IF + ! ------------------------------------------------------------------ ! 1b Set implicit default values for GFL attributes @@ -2995,61 +3231,61 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) ! * Defaults for aerosols attributes DO JGFL=1,JPAERO IF (LECMWF) THEN - YAERO_NL(JGFL)%LGP = .TRUE. + YAERO_NL(JGFL)%LGP = .TRUE. ELSE - YAERO_NL(JGFL)%LGP = .FALSE. + YAERO_NL(JGFL)%LGP = .FALSE. ENDIF - YAERO_NL(JGFL)%LSP = .FALSE. - YAERO_NL(JGFL)%NREQIN = 1 - YAERO_NL(JGFL)%LREQOUT= .TRUE. + YAERO_NL(JGFL)%LSP = .FALSE. + YAERO_NL(JGFL)%NREQIN = 1 + YAERO_NL(JGFL)%LREQOUT = .TRUE. IF (LECMWF) THEN - YAERO_NL(JGFL)%LGPINGP= LLEC_GPINGP + YAERO_NL(JGFL)%LGPINGP = LLEC_GPINGP ELSE - YAERO_NL(JGFL)%LGPINGP= .TRUE. + YAERO_NL(JGFL)%LGPINGP = .TRUE. ENDIF IF (LECMWF .AND. LTRAJHR) THEN - YAERO_NL(JGFL)%LTRAJIO= .TRUE. + YAERO_NL(JGFL)%LTRAJIO = .TRUE. ELSE - YAERO_NL(JGFL)%LTRAJIO= .FALSE. + YAERO_NL(JGFL)%LTRAJIO = .FALSE. ENDIF - YAERO_NL(JGFL)%LDIAG= .FALSE. + YAERO_NL(JGFL)%LDIAG = .FALSE. IF (LECMWF.OR.(LENCLD2 .AND. .NOT.LEPCLD)) THEN - YAERO_NL(JGFL)%LADV=YDDYNA%LSLAG + YAERO_NL(JGFL)%LADV = YDDYNA%LSLAG ELSE - YAERO_NL(JGFL)%LADV=.FALSE. + YAERO_NL(JGFL)%LADV = .FALSE. ENDIF - YAERO_NL(JGFL)%LADV5=.FALSE. - YAERO_NL(JGFL)%LCDERS = .FALSE. - YAERO_NL(JGFL)%LT9 = .FALSE. - YAERO_NL(JGFL)%LT1 = .FALSE. - YAERO_NL(JGFL)%LT5 = .FALSE. - YAERO_NL(JGFL)%LPT = .FALSE. - YAERO_NL(JGFL)%LPC = .FALSE. - YAERO_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' - YAERO_NL(JGFL)%IGRBCODE = 999 - YAERO_NL(JGFL)%NCOUPLING= 0 - YAERO_NL(JGFL)%LTDIABLIN=.FALSE. - YAERO_NL(JGFL)%LHORTURB =.FALSE. - YAERO_NL(JGFL)%LSLHD =.FALSE. - YAERO_NL(JGFL)%LCOMAD =.FALSE. - YAERO_NL(JGFL)%LVSPLIP =.FALSE. + YAERO_NL(JGFL)%LADV5 = .FALSE. + YAERO_NL(JGFL)%LCDERS = .FALSE. + YAERO_NL(JGFL)%LT9 = .FALSE. + YAERO_NL(JGFL)%LT1 = .FALSE. + YAERO_NL(JGFL)%LT5 = .FALSE. + YAERO_NL(JGFL)%LPT = .FALSE. + YAERO_NL(JGFL)%LPC = .FALSE. + YAERO_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' + YAERO_NL(JGFL)%IGRBCODE = 999 + YAERO_NL(JGFL)%NCOUPLING = 0 + YAERO_NL(JGFL)%LTDIABLIN = .FALSE. + YAERO_NL(JGFL)%LHORTURB = .FALSE. + YAERO_NL(JGFL)%LSLHD = .FALSE. + YAERO_NL(JGFL)%LCOMAD = .FALSE. + YAERO_NL(JGFL)%LVSPLIP = .FALSE. IF (LECMWF) THEN - YAERO_NL(JGFL)%LQM =.TRUE. + YAERO_NL(JGFL)%LQM = .TRUE. ELSE - YAERO_NL(JGFL)%LQM =.FALSE. + YAERO_NL(JGFL)%LQM = .FALSE. ENDIF - YAERO_NL(JGFL)%LQM3D =.FALSE. - YAERO_NL(JGFL)%LQML3D =.FALSE. - YAERO_NL(JGFL)%LQMH =.FALSE. - YAERO_NL(JGFL)%LHV =.FALSE. - YAERO_NL(JGFL)%LINTLIN =.FALSE. - YAERO_NL(JGFL)%LVWENO =.FALSE. + YAERO_NL(JGFL)%LQM3D = .FALSE. + YAERO_NL(JGFL)%LQML3D = .FALSE. + YAERO_NL(JGFL)%LQMH = .FALSE. + YAERO_NL(JGFL)%LHV = .FALSE. + YAERO_NL(JGFL)%LINTLIN = .FALSE. + YAERO_NL(JGFL)%LVWENO = .FALSE. YAERO_NL(JGFL)%WENO_ALPHA = 0.0_JPRB - YAERO_NL(JGFL)%LPHY =.FALSE. - YAERO_NL(JGFL)%LMASSFIX =.FALSE. - YAERO_NL(JGFL)%LNEGFIX =.FALSE. - YAERO_NL(JGFL)%LMGRID =.FALSE. - YAERO_NL(JGFL)%BETAMFBC = 1.0_JPRB + YAERO_NL(JGFL)%LPHY = .FALSE. + YAERO_NL(JGFL)%LMASSFIX = .FALSE. + YAERO_NL(JGFL)%LNEGFIX = .FALSE. + YAERO_NL(JGFL)%LMGRID = .FALSE. + YAERO_NL(JGFL)%BETAMFBC = 1.0_JPRB ENDDO ! * Defaults for methane related GFL attributes: LRCH4 @@ -3416,43 +3652,44 @@ SUBROUTINE SUDEFO_GFLATTR(YDMODEL,KGFLCONF) !YAERLISI_NL(JPAERLISI_1064,JPAERLISI_EXTD)%CNAME='DustExt1064' ! * Defaults for aerosol output fields -DO JGFL=1,JPAEROUT - YAEROUT_NL(JGFL)%LGP = .TRUE. - YAEROUT_NL(JGFL)%LSP = .FALSE. - YAEROUT_NL(JGFL)%NREQIN = 0 - YAEROUT_NL(JGFL)%LREQOUT= .TRUE. - YAEROUT_NL(JGFL)%LGPINGP= .TRUE. - YAEROUT_NL(JGFL)%LTRAJIO= .FALSE. - YAEROUT_NL(JGFL)%LDIAG = .FALSE. - YAEROUT_NL(JGFL)%LADV = .FALSE. - YAEROUT_NL(JGFL)%LCDERS = .FALSE. - YAEROUT_NL(JGFL)%LT9 = .FALSE. - YAEROUT_NL(JGFL)%LT1 = .FALSE. - YAEROUT_NL(JGFL)%LT5 = .FALSE. - YAEROUT_NL(JGFL)%LPT = .FALSE. - YAEROUT_NL(JGFL)%LPC = .FALSE. - YAEROUT_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' - YAEROUT_NL(JGFL)%NCOUPLING= 0 - YAEROUT_NL(JGFL)%LTDIABLIN=.FALSE. - YAEROUT_NL(JGFL)%LHORTURB =.FALSE. - YAEROUT_NL(JGFL)%LSLHD =.FALSE. - YAEROUT_NL(JGFL)%LCOMAD =.FALSE. - YAEROUT_NL(JGFL)%LVSPLIP =.FALSE. - YAEROUT_NL(JGFL)%LQM =.FALSE. - YAEROUT_NL(JGFL)%LQM3D =.FALSE. - YAEROUT_NL(JGFL)%LQML3D =.FALSE. - YAEROUT_NL(JGFL)%LQMH =.FALSE. - YAEROUT_NL(JGFL)%LHV =.FALSE. - YAEROUT_NL(JGFL)%LINTLIN =.FALSE. - YAEROUT_NL(JGFL)%LVWENO =.FALSE. +DO JGFL=1,JPAEROUT !RCHG -> It's a parameter with value 50 + YAEROUT_NL(JGFL)%LGP = .TRUE. + YAEROUT_NL(JGFL)%LSP = .FALSE. + YAEROUT_NL(JGFL)%NREQIN = 0 + YAEROUT_NL(JGFL)%LREQOUT = .TRUE. + YAEROUT_NL(JGFL)%LGPINGP = .TRUE. + YAEROUT_NL(JGFL)%LTRAJIO = .FALSE. + YAEROUT_NL(JGFL)%LDIAG = .FALSE. + YAEROUT_NL(JGFL)%LADV = .FALSE. + YAEROUT_NL(JGFL)%LCDERS = .FALSE. + YAEROUT_NL(JGFL)%LT9 = .FALSE. + YAEROUT_NL(JGFL)%LT1 = .FALSE. + YAEROUT_NL(JGFL)%LT5 = .FALSE. + YAEROUT_NL(JGFL)%LPT = .FALSE. + YAEROUT_NL(JGFL)%LPC = .FALSE. + YAEROUT_NL(JGFL)%CNAME = 'XXXXXXXXXXXXXXX' + YAEROUT_NL(JGFL)%NCOUPLING = 0 + YAEROUT_NL(JGFL)%LTDIABLIN = .FALSE. + YAEROUT_NL(JGFL)%LHORTURB = .FALSE. + YAEROUT_NL(JGFL)%LSLHD = .FALSE. + YAEROUT_NL(JGFL)%LCOMAD = .FALSE. + YAEROUT_NL(JGFL)%LVSPLIP = .FALSE. + YAEROUT_NL(JGFL)%LQM = .FALSE. + YAEROUT_NL(JGFL)%LQM3D = .FALSE. + YAEROUT_NL(JGFL)%LQML3D = .FALSE. + YAEROUT_NL(JGFL)%LQMH = .FALSE. + YAEROUT_NL(JGFL)%LHV = .FALSE. + YAEROUT_NL(JGFL)%LINTLIN = .FALSE. + YAEROUT_NL(JGFL)%LVWENO = .FALSE. YAEROUT_NL(JGFL)%WENO_ALPHA = 0.0_JPRB - YAEROUT_NL(JGFL)%LPHY =.FALSE. - YAEROUT_NL(JGFL)%LMASSFIX =.FALSE. - YAEROUT_NL(JGFL)%LNEGFIX =.FALSE. - YAEROUT_NL(JGFL)%LMGRID =.FALSE. - YAEROUT_NL(JGFL)%BETAMFBC = 1.0_JPRB + YAEROUT_NL(JGFL)%LPHY = .FALSE. + YAEROUT_NL(JGFL)%LMASSFIX = .FALSE. + YAEROUT_NL(JGFL)%LNEGFIX = .FALSE. + YAEROUT_NL(JGFL)%LMGRID = .FALSE. + YAEROUT_NL(JGFL)%BETAMFBC = 1.0_JPRB ENDDO +! RCHG -> Is this general or added by M7? YAEROUT_NL(1)%IGRBCODE=210022 YAEROUT_NL(2)%IGRBCODE=210025 diff --git a/ifs-source/arpifs/setup/sugfl1.F90 b/ifs-source/arpifs/setup/sugfl1.F90 index f7e839a9..5f72544a 100644 --- a/ifs-source/arpifs/setup/sugfl1.F90 +++ b/ifs-source/arpifs/setup/sugfl1.F90 @@ -77,6 +77,8 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) USE YOM_YGFL , ONLY : JPCHEM_ASSIM, JPGHG_ASSIM, TYPE_GFL_NAML USE YOMANEB , ONLY : NGRBCHEM, NGRBGHGASSIM USE YOE_AERODIAG, ONLY : TYPE_AERO_WVL_DIAG +USE YOMM7CTL , ONLY : YRM7CTL !!! M7, not sure where needed + USE ARPCLIM_CHEM_MODULE #if defined(__PGI) USE PAR_GFL @@ -105,15 +107,14 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & LCHEM_ANAO3, LCHEM_ANACH4, LCHEM_JOUT, LCHEM_0NOX, LCHEM_HTAP, LCHEM_O3RAD, LCHEM_WDFR, & & LCHEM_WEAK_CH4_RELAXATION, & & LCHEM_CONVSCAV, LCHEM_CSHAPE, LCHEM_AEROI, LCHEM_LCOMESO, LCHEM_LCOCSTCLIM, LCHEM_LCOLIMIT, & - & LCOMPO_DCDD, & - & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & + & LCOMPO_DCDD, & + & LAERNITRATE, LAEREQSAM4CLIM, LAERSOA, LINJ, LAEROSFC, LAERSOA_COUPLED, LCHEM_REVCHEM, LAERRESUSPENSION, LAERNUCL, & & LCHEM_ARPCLIM REAL(KIND=JPRB), POINTER :: RCHEM_DIA_PERIOD CHARACTER(LEN=20) :: CHEM_SCHEME, CHEM_LCOVERS, AERO_SCHEME -INTEGER(KIND=JPIM), POINTER :: NCHEM_LCOCOEF, KCHEM_SOLVE, KCHEM_YEARPI, KCHEM_NOXADV, KCHEM_WETDEP, KCHEM_DRYDEP, & - & KGHG_CHEMTEND_CH4 +INTEGER(KIND=JPIM), POINTER :: NCHEM_LCOCOEF, KCHEM_SOLVE, KCHEM_YEARPI, KCHEM_NOXADV, KCHEM_WETDEP, KCHEM_DRYDEP, KGHG_CHEMTEND_CH4 REAL(KIND=JPRB), POINTER :: RCHEM_LCOTAUTOP, RCHEM_LCOCLIMTOP, RCHEM_LCOCOEFA1 REAL(KIND=JPRB), POINTER :: RCHEM_LINOX_SCALING, RCH4CONST @@ -122,6 +123,8 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) INTEGER(KIND=JPIM), POINTER :: M_soliter_ASIS REAL(KIND=JPRB), POINTER :: solcv_ASIS,RTOL_ASIS,ATOL_ASIS INTEGER(KIND=JPIM), POINTER :: N_F_RTOL_ASIS,N_F_ATOL_ASIS +! pointers for HAM-M7CTL +INTEGER(KIND=JPIM), POINTER :: NWATER, NSNUCL, NONUCL ! ------------------------------------------------------------------ @@ -131,6 +134,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) & YGHG_NL(JPGHG), YCHEM_NL(JPCHEM), YAERO_NL(JPAERO), YERA40_NL(JPERA40), & & YNOGW_NL(JPNOGW), YEDRP_NL(JPEDRP), YSLDIA_NL(JPSLDIA), YAERAOT_NL(NPAERAOT), & & YAERLISI_NL(NPAERLISI_WVL,NPAERLISI_VAR), YAEROCLIM_NL(JPAEROCLIM), & + & YCDNC_NL, YICNC_NL, YRE_LIQ_NL, YRE_ICE_NL, & !eehol: added cloud prop & YAEROUT_NL(JPAEROUT), YUVP_NL(JPUVP), YFORC_NL(JPFORC), & & YEZDIAG_NL(JPEZDIAG), YLIMA_NL(JPLIMA), & & YEXT_NL(JPGFL-JPNAMED_GFL-JPGHG-JPFORC-JPEZDIAG-JPAERO-JPERA40-JPNOGW-JPEDRP-JPSLDIA-& @@ -139,6 +143,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) TYPE(TYPE_GFL_NAML), POINTER :: & & YGHG_NL(:), YCHEM_NL(:), YAERO_NL(:), YERA40_NL(:), YNOGW_NL(:), YSLDIA_NL(:), & & YAERAOT_NL(:), YAERLISI_NL(:,:), YAEROCLIM_NL(:), YAEROUT_NL(:), YUVP_NL(:), & + & YCDNC_NL, YICNC_NL, YRE_LIQ_NL, YRE_ICE_NL, & !eehol: added cloud prop & YFORC_NL(:), YEZDIAG_NL(:), YEXT_NL(:), YLIMA_NL(:), YEDRP_NL(:) #endif @@ -187,6 +192,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) #include "namgfl.nam.h" #include "namcompo.nam.h" +#include "namm7ctl.nam.h" #include "namchem.nam.h" #include "posnam.intfb.h" @@ -198,8 +204,7 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUGFL1',0,ZHOOK_HANDLE) -ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO,YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) +ASSOCIATE(YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO, YDCHEM=>YDMODEL%YRML_CHEM%YRCHEM) ASSOCIATE(NCHEM_ASSIM=>YGFL%NCHEM_ASSIM, NCHEM_DV=>YGFL%NCHEM_DV,& & NCHEM_FLXO=>YGFL%NCHEM_FLXO, NCHEM_TC=>YGFL%NCHEM_TC, & & NCHEM_WDFLX=>YGFL%NCHEM_WDFLX, NCHEM_DDFLX=>YGFL%NCHEM_DDFLX, & @@ -214,14 +219,21 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LCHEM_TROPO => YDCOMPO%LCHEM_TROPO LCOMPO_DCDD => YDCOMPO%LCOMPO_DCDD LAERNITRATE => YDCOMPO%LAERNITRATE -LAEREQSAM4CLIM => YDCOMPO%LAEREQSAM4CLIM -LAERRESUSPENSION => YDCOMPO%LAERRESUSPENSION +LAEREQSAM4CLIM => YDCOMPO%LAEREQSAM4CLIM +LAERRESUSPENSION => YDCOMPO%LAERRESUSPENSION LAERSOA => YDCOMPO%LAERSOA +LINJ => YDCOMPO%LINJ +LAEROSFC => YDCOMPO%LAEROSFC LAERSOA_COUPLED => YDCOMPO%LAERSOA_COUPLED -LAERNUCL => YDCOMPO%LAERNUCL +LAERNUCL => YDCOMPO%LAERNUCL RCHEM_DIA_PERIOD => YDCOMPO%RCHEM_DIA_PERIOD KGHG_CHEMTEND_CH4=> YDCOMPO%KGHG_CHEMTEND_CH4 +! Associate pointers for variables in namelist NAMM7CTL, not sure where needed +NWATER => YRM7CTL%NWATER +NSNUCL => YRM7CTL%NSNUCL +NONUCL => YRM7CTL%NONUCL + ! Associate pointers for variables in namelist NAMCHEM LCHEM_LIGHT => YDCHEM%LCHEM_LIGHT RCHEM_LINOX_SCALING => YDCHEM%RCHEM_LINOX_SCALING @@ -309,6 +321,13 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) YPHYCTY_NL => YGFL%YPHYCTY_NL YSLDIA_NL => YGFL%YSLDIA_NL YLRCH4_NL => YGFL%YLRCH4_NL + +YCDNC_NL => YGFL%YCDNC_NL !eehol: CDNC +YICNC_NL => YGFL%YICNC_NL !eehol: ICNC +YRE_LIQ_NL => YGFL%YRE_LIQ_NL !eehol: liq eff rad +YRE_ICE_NL => YGFL%YRE_ICE_NL !eehol: ice eff rad + + YAERAOT_NL => YGFL%YAERAOT_NL YAERLISI_NL => YGFL%YAERLISI_NL YAEROUT_NL => YGFL%YAEROUT_NL @@ -646,20 +665,34 @@ SUBROUTINE SUGFL1(YDMODEL,KGFLCONF) LAEREQSAM4CLIM=.FALSE. LAERRESUSPENSION=.FALSE. LAERSOA=.FALSE. +!LH LINJ=.FALSE. LAERSOA_COUPLED=.FALSE. LAERNUCL=.TRUE. KGHG_CHEMTEND_CH4=0_JPIM ! AERO_SCHEME="aer" + + +! M7CTL namelist, not sure where needed +NWATER=1 +NSNUCL=2 +NONUCL=1 + + ! WRITE(NULOUT,*) ' BEFORE READ NAMCOMP ' IF (NCHEM+NGHG+NAERO > 0 ) THEN CALL POSNAM(NULNAM,'NAMCOMPO') READ(NULNAM,NAMCOMPO) + IF (trim(AERO_SCHEME) == 'hamm7' ) THEN + CALL POSNAM(NULNAM,'NAMM7CTL') !Read only if AERO_SCHEME=hamm7 + READ(NULNAM,NAMM7CTL) + ENDIF + AERO_SCHEME_OP_OBS = AERO_SCHEME - WRITE(NULOUT,'(11(A,L2),A,I2)')& + WRITE(NULOUT,'(12(A,L2),A,I2)')& & ' LCHEM_DIA=',LCHEM_DIA,& & ' LCHEM_DDFLX=',LCHEM_DDFLX,& & ' LCOMPO_DDFLX_DIR=',LCOMPO_DDFLX_DIR,& diff --git a/ifs-source/arpifs/setup/sugfl2.F90 b/ifs-source/arpifs/setup/sugfl2.F90 index 5779467b..3ab8ea88 100644 --- a/ifs-source/arpifs/setup/sugfl2.F90 +++ b/ifs-source/arpifs/setup/sugfl2.F90 @@ -114,6 +114,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & YMXL_NL=>YGFL%YMXL_NL, NUVP=>YGFL%NUVP, YUVP_NL=>YGFL%YUVP_NL, & & YRKTQC_NL=>YGFL%YRKTQC_NL, LTRCMFMG=>YGFL%LTRCMFMG, YO3_NL=>YGFL%YO3_NL, & & YL_NL=>YGFL%YL_NL, YLRCH4_NL=>YGFL%YLRCH4_NL, YCOMP=>YGFL%YCOMP, & + & YCDNC_NL=>YGFL%YCDNC_NL, YICNC_NL=>YGFL%YICNC_NL, YRE_LIQ_NL=>YGFL%YRE_LIQ_NL, YRE_ICE_NL=>YGFL%YRE_ICE_NL, & !eehol: added cloud prop & YQVA_NL=>YGFL%YQVA_NL, YS_NL=>YGFL%YS_NL, YA_NL=>YGFL%YA_NL, NNOGW=>YGFL%NNOGW, & & YDOM_NL=>YGFL%YDOM_NL, YSLDIA_NL=>YGFL%YSLDIA_NL, YAERO_NL=>YGFL%YAERO_NL, & & YFQTUR_NL=>YGFL%YFQTUR_NL, YSDSAT_NL=>YGFL%YSDSAT_NL, YLRAD_NL=>YGFL%YLRAD_NL, & @@ -144,7 +145,7 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & NFSD=>YGFL%NFSD, YFSD=>YGFL%YFSD, YFSD_NL=>YGFL%YFSD_NL, & & NEDRP=>YGFL%NEDRP, YEDRP=>YGFL%YEDRP, YEDRP_NL=>YGFL%YEDRP_NL, & & YLIMA_NL=>YDML_GCONF%YGFL%YLIMA_NL, NLIMA=>YDML_GCONF%YGFL%NLIMA, & - & NEMIS3D_DESC=>YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC=>YDCOMPO%YEMIS3D_DESC) + & NEMIS3D_DESC=>YDCOMPO%NEMIS3D_DESC, YEMIS3D_DESC=>YDCOMPO%YEMIS3D_DESC, AERO_SCHEME=>YDCOMPO%AERO_SCHEME) !------------------------------------------------------------------------- ! 1.1 Initial settings. @@ -256,6 +257,22 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) INCR=INCR+1 YGFL%YFSD => YGFL%YCOMP(JPGFL-INCR) INCR=INCR+1 + + !--> eehol: added cdnc,icnc,liq and ice eff rad + IF(TRIM(AERO_SCHEME)=="hamm7") THEN + YGFL%YCDNC => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YICNC => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YRE_LIQ => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + YGFL%YRE_ICE => YGFL%YCOMP(JPGFL-INCR) + INCR = INCR+1 + ENDIF + !<-- eehol + + + ! * Groups of multiple GFL variables: ! (order should be the same in parts 1.1, 1.2 and 1.3). IF (NGFL_EXT == 0) THEN @@ -758,6 +775,57 @@ SUBROUTINE SUGFL2(YDEPHY,YDML_GCONF,YDCOMPO) & LDERS=LLDERS,LD5=LL5,LDT1=.FALSE.,LDGPINGP=.TRUE.,& & LDTRAJIO=.FALSE.) ENDIF + + + !eehol: define cloud properties + IF(TRIM(AERO_SCHEME)=="hamm7") THEN + IF (YCDNC_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YCDNC=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YGFL, YDCOMP=YGFL%YCDNC, CDNAME=YCDNC_NL%CNAME, & + & KGRIB=YCDNC_NL%IGRBCODE, LDGP=.TRUE., & + & KREQIN=YCDNC_NL%NREQIN, & + & PREFVALI=YCDNC_NL%REFVALI,LDREQOUT=YCDNC_NL%LREQOUT, & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,& + & LDCONV=.FALSE., LDMASSFIX=.FALSE.) + END IF + IF (YICNC_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YICNC=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YGFL, YDCOMP=YGFL%YICNC, CDNAME=YICNC_NL%CNAME, & + & KGRIB=YICNC_NL%IGRBCODE, LDGP=.TRUE., & + & KREQIN=YICNC_NL%NREQIN, & + & PREFVALI=YICNC_NL%REFVALI, LDREQOUT=YICNC_NL%LREQOUT, & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,& + & LDCONV=.FALSE., LDMASSFIX=.FALSE.) + END IF + IF (YRE_LIQ_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YRE_LIQ=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YRE_LIQ,CDNAME=YRE_LIQ_NL%CNAME,& + & KGRIB=YRE_LIQ_NL%IGRBCODE,LDGP=.TRUE., & + & KREQIN=YRE_LIQ_NL%NREQIN,& + & PREFVALI=YRE_LIQ_NL%REFVALI,LDREQOUT=YRE_LIQ_NL%LREQOUT,& +! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDMASSFIX=.FALSE.) + END IF + IF (YRE_ICE_NL%LGP) THEN + IGFLPTR=NUMFLDS+1 + YGFL%YRE_ICE=>YGFL%YCOMP(IGFLPTR) + CALL DEFINE_GFL_COMP(YGFL,YDCOMP=YGFL%YRE_ICE,CDNAME=YRE_ICE_NL%CNAME,& + & KGRIB=YRE_ICE_NL%IGRBCODE,LDGP=.TRUE., & + & KREQIN=YRE_ICE_NL%NREQIN,& + & PREFVALI=YRE_ICE_NL%REFVALI,LDREQOUT=YRE_ICE_NL%LREQOUT,& +! & LDERS=.FALSE.,LD5=.FALSE.,LDT1=LLT1,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDERS=.FALSE.,LD5=.FALSE.,LDT1=.FALSE.,LDDIFF=.FALSE.,LDCONV=.FALSE., & + & LDMASSFIX=.FALSE.) + END IF + END IF + !eehol + + + ! Extra GFL variables ! - do a preliminary test to see if, when there are extra-GFL and when at ! least one of them is a grid-point one, there is no extra-GFL which is diff --git a/ifs-source/arpifs/setup/sugfl3.F90 b/ifs-source/arpifs/setup/sugfl3.F90 index 13e48a81..8e5d04e4 100644 --- a/ifs-source/arpifs/setup/sugfl3.F90 +++ b/ifs-source/arpifs/setup/sugfl3.F90 @@ -98,7 +98,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('SUGFL3',0,ZHOOK_HANDLE) ASSOCIATE(YDDYN=>YDMODEL%YRML_DYN%YRDYN,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA) + & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA,YDCOMPO=>YDMODEL%YRML_CHEM%YRCOMPO) ASSOCIATE(LSPLTHOIGFL=>YDDYN%LSPLTHOIGFL,LPC_FULL=>YDDYNA%LPC_FULL,LPC_CHEAP=>YDDYNA%LPC_CHEAP, & & YAERO=>YGFL%YAERO, YSRC=>YGFL%YSRC, YCVGQ=>YGFL%YCVGQ, & & YMXL_NL=>YGFL%YMXL_NL, NUVP=>YGFL%NUVP, YCPF=>YGFL%YCPF, & @@ -106,6 +106,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & LTRCMFMG=>YGFL%LTRCMFMG, YFQTUR=>YGFL%YFQTUR, & & YO3_NL=>YGFL%YO3_NL, YSLDIA=>YGFL%YSLDIA, YFORC=>YGFL%YFORC, & & YL_NL=>YGFL%YL_NL, YLRCH4_NL=>YGFL%YLRCH4_NL, YTKE=>YGFL%YTKE, & + & YCDNC_NL=>YGFL%YCDNC_NL, YICNC_NL=>YGFL%YICNC_NL, YRE_LIQ_NL=>YGFL%YRE_LIQ_NL, YRE_ICE_NL=>YGFL%YRE_ICE_NL, & !eehol: add cloud prop & YNOGW=>YGFL%YNOGW, YCOMP=>YGFL%YCOMP, YQVA_NL=>YGFL%YQVA_NL, & & YSLDIA_NL=>YGFL%YSLDIA_NL, YUEN=>YGFL%YUEN, YEZDIAG=>YGFL%YEZDIAG, & & YERA40=>YGFL%YERA40, YFQTUR_NL=>YGFL%YFQTUR_NL, YS_NL=>YGFL%YS_NL, & @@ -116,6 +117,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & YGHG=>YGFL%YGHG, YCPF_NL=>YGFL%YCPF_NL, NNEGAFIX=>YGFL%NNEGAFIX, & & YLCONV_NL=>YGFL%YLCONV_NL, YRCONV_NL=>YGFL%YRCONV_NL, & & NMFIXFLDS=>YGFL%NMFIXFLDS, YLRCH4=>YGFL%YLRCH4, YDOM=>YGFL%YDOM, & + & YCDNC=>YGFL%YCDNC, YICNC=>YGFL%YICNC, YRE_LIQ=>YGFL%YRE_LIQ, YRE_ICE=>YGFL%YRE_ICE, & !eehol: add cloud prop & YAERAOT_NL=>YGFL%YAERAOT_NL, YAERLISI_NL=>YGFL%YAERLISI_NL, & & YAEROUT_NL=>YGFL%YAEROUT_NL, YSCONV_NL=>YGFL%YSCONV_NL, YFSTUR=>YGFL%YFSTUR, & & YUNEBH=>YGFL%YUNEBH, YAEROCLIM_NL=>YGFL%YAEROCLIM_NL, & @@ -155,7 +157,7 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & LEPHYS=>YDEPHY%LEPHYS, YLIMA=>YGFL%YLIMA, YLIMA_NL=>YGFL%YLIMA_NL, NLIMA=>YGFL%NLIMA, & & NFSD=>YGFL%NFSD, YFSD=>YGFL%YFSD,YFSD_NL=>YGFL%YFSD_NL, & & NEDRP=>YGFL%NEDRP, YEDRP=>YGFL%YEDRP,YEDRP_NL=>YGFL%YEDRP_NL, & - & LAERAOT=>YGFL%LAERAOT,LAERLISI=>YGFL%LAERLISI,YPHYCTY=>YGFL%YPHYCTY,YPHYCTY_NL=>YGFL%YPHYCTY_NL) + & LAERAOT=>YGFL%LAERAOT,LAERLISI=>YGFL%LAERLISI,YPHYCTY=>YGFL%YPHYCTY,YPHYCTY_NL=>YGFL%YPHYCTY_NL,AERO_SCHEME=>YDCOMPO%AERO_SCHEME) ! ------------------------------------------------------------------ !* 1. SET GFL ATTRIBUTES @@ -942,6 +944,22 @@ SUBROUTINE SUGFL3(YDDIMV,YDMODEL) & PREFVALC=YAEROUT_NL(JGFL)%REFVALC) ENDDO +! Aerosol-cloud interaction fields +IF (TRIM(AERO_SCHEME)=="hamm7" )THEN + IF (YCDNC%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YCDNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF + IF (YICNC%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YICNC, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF + IF (YRE_LIQ%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_LIQ, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF + IF (YRE_ICE%LACTIVE) THEN + CALL SET_GFL_ATTR(YDDIMV, YGFL, YRE_ICE, LDADV=.FALSE., LDT9=.FALSE., LDPHY=.FALSE.) + END IF +END IF + ! * NAEROCLIM fields: aerosol 3D input fields used for ECMWF applications DO JGFL=1,NAEROCLIM LLPT = .FALSE. diff --git a/ifs-source/arpifs/setup/sumcc.F90 b/ifs-source/arpifs/setup/sumcc.F90 index fd3974f6..2bc0ee44 100644 --- a/ifs-source/arpifs/setup/sumcc.F90 +++ b/ifs-source/arpifs/setup/sumcc.F90 @@ -81,7 +81,7 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LOGICAL, POINTER :: LCURR, LGELATO, LMCC01_MSE, LMCC01, LMCC02, LMCC03, LMCC04, & & LMCC05, LMCCEC, LMCCIEC, LMCCICEIC, LNEMOCOUP, LNEMOFLUXNC, LNEMO1WAY, & & LMCCDYNSEAICE, LNEMOLIMGET, LNEMOLIMPUT, LNEMOLIMALB, LNEMOLIMTEMP, & - & LNEMOLIMTHK, LMULTIYR, LMCC_COMPO, LNEMOATMFLDS, LNEMOIFSLOG, LNEMOSSTFREEZ,& + & LNEMOLIMTHK, LMULTIYR, LMCC_COMPO, LMCCIEC_COMPO, LMCCIEC_AERCLIM, LNEMOATMFLDS, LNEMOIFSLOG, LNEMOSSTFREEZ,& & LNEMOLIMTLVL, LESICE, LNEMOOCEICEMIX,LNEMOQNSICEFILT, LNEMOSICOUP, LNEMOGRIBFLDS,& & LNEMOPARTCOUP,LNEMOPARTMASK,LNEMOPARTMASKFILE,LNEMOGRIB3D,LNEMOGRIBMASK, L2DECV2NEMO,& & LNEMOOUTGRB,LCOUPINFOUT @@ -95,7 +95,6 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) ! ---------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('SUMCC',0,ZHOOK_HANDLE) -ASSOCIATE(LMCCIEC_COMPO=>YDMCC%LMCCIEC_COMPO) ! Associate pointers for variables in namelist LCURR => YDMCC%LCURR LGELATO => YDMCC%LGELATO @@ -128,6 +127,8 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LNEMOQNSICEFILT=>YDMCC%LNEMOQNSICEFILT LMULTIYR => YDMCC%LMULTIYR LMCC_COMPO => YDMCC%LMCC_COMPO +LMCCIEC_COMPO => YDMCC%LMCCIEC_COMPO +LMCCIEC_AERCLIM => YDMCC%LMCCIEC_AERCLIM LNEMOATMFLDS => YDMCC%LNEMOATMFLDS LNEMOIFSLOG => YDMCC%LNEMOIFSLOG NSSTICEOP => YDMCC%NSSTICEOP @@ -178,7 +179,8 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) LMCCDYNSEAICE= .FALSE. LNEMOGRIBFLDS=.FALSE. LMULTIYR=.FALSE. -LMCCIEC_COMPO= .FALSE. +LMCCIEC_COMPO= .FALSE. ! Daily emissions not interpolated in time +LMCCIEC_AERCLIM= .TRUE. ! Monthly climatology interpolated in time LMCC_COMPO=.FALSE. NSSTICEOP=9 LNEMOGRIB3D=.FALSE. @@ -299,6 +301,5 @@ SUBROUTINE SUMCC(YDMCC,YDEPHY,KULOUT) ENDIF ! ---------------------------------------------------------------- -END ASSOCIATE IF (LHOOK) CALL DR_HOOK('SUMCC',1,ZHOOK_HANDLE) END SUBROUTINE SUMCC diff --git a/ifs-source/arpifs/setup/sumcclag.F90 b/ifs-source/arpifs/setup/sumcclag.F90 index 74a24cb1..db9486f6 100644 --- a/ifs-source/arpifs/setup/sumcclag.F90 +++ b/ifs-source/arpifs/setup/sumcclag.F90 @@ -9,7 +9,7 @@ ! (C) Copyright 1989- Meteo-France. ! -SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KULOUT,YDSURF) +SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KULOUT,YDSURF, NFLEVG) !**** *SUMCCLAG* * - ROUTINE TO INITIALIZE SWITCHES FOR THE CLIMATE VERSION @@ -91,7 +91,8 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU TYPE(TEPHY) , INTENT(INOUT) :: YDEPHY INTEGER(KIND=JPIM) , INTENT(IN) :: KULOUT TYPE(TSURF) , OPTIONAL, INTENT(IN) :: YDSURF -INTEGER(KIND=JPIM) :: IOPROC, ISTEP, ITIM, IT, IC, ICHEMFLX +INTEGER(KIND=JPIM) , OPTIONAL, INTENT(IN) :: NFLEVG +INTEGER(KIND=JPIM) :: IOPROC, ISTEP, ITIM, IT, IC, ICHEMFLX,ITIM_AERCLIM REAL(KIND=JPHOOK) :: ZHOOK_HANDLE LOGICAL :: LLP, LLELAIV, LLMODISALBEDO @@ -103,32 +104,41 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU #include "su_coup_com.intfb.h" IF (LHOOK) CALL DR_HOOK('SUMCCLAG',0,ZHOOK_HANDLE) -ASSOCIATE(NACTAERO=>YDML_GCONF%YGFL%NACTAERO, NCHEM=>YDML_GCONF%YGFL%NCHEM, YCHEM=>YDML_GCONF%YGFL%YCHEM, & - & NGHG=>YDML_GCONF%YGFL%NGHG, LAERCHEM=>YDML_GCONF%YGFL%LAERCHEM, & - & NEMIS2D_DESC=>YDCOMPO%NEMIS2D_DESC, YEMIS2D_DESC=>YDCOMPO%YEMIS2D_DESC, & - & NEMIS2D=>YDML_GCONF%YGFL%NEMIS2D, & - & NEMIS2DAUX=>YDML_GCONF%YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC=>YDCOMPO%YEMIS2DAUX_DESC, & - & AERO_SCHEME=>YDCOMPO%AERO_SCHEME, & - & NDMSO=>YDEAERSRC%NDMSO, LOCNDMS=>YDEAERSRC%LOCNDMS, & - & NALBEDOSCHEME=>YDEPHY%NALBEDOSCHEME, LECURR=>YDEPHY%LECURR, & - & NGPTOT=>YDGEM%NGPTOT, & - & LMCC03=>YDML_AOC%YRMCC%LMCC03, & - & LMCC04=>YDML_AOC%YRMCC%LMCC04, LMCC05=>YDML_AOC%YRMCC%LMCC05, LMCCEC=>YDML_AOC%YRMCC%LMCCEC, & - & LMCCIEC=>YDML_AOC%YRMCC%LMCCIEC, LMCCIEC_COMPO=>YDML_AOC%YRMCC%LMCCIEC_COMPO, & - & LMCC_COMPO=>YDML_AOC%YRMCC%LMCC_COMPO, LNEMO1WAY=>YDML_AOC%YRMCC%LNEMO1WAY, & - & LNEMOCOUP=>YDML_AOC%YRMCC%LNEMOCOUP, LNEMOLIMGET=>YDML_AOC%YRMCC%LNEMOLIMGET, & - & LNEMOLIMPUT=>YDML_AOC%YRMCC%LNEMOLIMPUT, NCLIGC=>YDML_AOC%YRMCC%NCLIGC, & - & NCLIGC_COMPO=>YDML_AOC%YRMCC%NCLIGC_COMPO,NYSDMP_COMPO=>YDML_AOC%YRMCC%NYSDMP_COMPO, NCLIMR=>YDML_AOC%YRMCC%NCLIMR, & - & NCLIMR_COMPO=>YDML_AOC%YRMCC%NCLIMR_COMPO, NCLIMTOT=>YDML_AOC%YRMCC%NCLIMTOT, & - & NDIFC=>YDML_AOC%YRMCC%NDIFC, NDIFC_COMPO=>YDML_AOC%YRMCC%NDIFC_COMPO, NFRCPL=>YDML_AOC%YRMCC%NFRCPL, & - & NJDCR=>YDML_AOC%YRMCC%NJDCR, NJDCR1=>YDML_AOC%YRMCC%NJDCR1, NJDCR1_COMPO=>YDML_AOC%YRMCC%NJDCR1_COMPO, & - & NJDCR_COMPO=>YDML_AOC%YRMCC%NJDCR_COMPO, NOACOMM=>YDML_AOC%YRMCC%NOACOMM, NP1=>YDML_AOC%YRMCC%NP1, & - & NP2=>YDML_AOC%YRMCC%NP2, NPCOMPO_1=>YDML_AOC%YRMCC%NPCOMPO_1, NPCOMPO_2=>YDML_AOC%YRMCC%NPCOMPO_2, & - & NSTOP=>YDML_GCONF%YRRIP%NSTOP, TSTEP=>YDML_GCONF%YRRIP%TSTEP,& - & NPCO2_1=>YDML_AOC%YRMCC%NPCO2_1, NPCO2_2=>YDML_AOC%YRMCC%NPCO2_2, LEOCLAKE=>YDEPHY%LEOCLAKE, & - & LEOBC=>YDEPHY%LEOBC, LEOBCICE=>YDEPHY%LEOBCICE, & - & KCHEM_DRYDEP=>YDCHEM%KCHEM_DRYDEP, & - & LNEEONLINE=>YDEPHY%LNEEONLINE, YDCOM=>YDML_AOC%YRCOM, YDMCC=>YDML_AOC%YRMCC) +ASSOCIATE(& + & NACTAERO => YDML_GCONF%YGFL%NACTAERO, NCHEM => YDML_GCONF%YGFL%NCHEM, & + & YCHEM => YDML_GCONF%YGFL%YCHEM, NGHG => YDML_GCONF%YGFL%NGHG, & + & LAERCHEM => YDML_GCONF%YGFL%LAERCHEM, NEMIS2D_DESC => YDCOMPO%NEMIS2D_DESC, & + & YEMIS2D_DESC => YDCOMPO%YEMIS2D_DESC, NEMIS2D => YDML_GCONF%YGFL%NEMIS2D, & + & NEMIS2DAUX => YDML_GCONF%YGFL%NEMIS2DAUX, YEMIS2DAUX_DESC => YDCOMPO%YEMIS2DAUX_DESC, & + & AERO_SCHEME => YDCOMPO%AERO_SCHEME, NDMSO => YDEAERSRC%NDMSO, & + & LOCNDMS => YDEAERSRC%LOCNDMS, NALBEDOSCHEME => YDEPHY%NALBEDOSCHEME, & + & LECURR => YDEPHY%LECURR, NGPTOT => YDGEM%NGPTOT, & + & LMCC03 => YDML_AOC%YRMCC%LMCC03, LMCC04 => YDML_AOC%YRMCC%LMCC04, & + & LMCC05 => YDML_AOC%YRMCC%LMCC05, LMCCEC => YDML_AOC%YRMCC%LMCCEC, & + & LMCCIEC => YDML_AOC%YRMCC%LMCCIEC, LMCCIEC_COMPO => YDML_AOC%YRMCC%LMCCIEC_COMPO, & + & LMCCIEC_AERCLIM => YDML_AOC%YRMCC%LMCCIEC_AERCLIM, & + & LMCC_COMPO => YDML_AOC%YRMCC%LMCC_COMPO, LNEMO1WAY => YDML_AOC%YRMCC%LNEMO1WAY, & + & LNEMOCOUP => YDML_AOC%YRMCC%LNEMOCOUP, LNEMOLIMGET => YDML_AOC%YRMCC%LNEMOLIMGET, & + & LNEMOLIMPUT => YDML_AOC%YRMCC%LNEMOLIMPUT, NCLIGC => YDML_AOC%YRMCC%NCLIGC, & + & NCLIGC_COMPO => YDML_AOC%YRMCC%NCLIGC_COMPO, NYSDMP_COMPO => YDML_AOC%YRMCC%NYSDMP_COMPO, & + & NCLIMR => YDML_AOC%YRMCC%NCLIMR, NCLIMR_COMPO => YDML_AOC%YRMCC%NCLIMR_COMPO, & + & NCLIMTOT => YDML_AOC%YRMCC%NCLIMTOT, NDIFC => YDML_AOC%YRMCC%NDIFC, & + & NDIFC_COMPO => YDML_AOC%YRMCC%NDIFC_COMPO, NFRCPL => YDML_AOC%YRMCC%NFRCPL, & + & NJDCR => YDML_AOC%YRMCC%NJDCR, NJDCR1 => YDML_AOC%YRMCC%NJDCR1, & + & NJDCR1_COMPO => YDML_AOC%YRMCC%NJDCR1_COMPO, NJDCR_COMPO => YDML_AOC%YRMCC%NJDCR_COMPO, & + & NOACOMM => YDML_AOC%YRMCC%NOACOMM, NP1 => YDML_AOC%YRMCC%NP1, & + & NP2 => YDML_AOC%YRMCC%NP2, NPCOMPO_1 => YDML_AOC%YRMCC%NPCOMPO_1, & + & NPCOMPO_2 => YDML_AOC%YRMCC%NPCOMPO_2, NSTOP => YDML_GCONF%YRRIP%NSTOP, & + & TSTEP => YDML_GCONF%YRRIP%TSTEP, NPCO2_1 => YDML_AOC%YRMCC%NPCO2_1, & + & NPCO2_2 => YDML_AOC%YRMCC%NPCO2_2, LEOCLAKE => YDEPHY%LEOCLAKE, & + & LEOBC => YDEPHY%LEOBC, LEOBCICE => YDEPHY%LEOBCICE, & + & KCHEM_DRYDEP => YDCHEM%KCHEM_DRYDEP, LNEEONLINE => YDEPHY%LNEEONLINE, & + & YDCOM => YDML_AOC%YRCOM, YDMCC => YDML_AOC%YRMCC, & + & NSO4SCHEME => YDEAERSRC%NSO4SCHEME, NYSDMP_AERCLIM => YDML_AOC%YRMCC%NYSDMP_AERCLIM,& + & NPAERCLIM_1 => YDML_AOC%YRMCC%NPAERCLIM_1, NPAERCLIM_2 => YDML_AOC%YRMCC%NPAERCLIM_2, & + & NCLIGC_AERCLIM=>YDML_AOC%YRMCC%NCLIGC_AERCLIM, NAEROCLIM => YDML_GCONF%YGFL%NAEROCLIM, & + & YAEROCLIM_NL =>YDML_GCONF%YGFL%YAEROCLIM_NL) + ! ---------------------------------------------------------------- !* 1. CALCULATIONS. @@ -365,7 +375,7 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU WRITE(NULOUT,*) 'OCEANBC ALLOCATED' ENDIF -! naj set up mechanism to read in emissions and dry deposition fields during model run for COMPO (AER AND CHEM) + ! Set up mechanism to read in emissions fields during model run for COMPO (AER AND CHEM) IF (LMCC_COMPO) THEN IF (LMCCIEC_COMPO) THEN ! Emissions etc. interpolated in time NPCOMPO_1=1 @@ -380,6 +390,7 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU NCLIMR_COMPO=0 IC=0 + ! Species in NCLIMR_COMPO are added in an specific order, the order of YDSURF derived type. DO IT=1,NEMIS2D IF ( ANY( YEMIS2D_DESC(1:NEMIS2D_DESC)%PARAM_INDEX==IT .AND. & & YEMIS2D_DESC(1:NEMIS2D_DESC)%TEMPORALITY /= "Constant" ) ) THEN @@ -445,17 +456,52 @@ SUBROUTINE SUMCCLAG(YDGEM,YDML_GCONF,YDML_AOC,YDCOMPO,YDCHEM,YDEAERSRC,YDEPHY,KU NJDCR1_COMPO=-999 -! allocate communication array + ! allocate communication array ALLOCATE(YDMCC%CLIMRCOMPO(NGPTOT,ITIM,NCLIMR_COMPO)) WRITE(KULOUT,"(1X,'ARRAY ',A10,' ALLOCATED ',8I8)")& & 'CLIMRCOMPO ',SIZE(YDMCC%CLIMRCOMPO),SHAPE(YDMCC%CLIMRCOMPO) WRITE(KULOUT,"(1X,A20)") ' EXPECTED ORDER ' - DO IT=1,NCLIMR_COMPO + DO IT=1,NCLIMR_COMPO WRITE(KULOUT,"(1X,3I10)") IT, NCLIGC_COMPO(IT), NYSDMP_COMPO(IT) ENDDO + ! Add stuff associated to 3D SO2 oxidants climatology + IF( NSO4SCHEME == 2 ) THEN + + IF (NAEROCLIM == 0) THEN + CALL ABOR1('SUMCCLAG: "NSO4SCHEME == 2" requires SO2 oxidants') + ENDIF + + IF (LMCCIEC_AERCLIM) THEN !THE 3D fields ARE INTERPOLATED IN TIME + NPAERCLIM_1=1 + NPAERCLIM_2=2 + ITIM_AERCLIM=2 + ELSE !THE FLUXES ARE NOT INTERPOLATED IN TIME + NPAERCLIM_1=1 + NPAERCLIM_2=NPAERCLIM_1 + ITIM_AERCLIM=1 + ENDIF + + DO IT=1,NAEROCLIM + NCLIGC_AERCLIM(IT) = YAEROCLIM_NL(IT)%IGRBCODE + NYSDMP_AERCLIM(IT) = YDML_GCONF%YGFL%YAEROCLIM(IT)%MP + ENDDO + + ! allocate communication array + ALLOCATE(YDML_AOC%YRMCC%CLIMRAER(NGPTOT,NFLEVG,ITIM_AERCLIM,NAEROCLIM)) + + WRITE(KULOUT,"(1X,'ARRAY ',A10,' ALLOCATED ',10I8)")& + & 'CLIMRAER ',SIZE(YDML_AOC%YRMCC%CLIMRAER),SHAPE(YDML_AOC%YRMCC%CLIMRAER) + + WRITE(KULOUT,"(1X,A20)") ' EXPECTED ORDER ' + DO IT=1,NAEROCLIM + WRITE(KULOUT,"(1X,3I10)") IT, NCLIGC_AERCLIM(IT), NYSDMP_AERCLIM(IT) + ENDDO + + ENDIF + ENDIF ! Composition part ENDIF ! END BOUNDARY CONDITIONS UPDATED BY ECMWF ROUTINES diff --git a/ifs-source/arpifs/utility/updtim.F90 b/ifs-source/arpifs/utility/updtim.F90 index 3bf8b34c..2fae145b 100644 --- a/ifs-source/arpifs/utility/updtim.F90 +++ b/ifs-source/arpifs/utility/updtim.F90 @@ -9,7 +9,7 @@ ! (C) Copyright 1989- Meteo-France. ! -SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC,PI05) +SUBROUTINE UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC,PI05) !**** *UPDTIM* - UPDATE TIME OF THE MODEL @@ -96,6 +96,7 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC ! R Hogan (Jan 2019) Removed stuff for old cycle 15 radiation scheme ! ------------------------------------------------------------------ +USE FIELDS_MOD , ONLY : FIELDS USE TYPE_MODEL , ONLY : MODEL USE GEOMETRY_MOD , ONLY : GEOMETRY USE SURFACE_FIELDS_MIX , ONLY : TSURF @@ -119,7 +120,9 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC IMPLICIT NONE TYPE(GEOMETRY) ,INTENT(IN) :: YDGEOMETRY -TYPE(TSURF) ,INTENT(INOUT) :: YDSURF + +!TYPE(TSURF) ,INTENT(INOUT) :: YDSURF +TYPE(FIELDS), INTENT(INOUT) :: YDFIELDS TYPE(MODEL) ,INTENT(INOUT) :: YDMODEL INTEGER(KIND=JPIM) ,INTENT(IN) :: KSTEP REAL(KIND=JPRB) ,INTENT(IN) :: PTDT @@ -177,27 +180,32 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC #include "updrgas.intfb.h" #include "su_aervole.intfb.h" #include "updclie_compo.intfb.h" +#include "updclie_aerclim.intfb.h" #include "fctast.func.h" #include "fcttim.func.h" #include "fcttrm.func.h" #include "updcal.intfb.h" +#include "cmip_strato_aero.intfb.h" + ! ------------------------------------------------------------------ IF (LHOOK) CALL DR_HOOK('UPDTIM',0,ZHOOK_HANDLE) ASSOCIATE(YDDIM=>YDGEOMETRY%YRDIM,YDDIMV=>YDGEOMETRY%YRDIMV,YDGEM=>YDGEOMETRY%YRGEM, YDMP=>YDGEOMETRY%YRMP, & & YDPHY=>YDMODEL%YRML_PHY_MF%YRPHY,YDEAERVOL=>YDMODEL%YRML_PHY_AER%YREAERVOL,YDMCC=>YDMODEL%YRML_AOC%YRMCC, & - & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDDPHY=>YDMODEL%YRML_PHY_G%YRDPHY,YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & - & YDARPHY=>YDMODEL%YRML_PHY_MF%YRARPHY,YDEUVRAD=>YDMODEL%YRML_PHY_RAD%YREUVRAD,YDERIP=>YDMODEL%YRML_PHY_RAD%YRERIP, & - & YDEPHLI=>YDMODEL%YRML_PHY_SLIN%YREPHLI,YDPHY3=>YDMODEL%YRML_PHY_MF%YRPHY3,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & - & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & - & YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA) + & YDRIP=>YDMODEL%YRML_GCONF%YRRIP,YDDPHY=>YDMODEL%YRML_PHY_G%YRDPHY,YDERAD=>YDMODEL%YRML_PHY_RAD%YRERAD, & + & YDARPHY=>YDMODEL%YRML_PHY_MF%YRARPHY,YDEUVRAD=>YDMODEL%YRML_PHY_RAD%YREUVRAD,YDERIP=>YDMODEL%YRML_PHY_RAD%YRERIP, & + & YDEPHLI=>YDMODEL%YRML_PHY_SLIN%YREPHLI,YDPHY3=>YDMODEL%YRML_PHY_MF%YRPHY3,YDPHY2=>YDMODEL%YRML_PHY_MF%YRPHY2, & + & YDEAERSRC=>YDMODEL%YRML_PHY_AER%YREAERSRC,YGFL=>YDMODEL%YRML_GCONF%YGFL,YDEPHY=>YDMODEL%YRML_PHY_EC%YREPHY, & + & YDERDI=>YDMODEL%YRML_PHY_RAD%YRERDI, YDSIMPHL=>YDMODEL%YRML_PHY_MF%YRSIMPHL,YDDYNA=>YDMODEL%YRML_DYN%YRDYNA, & + & YDSURF=>YDFIELDS%YRSURF, YDGFL=> YDFIELDS%YRGFL) ASSOCIATE(NAERO=>YGFL%NAERO, & & NSMAX=>YDDIM%NSMAX, & & NFLEVG=>YDDIMV%NFLEVG, & & NTSSG=>YDDPHY%NTSSG, & & RCODECA=>YDEAERSRC%RCODECA, RCOVSRA=>YDEAERSRC%RCOVSRA, & & RSIDECA=>YDEAERSRC%RSIDECA, RSIVSRA=>YDEAERSRC%RSIVSRA, & + & NSO4SCHEME=>YDEAERSRC%NSO4SCHEME, & & NVOLERUP=>YDEAERVOL%NVOLERUP, & & LPHYLIN=>YDEPHLI%LPHYLIN, & & LEO3CH=>YDEPHY%LEO3CH, LEOCML=>YDEPHY%LEOCML, LOCMLTKE=>YDEPHY%LOCMLTKE, & @@ -239,7 +247,9 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC & LMPHYS=>YDPHY%LMPHYS, LSIMPH=>YDSIMPHL%LSIMPH, LOZONE=>YDPHY%LOZONE, & & LRAYFM=>YDPHY%LRAYFM, LRAYFM15=>YDPHY%LRAYFM15, LRAYLU=>YDPHY%LRAYLU, & & LRMU0M=>YDPHY%LRMU0M, LSOLV=>YDPHY%LSOLV, TSPHY=>YDPHY2%TSPHY, & - & RII0=>YDPHY3%RII0) + & RII0=>YDPHY3%RII0, & + & LCMIP_STRATAER_CMIP6=>YDERAD%LCMIP_STRATAER_CMIP6,& + & LCMIP_STRATAER_CMIP7=>YDERAD%LCMIP_STRATAER_CMIP7) ! ------------------------------------------------------------------ LLUPDECAEC=.TRUE. @@ -753,6 +763,11 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC ENDIF CALL GSTATS(1904,1) + ! CMIP6/7 stratospheric aerosols optical properties + IF (LCMIP_STRATAER_CMIP6 .OR. LCMIP_STRATAER_CMIP7) THEN + CALL CMIP_STRATO_AERO(YDMODEL,YDDYNA) + ENDIF + IF (LRMU0M) THEN ZSTATI=REAL(IZT,JPRB)+NRADFR*ITIME ZTIMTR=RTIMST+ZSTATI @@ -900,14 +915,23 @@ SUBROUTINE UPDTIM(YDGEOMETRY,YDSURF,YDMODEL,KSTEP,PTDT,PTSTEP,LDCLUPD,LDUPDECAEC ENDIF ! .NOT. LSCMEC IF(ISTASS < ITIME)THEN - -! Updates daily emissions and dry dep velocities + +! Updates daily emissions IF(.NOT.LSCMEC) THEN - IF ( LMCC_COMPO ) THEN + IF ( LMCC_COMPO.AND.LDCLUPD ) THEN CALL UPDCLIE_COMPO(YDGEOMETRY,YDDYNA,YDSURF,YDMODEL%YRML_CHEM%YRCOMPO,YDMCC,YDERAD,YDMODEL%YRML_GCONF,PTSTEP) ENDIF ENDIF + +! update climatology for SO2 oxidation + IF(.NOT.LSCMEC) THEN + IF ( NSO4SCHEME == 2 .AND.LDCLUPD) THEN + CALL UPDCLIE_AERCLIM(YDGEOMETRY,YDDYNA,YDMCC,YDGFL,YDMODEL%YRML_GCONF,PTSTEP) + ENDIF + ENDIF + + ! Updates climatology (SST) ECMWF style IF(.NOT.LSCMEC) THEN diff --git a/ifs-source/cmake/compile_flags.cmake b/ifs-source/cmake/compile_flags.cmake index 7d1a914b..8423e5ef 100644 --- a/ifs-source/cmake/compile_flags.cmake +++ b/ifs-source/cmake/compile_flags.cmake @@ -312,7 +312,7 @@ elseif(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") endif() string(CONCAT IFS_Fortran_FLAGS "${IFS_Fortran_FLAGS} ${IFS_GNU64_FLAG} " - "-fconvert=big-endian -fPIC -fopenmp " + "-fconvert=big-endian -fPIC -fopenmp -Wunused " "-fno-range-check -ffree-line-length-none -fbacktrace -fno-second-underscore " "-ffpe-trap=invalid,zero,overflow -fconvert=swap") diff --git a/ifs-source/cmake/intfb.cmake b/ifs-source/cmake/intfb.cmake index 11d570c3..04936225 100644 --- a/ifs-source/cmake/intfb.cmake +++ b/ifs-source/cmake/intfb.cmake @@ -31,6 +31,7 @@ if( NOT TARGET arpifs_intfb ) arpifs/glomap_mode arpifs/interpol arpifs/kalman + arpifs/m7 arpifs/mwave arpifs/nemo arpifs/obs_error diff --git a/ifs-source/radiation/module/radiation_aerosol.F90 b/ifs-source/radiation/module/radiation_aerosol.F90 index 71feef94..226c94ac 100644 --- a/ifs-source/radiation/module/radiation_aerosol.F90 +++ b/ifs-source/radiation/module/radiation_aerosol.F90 @@ -79,7 +79,7 @@ end subroutine allocate_aerosol_arrays subroutine allocate_aerosol_arrays_direct(this, config, & & ncol, istartlev, iendlev) - use yomhook, only : lhook, dr_hook, jphook + use yomhook, only : lhook, dr_hook, jphook use radiation_config, only : config_type class(aerosol_type), intent(inout) :: this diff --git a/ifs-source/radiation/module/radiation_aerosol_optics.F90 b/ifs-source/radiation/module/radiation_aerosol_optics.F90 index 31dceaeb..48ff5e53 100644 --- a/ifs-source/radiation/module/radiation_aerosol_optics.F90 +++ b/ifs-source/radiation/module/radiation_aerosol_optics.F90 @@ -4,7 +4,7 @@ ! ! Author: Robin Hogan ! Email: r.j.hogan@ecmwf.int -! License: see the COPYING file for details +! License: see the COPYING file for details ! ! Modifications ! 2018-04-15 R Hogan Add "direct" option @@ -518,6 +518,101 @@ subroutine add_aerosol_optics_direct(nlev,istartcol,iendcol, & end subroutine add_aerosol_optics_direct + ! If they are provided, adds AOD, SSA, ASYM of aerosols to corresponding variables in + ! radiation module. + ! Note: + ! - Weighting of SSA, ASYM is done before calling this subroutine + ! - For LW only AOD is added + ! Original code: A.Laakso (FMI) + subroutine add_aerosol_aod_ssa_asym(ncol, nlev, istartcol, iendcol, config, aerosol, & + & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) + use parkind1, only : jprb + use radiation_io, only : nulout, nulerr, radiation_abort + use yomhook, only : lhook, dr_hook, jphook + use radiation_config, only : config_type + use radiation_aerosol, only : aerosol_type + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of model levels + integer, intent(in) :: istartcol, iendcol ! range of columns to process + type(config_type), intent(in), target :: config + type(aerosol_type), intent(in) :: aerosol + real(jprb), dimension(config%n_g_lw,nlev,istartcol:iendcol), & + & intent(inout) :: od_lw + real(jprb), dimension(config%n_g_lw_if_scattering,nlev,istartcol:iendcol), & + & intent(inout) :: ssa_lw, g_lw + real(jprb), dimension(config%n_g_sw,nlev,istartcol:iendcol), & + & intent(inout) :: od_sw, ssa_sw + real(jprb), dimension(config%n_g_sw,nlev,istartcol:iendcol), & + & intent(inout) :: g_sw + ! Loop indices for column, level, g point, band and aerosol type + integer :: jcol, jlev, jg, jtype, iband + real(jphook) :: hook_handle, temp_remove + + ! Range of levels over which aerosols are present + integer :: istartlev, iendlev + + if (.not. aerosol%is_direct) return + if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',0,hook_handle) + + istartlev = lbound(aerosol%od_sw,2) + iendlev = ubound(aerosol%od_sw,2) + + if (config%do_sw) then + ! Loop over position + do jlev = istartlev,iendlev + do jcol = istartcol,iendcol + + ! Weighting - only for existing aerosols + do jg = 1,config%n_g_sw + iband=config%i_band_from_reordered_g_sw(jg) + IF (aerosol%od_sw(iband,jlev,jcol) > 0.0_jprb) THEN + g_sw(jg,jlev,jcol) = g_sw(jg,jlev,jcol)*ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & + +aerosol%g_sw(iband,jlev,jcol) + + ssa_sw(jg,jlev,jcol) = ssa_sw(jg,jlev,jcol)*od_sw(jg,jlev,jcol) & + +aerosol%ssa_sw(iband,jlev,jcol) + + od_sw(jg,jlev,jcol) = od_sw(jg,jlev,jcol) & + +aerosol%od_sw(iband,jlev,jcol) + + IF (ssa_sw(jg,jlev,jcol) /= 0.0_jprb) THEN + g_sw(jg,jlev,jcol)=g_sw(jg,jlev,jcol)/ssa_sw(jg,jlev,jcol) + ENDIF + !IF (od_sw(jg,jlev,jcol) /= 0.0_jprb) THEN + ssa_sw(jg,jlev,jcol)=ssa_sw(jg,jlev,jcol)/od_sw(jg,jlev,jcol) + !ENDIF + ENDIF + end do + + end do ! Loop over column + end do ! Loop over level + endif + + if (config%do_lw) then + + if (ubound(aerosol%od_lw,1) /= config%n_bands_lw) then + write(nulerr,'(a,i0,a,i0)') '*** Error: aerosol%od_lw contains ', & + & ubound(aerosol%od_lw,1), ' band, expected ', & + & config%n_bands_lw + call radiation_abort() + end if + + istartlev = lbound(aerosol%od_lw,2) + iendlev = ubound(aerosol%od_lw,2) + + !A.Laakso: This module is done for aerosols without scattering of LW + ! Loop over position + do jcol = istartcol,iendcol + do jlev = istartlev,iendlev + do jg = 1,config%n_g_lw + od_lw(jg,jlev,jcol) = od_lw(jg,jlev,jcol) & + & + aerosol%od_lw(config%i_band_from_reordered_g_lw(jg),jlev,jcol) + end do + end do + end do + endif + if (lhook) call dr_hook('radiation_aerosol_optics:add_aerosol_aod_ssa_asym',1,hook_handle) + end subroutine !--------------------------------------------------------------------- ! Sometimes it is useful to specify aerosol in terms of its optical diff --git a/ifs-source/radiation/module/radiation_cloud_optics.F90 b/ifs-source/radiation/module/radiation_cloud_optics.F90 index a0c5b322..cf526427 100644 --- a/ifs-source/radiation/module/radiation_cloud_optics.F90 +++ b/ifs-source/radiation/module/radiation_cloud_optics.F90 @@ -466,9 +466,13 @@ subroutine cloud_optics(nlev,istartcol,iendcol, & & + od_lw_ice - scat_od_lw_ice end if od_sw_cloud(:,jlev,jcol) = od_sw_liq + od_sw_ice - g_sw_cloud(:,jlev,jcol) = (g_sw_liq * scat_od_sw_liq & - & + g_sw_ice * scat_od_sw_ice) & - & / (scat_od_sw_liq + scat_od_sw_ice) + where (scat_od_sw_liq+scat_od_sw_ice > 0.0_jprb) + g_sw_cloud(:,jlev,jcol) = (g_sw_liq * scat_od_sw_liq & + & + g_sw_ice * scat_od_sw_ice) & + & / (scat_od_sw_liq + scat_od_sw_ice) + elsewhere + g_sw_cloud(:,jlev,jcol) = 0.0_jprb + end where ssa_sw_cloud(:,jlev,jcol) & & = (scat_od_sw_liq + scat_od_sw_ice) / (od_sw_liq + od_sw_ice) end if ! Cloud present diff --git a/ifs-source/radiation/module/radiation_interface.F90 b/ifs-source/radiation/module/radiation_interface.F90 index d9eb70c2..4ed5ae6d 100644 --- a/ifs-source/radiation/module/radiation_interface.F90 +++ b/ifs-source/radiation/module/radiation_interface.F90 @@ -194,7 +194,7 @@ end subroutine set_gas_units ! to reverse the order for the computation and then reverse the ! order of the output fluxes to match the inputs. subroutine radiation(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, strat_aerosol, flux) use parkind1, only : jprb use yomhook, only : lhook, dr_hook, jphook @@ -233,7 +233,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & #endif use radiation_ifs_rrtm, only : gas_optics use radiation_cloud_optics, only : cloud_optics - use radiation_aerosol_optics, only : add_aerosol_optics + use radiation_aerosol_optics, only : add_aerosol_optics, add_aerosol_aod_ssa_asym ! Inputs integer, intent(in) :: ncol ! number of columns @@ -244,7 +244,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(inout):: cloud - type(aerosol_type), intent(in) :: aerosol + type(aerosol_type), intent(in) :: aerosol,strat_aerosol ! Output type(flux_type), intent(inout):: flux @@ -311,7 +311,7 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & ! call the radiation scheme and then reverses the returned ! fluxes call radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, strat_aerosol, flux) else ! Input arrays arranged in order of increasing pressure / @@ -386,6 +386,11 @@ subroutine radiation(ncol, nlev, istartcol, iendcol, config, & call add_aerosol_optics(nlev,istartcol,iendcol, & & config, thermodynamics, gas, aerosol, & & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) + + ! optical properties from aerosol model if provided + call add_aerosol_aod_ssa_asym(ncol,nlev,istartcol,iendcol, & + & config, strat_aerosol, & + & od_lw, ssa_lw, g_lw, od_sw, ssa_sw, g_sw) end if else g_sw = 0.0_jprb @@ -511,7 +516,7 @@ end subroutine radiation ! subroutine calls, and is called by "radiation", it must be in this ! module to avoid circular dependencies. subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & - & single_level, thermodynamics, gas, cloud, aerosol, flux) + & single_level, thermodynamics, gas, cloud, aerosol, strat_aerosol, flux) use parkind1, only : jprb @@ -533,7 +538,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type),intent(in) :: thermodynamics type(gas_type), intent(in) :: gas type(cloud_type), intent(in) :: cloud - type(aerosol_type), intent(in) :: aerosol + type(aerosol_type), intent(in) :: aerosol, strat_aerosol ! Output type(flux_type), intent(inout):: flux @@ -541,7 +546,7 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & type(thermodynamics_type) :: thermodynamics_rev type(gas_type) :: gas_rev type(cloud_type) :: cloud_rev - type(aerosol_type) :: aerosol_rev + type(aerosol_type) :: aerosol_rev, strat_aerosol_rev type(flux_type) :: flux_rev ! Start and end levels for aerosol data @@ -561,6 +566,11 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call aerosol_rev%allocate(ncol, istartlev, iendlev, & & config%n_aerosol_types) end if + if (aerosol%is_direct) then + istartlev = nlev + 1 - aerosol%iendlev + iendlev = nlev + 1 - aerosol%istartlev + call aerosol_rev%allocate_direct(config, ncol, istartlev, iendlev) + end if ! Fill reversed thermodynamic arrays thermodynamics_rev%pressure_hl(istartcol:iendcol,:) & @@ -604,10 +614,36 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & & = aerosol%mixing_ratio(:,aerosol%iendlev:aerosol%istartlev:-1,:) end if + if (allocated(aerosol%od_sw)) then + aerosol_rev%od_sw(:,istartlev:iendlev,:) & + & = aerosol%od_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) + end if + if (allocated(aerosol%ssa_sw)) then + aerosol_rev%ssa_sw(:,istartlev:iendlev,:) & + & = aerosol%ssa_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) + end if + if (allocated(aerosol%g_sw)) then + aerosol_rev%g_sw(:,istartlev:iendlev,:) & + & = aerosol%g_sw(:,aerosol%iendlev:aerosol%istartlev:-1,:) + end if + + if (allocated(strat_aerosol%od_sw)) then + strat_aerosol_rev%od_sw(:,istartlev:iendlev,:) & + & = strat_aerosol%od_sw(:,strat_aerosol%iendlev:strat_aerosol%istartlev:-1,:) + end if + if (allocated(strat_aerosol%ssa_sw)) then + strat_aerosol_rev%ssa_sw(:,istartlev:iendlev,:) & + & = strat_aerosol%ssa_sw(:,strat_aerosol%iendlev:strat_aerosol%istartlev:-1,:) + end if + if (allocated(aerosol%g_sw)) then + strat_aerosol_rev%g_sw(:,istartlev:iendlev,:) & + & = strat_aerosol%g_sw(:,strat_aerosol%iendlev:strat_aerosol%istartlev:-1,:) + end if + ! Run radiation scheme on reversed profiles call radiation(ncol, nlev,istartcol,iendcol, & & config, single_level, thermodynamics_rev, gas_rev, & - & cloud_rev, aerosol_rev, flux_rev) + & cloud_rev, aerosol_rev, strat_aerosol_rev, flux_rev) ! Reorder fluxes if (allocated(flux%lw_up)) then @@ -648,10 +684,8 @@ subroutine radiation_reverse(ncol, nlev, istartcol, iendcol, config, & call gas_rev%deallocate call cloud_rev%deallocate call flux_rev%deallocate - if (allocated(aerosol%mixing_ratio)) then - call aerosol_rev%deallocate - end if - + call aerosol_rev%deallocate + call strat_aerosol_rev%deallocate end subroutine radiation_reverse end module radiation_interface diff --git a/ifs-source/scmec/source/cnt41c.F90 b/ifs-source/scmec/source/cnt41c.F90 index be2c3c54..3621878f 100644 --- a/ifs-source/scmec/source/cnt41c.F90 +++ b/ifs-source/scmec/source/cnt41c.F90 @@ -168,7 +168,7 @@ SUBROUTINE CNT41C(YDGEOMETRY,YDMODEL,YDFIELDS) !* 3.2 RESET OF TIME DEPENDENT CONSTANTS. ! ---------------------------------- - CALL UPDTIM(YDGEOMETRY,YDFIELDS%YRSURF,YDMODEL,JSTEP,TDT,TSTEP,.FALSE.) + CALL UPDTIM(YDGEOMETRY,YDFIELDS,YDMODEL,JSTEP,TDT,TSTEP,.FALSE.) !* 3.3 FREQUENCY OF FULL-RADIATION COMPUTATIONS. ! ----------------------------------------- diff --git a/ifs-test/bin/ifs-debug b/ifs-test/bin/ifs-debug index 07fc1c6b..97ddd7b0 100755 --- a/ifs-test/bin/ifs-debug +++ b/ifs-test/bin/ifs-debug @@ -3,8 +3,20 @@ set -x module load forge -if [[ ${ECPLATFORM:-unset} == "hpc2020" ]]; then - ./ifs-run --launcher='ddt srun --qos=np ' +if [[ $1 == "gdb" ]]; then + + if [[ ${ECPLATFORM:-unset} == "hpc2020" ]]; then + ./ifs-run --launcher='gdb' + else + ./ifs-run --launcher=gdb + fi + else - ./ifs-run --launcher=ddt -fi + + if [[ ${ECPLATFORM:-unset} == "hpc2020" ]]; then + ./ifs-run --launcher='ddt srun --qos=np ' + else + ./ifs-run --launcher=ddt + fi + +fi diff --git a/ifs-test/bin/set_launcher.bash b/ifs-test/bin/set_launcher.bash index 635c7607..1b95a9e8 100644 --- a/ifs-test/bin/set_launcher.bash +++ b/ifs-test/bin/set_launcher.bash @@ -12,4 +12,16 @@ if [[ "${ECPLATFORM:-"unset"}" == "hpc2020" ]] ; then LAUNCHER_OTHER_FLAGS="--gres=ssdtmp:0" export OMP_PROC_BIND=true export OMP_PLACES=threads +elif [[ "${ECPLATFORM:-"unset"}" == "puhti" ]] ; then + LAUNCHER="srun" + LAUNCHER_NPROC_FLAG="-n" + LAUNCHER_NTHREAD_FLAG="--cpus-per-task" + export OMP_PROC_BIND=true + export OMP_PLACES=threads +elif [[ "${ECPLATFORM:-"unset"}" == "mn5-gpp" ]] ; then + LAUNCHER="srun" + LAUNCHER_NPROC_FLAG="-n" + LAUNCHER_NTHREAD_FLAG="--cpus-per-task" + export OMP_PROC_BIND=true + export OMP_PLACES=threads fi diff --git a/ifs-test/tests/CMakeLists.txt b/ifs-test/tests/CMakeLists.txt index 72d82a3d..e99777dc 100644 --- a/ifs-test/tests/CMakeLists.txt +++ b/ifs-test/tests/CMakeLists.txt @@ -13,6 +13,7 @@ set (COMPO_DATA_PATH "${DATA_CACHE_DIR}/compo_data") add_subdirectory(t21) add_subdirectory(t42) +add_subdirectory(t255) if( ENABLE_SCMEC ) add_subdirectory(scm) endif() diff --git a/ifs-test/tests/compo_data/m7 b/ifs-test/tests/compo_data/m7 new file mode 120000 index 00000000..0b7e980a --- /dev/null +++ b/ifs-test/tests/compo_data/m7 @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/non-distributed/chemistry/ECHAM-HAMMOZ \ No newline at end of file diff --git a/ifs-test/tests/t21/CMakeLists.txt b/ifs-test/tests/t21/CMakeLists.txt index 45d3b967..900c2a8c 100644 --- a/ifs-test/tests/t21/CMakeLists.txt +++ b/ifs-test/tests/t21/CMakeLists.txt @@ -22,6 +22,7 @@ add_subdirectory( common ) # Helper function function( add_ifs_test TARGET ) + ### (1) COMMON for all tests execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -42,7 +43,7 @@ function( add_ifs_test TARGET ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_SOURCE_DIR}/bin/ifs-grep-norms.pl ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-grep-norms.pl ) - execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${PROJECT_SOURCE_DIR}/bin/set_launcher.bash ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/set_launcher.bash ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -179,6 +180,20 @@ function( add_ifs_test TARGET ) ${INIDATA_PATH}/ICMGGhmecINIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGhmecIMIN ) endif() endif() + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lut_optical_properties_lw_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_lw_M7.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lut_optical_properties_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_M7.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/refractive_indices_hdfstyle.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/refractive_indices_hdfstyle.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/parnuc.15H2SO4.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/parnuc.15H2SO4.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/lut_kappa.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_kappa.nc) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${COMPO_DATA_PATH}/m7/namelist.echam ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/namelist.echam) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${COMPO_DATA_PATH}/OMI.data.extraterrest ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/OMI.data.extraterrest ) execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink @@ -312,7 +327,8 @@ add_ifs_test( test_compo_cb05bascoe_fc ) add_ifs_test( test_compo_chemonly_RnPb_fc ) add_ifs_test( test_compo_chemonly_nwpo3_fc ) add_ifs_test( test_compo_updclie ) - +# add_ifs_test( test_compo_fc_m7_noemi ) # in development +# add_ifs_test( test_compo_fc_m7_norad ) # in development # Tests which will not succeed in OpenIFS-only builds. if( NOT ifs_HAVE_OPENIFS_ONLY ) @@ -375,6 +391,9 @@ if( ENABLE_TESTS ) set_property(TEST ifs_t21_test_compo_chemonly_nwpo3_fc APPEND PROPERTY LABELS forecast mpi threading composition nwpo3) set_property(TEST ifs_t21_test_compo_updclie APPEND PROPERTY LABELS forecast mpi threading composition climate mcc_compo) + # set_property(TEST ifs_t21_test_compo_fc_m7_noemi APPEND PROPERTY LABELS forecast mpi threading composition m7) + # set_property(TEST ifs_t21_test_compo_fc_m7_norad APPEND PROPERTY LABELS forecast mpi threading composition m7) + # Tests to include if this is not an OpenIFS-only build: if( NOT ifs_HAVE_OPENIFS_ONLY ) set_property(TEST ifs_t21_test_fc_nh APPEND PROPERTY LABELS forecast serial) diff --git a/ifs-test/tests/t21/common/CMakeLists.txt b/ifs-test/tests/t21/common/CMakeLists.txt index e41637d1..5ce8968d 100644 --- a/ifs-test/tests/t21/common/CMakeLists.txt +++ b/ifs-test/tests/t21/common/CMakeLists.txt @@ -1,4 +1,19 @@ # (C) Copyright 1996-2019 ECMWF. +# (C) Copyright 2024 KNMI. + +configure_file(env_vars env_vars COPYONLY) +configure_file(namelists namelists COPYONLY) + +# === Specific for m7 tests ==================================================== + +configure_file(m7/m7_aero.nml namelist_m7_aero COPYONLY) +configure_file(m7/m7_aerowvldiag.nml namelist_m7_aerowvldiag COPYONLY) +configure_file(m7/m7_yaerodesc.nml namelist_m7_yaerodesc COPYONLY) +configure_file(m7/m7_compoemis.nml namelist_m7_compoemis COPYONLY) + +# === Components copied from test_compo_fc ===================================== + +configure_file(aer/aer_compoemis.nml namelist_aer_compoemis COPYONLY) +configure_file(aer/aer_chem.nml namelist_aer_chem COPYONLY) + -configure_file(env_vars env_vars COPYONLY) -configure_file(namelists namelists COPYONLY) diff --git a/ifs-test/tests/t21/common/aer/aer_chem.nml b/ifs-test/tests/t21/common/aer/aer_chem.nml new file mode 100644 index 00000000..6c508241 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/aer_chem.nml @@ -0,0 +1,675 @@ +cat >> fort.4 << EOF +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +NCHEM=57, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=1, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485, +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.FALSE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e4, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LMASSFIX=.TRUE., +YCHEM_NL(27)%BETAMFBC=-999.9, +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0 +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LMASSFIX=.TRUE., +YCHEM_NL(31)%BETAMFBC=-999.9, +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LMASSFIX=.TRUE., +YCHEM_NL(32)%BETAMFBC=-999.9, +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LMASSFIX=.TRUE., +YCHEM_NL(41)%BETAMFBC=-999.9, +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LADV=.FALSE., +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=0, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=0, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=0, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=0, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=0, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='NOXA', +YCHEM_NL(57)%NREQIN=0, +YCHEM_NL(57)%RMOLMASS=46.0, +YCHEM_NL(57)%IGRBCODE=217056, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218056, +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +NGFL_EXT=4, +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='DDVEL', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=212250, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +YEXT_NL(3)%CNAME='DDFLXA', +YEXT_NL(3)%NREQIN=0, +YEXT_NL(3)%IGRBCODE=212251, +YEXT_NL(3)%LADV=.FALSE., +YEXT_NL(3)%LGP=.TRUE., +YEXT_NL(3)%LGPINGP=.TRUE., +YEXT_NL(4)%CNAME='WDFLXA', +YEXT_NL(4)%NREQIN=0, +YEXT_NL(4)%IGRBCODE=212252, +YEXT_NL(4)%LADV=.FALSE., +YEXT_NL(4)%LGP=.TRUE., +YEXT_NL(4)%LGPINGP=.TRUE., +EOF diff --git a/ifs-test/tests/t21/common/aer/aer_compoemis.nml b/ifs-test/tests/t21/common/aer/aer_compoemis.nml new file mode 100644 index 00000000..d3778767 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/aer_compoemis.nml @@ -0,0 +1,51 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES='ALD2', THIS%SECTOR='All', THIS%PARAMID=219012, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.8 / +&NAMCOMPO_EMIS THIS%SPECIES='C10H16', THIS%SECTOR='All', THIS%PARAMID=219049, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H4', THIS%SECTOR='All', THIS%PARAMID=219010, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H5OH', THIS%SECTOR='All', THIS%PARAMID=219046, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H6', THIS%SECTOR='All', THIS%PARAMID=219045, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H6', THIS%SECTOR='All', THIS%PARAMID=219048, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H8', THIS%SECTOR='All', THIS%PARAMID=219047, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C5H8', THIS%SECTOR='All', THIS%PARAMID=219016, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.0, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH2O', THIS%SECTOR='All', THIS%PARAMID=219008, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCH3', THIS%SECTOR='All', THIS%PARAMID=219052, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCHO', THIS%SECTOR='All', THIS%PARAMID=219023, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3OH', THIS%SECTOR='All', THIS%PARAMID=219042, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='AllButBiomassBur', THIS%PARAMID=210070, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210082, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO', THIS%SECTOR='All', THIS%PARAMID=219005, THIS%DIURNAL_CYCLE_TYPE='AnthroCO', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Anthropogenic', THIS%PARAMID=210069, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Aviation', THIS%PARAMID=212253, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210080, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Ocean', THIS%PARAMID=210067, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='DMS', THIS%SECTOR='All', THIS%PARAMID=219018, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='HCOOH', THIS%SECTOR='All', THIS%PARAMID=219043, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='ISPD', THIS%SECTOR='All', THIS%PARAMID=219050, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='MCOOH', THIS%SECTOR='All', THIS%PARAMID=219044, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='NH3', THIS%SECTOR='All', THIS%PARAMID=219019, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_AGS', THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='NO', THIS%SECTOR='AllButAviation', THIS%PARAMID=219027, THIS%DIURNAL_CYCLE_TYPE='AnthroNOx', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='NO2', THIS%SECTOR='Aviation', THIS%PARAMID=212255, THIS%SCALING=1.5333333333333333333, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='OLE', THIS%SECTOR='All', THIS%PARAMID=219011, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119, THIS%LEGACY_CHEM_OVERRIDE=16 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='PAR', THIS%SECTOR='All', THIS%PARAMID=219009, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Rn', THIS%SECTOR='All', THIS%PARAMID=219025, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='SO2', THIS%SECTOR='All', THIS%PARAMID=219017, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_ENE', THIS%VERTICAL_PROFILE_TYPE="AltitudeMap", THIS%VERTICAL_PARAMID=216045, THIS%VERTICAL_BASE_LEVEL=-1, THIS%VERTICAL_TOP_LEVEL=-4, THIS%VERTICAL_THRESHOLD=200, THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS / + +EOF diff --git a/ifs-test/tests/t21/common/aer/m7_aero_old.nml b/ifs-test/tests/t21/common/aer/m7_aero_old.nml new file mode 100644 index 00000000..d5afe234 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/m7_aero_old.nml @@ -0,0 +1,338 @@ +cat >> fort.4 << EOF +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +!YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +!YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +!YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +!YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +!YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +!YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +!YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +!YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +!YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +!YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +!YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +!YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +!YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +!YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +!YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +!YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +!YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +!YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +!YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +!YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +!YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +!YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +!YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +!YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +!YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +!YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +!YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +!YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +!YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +!YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +!YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +!YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +!YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +!YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +!YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +!YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +!YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +EOF + diff --git a/ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml b/ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml new file mode 100644 index 00000000..3cddf1e5 --- /dev/null +++ b/ifs-test/tests/t21/common/aer/m7_aerowvldiag_old.nml @@ -0,0 +1,46 @@ +cat >> fort.4 << EOF +NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +EOF + + diff --git a/ifs-test/tests/t21/common/m7/m7_aero.nml b/ifs-test/tests/t21/common/m7/m7_aero.nml new file mode 100644 index 00000000..5fd6a4f9 --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_aero.nml @@ -0,0 +1,362 @@ +cat >> fort.4 << EOF +NAERO=40, +NACTAERO=39, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, + +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, + +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, + +YAERO_NL(4)%CNAME='AS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4_AS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BC_AS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POM_AS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SS_AS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DU_AS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOA_NS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOA_KS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOA_AS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOA_CS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOA_KI', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='KI_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BC_KI', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POM_KI', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='AI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DU_AI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='KS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4_KS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BC_KS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POM_KS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='CI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DU_CI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='CS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4_CS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BC_CS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POM_CS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SS_CS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DU_CS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4_NS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, + +YAERO_NL(38)%CNAME='CDNC', +YAERO_NL(38)%NREQIN=0, +YAERO_NL(38)%IGRBCODE=212037, +YAERO_NL(38)%LQM=.TRUE., +YAERO_NL(38)%LQM3D=.FALSE., +YAERO_NL(38)%LMASSFIX=.TRUE., +YAERO_NL(38)%BETAMFBC=-999.9, + +YAERO_NL(39)%CNAME='ICNC', +YAERO_NL(39)%NREQIN=0, +YAERO_NL(39)%IGRBCODE=212038, +YAERO_NL(39)%LQM=.TRUE., +YAERO_NL(39)%LQM3D=.FALSE., +YAERO_NL(39)%LMASSFIX=.TRUE., +YAERO_NL(39)%BETAMFBC=-999.9, + +YAERO_NL(40)%CNAME='Total_aerosol', +YAERO_NL(40)%IGRBCODE=210048, +YAERO_NL(40)%LADV5=true, + +EOF + diff --git a/ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml b/ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml new file mode 100644 index 00000000..86a28150 --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_aerowvldiag.nml @@ -0,0 +1,19 @@ +cat >> fort.4 << EOF +NAEROUT=0, +NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +EOF + + diff --git a/ifs-test/tests/t21/common/m7/m7_compoemis.nml b/ifs-test/tests/t21/common/m7/m7_compoemis.nml new file mode 100644 index 00000000..e904f9d2 --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_compoemis.nml @@ -0,0 +1,283 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219209 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="emiss_bio" THIS%PARAMID=212001 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ene" THIS%PARAMID=212002 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="fef" THIS%PARAMID=212003 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="ind" THIS%PARAMID=212004 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="res" THIS%PARAMID=212006 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="shp" THIS%PARAMID=212007 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="slv" THIS%PARAMID=212189 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="swd" THIS%PARAMID=212008 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tnr" THIS%PARAMID=212009 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="ALD2" THIS%SECTOR="tro" THIS%PARAMID=212010 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="emiss_bio" THIS%PARAMID=212011 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ene" THIS%PARAMID=212012 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="fef" THIS%PARAMID=212013 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="ind" THIS%PARAMID=212014 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="res" THIS%PARAMID=212015 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="shp" THIS%PARAMID=212016 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="slv" THIS%PARAMID=212019 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="swd" THIS%PARAMID=212017 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C10H16" THIS%SECTOR="tnr" THIS%PARAMID=212018 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210106 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_bio" THIS%PARAMID=212021 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="emiss_nat" THIS%PARAMID=212022 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ene" THIS%PARAMID=212023 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="fef" THIS%PARAMID=212024 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ind" THIS%PARAMID=212025 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="ref" THIS%PARAMID=212020 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="res" THIS%PARAMID=212026 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="shp" THIS%PARAMID=212027 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="slv" THIS%PARAMID=212133 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="swd" THIS%PARAMID=212028 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tnr" THIS%PARAMID=212029 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H4" THIS%SECTOR="tro" THIS%PARAMID=212030 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210104 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212031 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ene" THIS%PARAMID=212032 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="fef" THIS%PARAMID=212033 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ind" THIS%PARAMID=212034 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="ref" THIS%PARAMID=212040 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="res" THIS%PARAMID=212035 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="shp" THIS%PARAMID=212036 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="slv" THIS%PARAMID=212137 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="swd" THIS%PARAMID=212037 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tnr" THIS%PARAMID=212038 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H5OH" THIS%SECTOR="tro" THIS%PARAMID=212039 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210118 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212041 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212042 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ene" THIS%PARAMID=212043 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="fef" THIS%PARAMID=212044 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ind" THIS%PARAMID=212045 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="ref" THIS%PARAMID=212134 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="res" THIS%PARAMID=212046 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="shp" THIS%PARAMID=212047 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="slv" THIS%PARAMID=212185 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="swd" THIS%PARAMID=212048 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tnr" THIS%PARAMID=212049 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C2H6" THIS%SECTOR="tro" THIS%PARAMID=212050 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210107 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_bio" THIS%PARAMID=212051 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="emiss_nat" THIS%PARAMID=212052 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ene" THIS%PARAMID=212053 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="fef" THIS%PARAMID=212054 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ind" THIS%PARAMID=212055 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="ref" THIS%PARAMID=212135 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="res" THIS%PARAMID=212056 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="shp" THIS%PARAMID=212057 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="slv" THIS%PARAMID=212186 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="swd" THIS%PARAMID=212058 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tnr" THIS%PARAMID=212059 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H6" THIS%SECTOR="tro" THIS%PARAMID=212060 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210105 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212061 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="emiss_nat" THIS%PARAMID=212062 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ene" THIS%PARAMID=212063 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="fef" THIS%PARAMID=212064 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ind" THIS%PARAMID=212065 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="ref" THIS%PARAMID=212136 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="res" THIS%PARAMID=212066 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="shp" THIS%PARAMID=212067 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="slv" THIS%PARAMID=212187 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="swd" THIS%PARAMID=212068 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tnr" THIS%PARAMID=212069 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C3H8" THIS%SECTOR="tro" THIS%PARAMID=212070 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210108 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="emiss_bio" THIS%PARAMID=212071 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.00 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ene" THIS%PARAMID=212072 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="fef" THIS%PARAMID=212073 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ind" THIS%PARAMID=212074 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="ref" THIS%PARAMID=212080 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="res" THIS%PARAMID=212075 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="shp" THIS%PARAMID=212076 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="slv" THIS%PARAMID=212198 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="swd" THIS%PARAMID=212077 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tnr" THIS%PARAMID=212078 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="C5H8" THIS%SECTOR="tro" THIS%PARAMID=212079 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210113 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="emiss_bio" THIS%PARAMID=212081 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ene" THIS%PARAMID=212082 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="fef" THIS%PARAMID=212083 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="ind" THIS%PARAMID=212084 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="res" THIS%PARAMID=212085 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="shp" THIS%PARAMID=212086 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="slv" THIS%PARAMID=212090 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="swd" THIS%PARAMID=212087 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tnr" THIS%PARAMID=212088 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH2O" THIS%SECTOR="tro" THIS%PARAMID=212089 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219220 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ene" THIS%SCALING=0.0015 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ind" THIS%SCALING=0.0015 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="ref" THIS%SCALING=0.0015 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3CN" THIS%SECTOR="res" THIS%SCALING=0.0015 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210115 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212091 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="emiss_nat" THIS%SCALING=1.4 THIS%PARAMID=212122 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ene" THIS%PARAMID=212092 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="fef" THIS%PARAMID=212093 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ind" THIS%PARAMID=212094 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="ref" THIS%PARAMID=212100 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="res" THIS%PARAMID=212095 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="shp" THIS%PARAMID=212096 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="slv" THIS%PARAMID=212190 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="swd" THIS%PARAMID=212097 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tnr" THIS%PARAMID=212098 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3COCH3" THIS%SECTOR="tro" THIS%PARAMID=212099 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210103 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212111 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ene" THIS%PARAMID=212112 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="fef" THIS%PARAMID=212113 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ind" THIS%PARAMID=212114 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="ref" THIS%PARAMID=212110 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="res" THIS%PARAMID=212115 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="shp" THIS%PARAMID=212116 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="slv" THIS%PARAMID=212140 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="swd" THIS%PARAMID=212117 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tnr" THIS%PARAMID=212118 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CH3OH" THIS%SECTOR="tro" THIS%PARAMID=212119 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210081 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_bio" THIS%PARAMID=212121 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212122 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ene" THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="fef" THIS%PARAMID=212124 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ind" THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="ref" THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="res" THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="shp" THIS%PARAMID=212127 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="swd" THIS%PARAMID=212128 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tnr" THIS%PARAMID=212129 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="CO" THIS%SECTOR="tro" THIS%PARAMID=212130 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210117 / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_bio" THIS%PARAMID=212132 / +&NAMCOMPO_EMIS THIS%SPECIES="DMS" THIS%SECTOR="emiss_nat" THIS%PARAMID=212131 / +&NAMCOMPO_EMIS THIS%SPECIES="GLY" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=212244 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219219 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ene" THIS%SCALING=0.001 THIS%PARAMID=212123 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ind" THIS%SCALING=0.001 THIS%PARAMID=212125 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="ref" THIS%SCALING=0.001 THIS%PARAMID=212120 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCN" THIS%SECTOR="res" THIS%SCALING=0.001 THIS%PARAMID=212126 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212141 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ene" THIS%PARAMID=212142 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="fef" THIS%PARAMID=212143 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="ind" THIS%PARAMID=212144 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="res" THIS%PARAMID=212145 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="shp" THIS%PARAMID=212146 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="slv" THIS%PARAMID=212240 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="swd" THIS%PARAMID=212147 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212148 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="HCOOH" THIS%SECTOR="tro" THIS%PARAMID=212149 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="ISPD" THIS%SECTOR="emiss_bio" THIS%PARAMID=212150 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="emiss_bio" THIS%PARAMID=212151 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.25 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ene" THIS%PARAMID=212152 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="fef" THIS%PARAMID=212153 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="ind" THIS%PARAMID=212154 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="res" THIS%PARAMID=212155 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="shp" THIS%PARAMID=212156 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="slv" THIS%PARAMID=212241 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="swd" THIS%PARAMID=212157 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tnr" THIS%PARAMID=212158 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="MCOOH" THIS%SECTOR="tro" THIS%PARAMID=212159 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210116 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="agl" THIS%PARAMID=212163 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ags" THIS%PARAMID=212164 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_bio" THIS%PARAMID=212161 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="emiss_nat" THIS%PARAMID=212162 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ene" THIS%PARAMID=212165 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ind" THIS%PARAMID=212166 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="ref" THIS%PARAMID=212138 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="res" THIS%PARAMID=212167 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="slv" THIS%PARAMID=212169 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="swd" THIS%PARAMID=212170 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tnr" THIS%PARAMID=212171 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="NH3" THIS%SECTOR="tro" THIS%PARAMID=212172 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210085 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="agl" THIS%PARAMID=212174 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="emiss_nat" THIS%PARAMID=212173 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ene" THIS%PARAMID=212176 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="fef" THIS%PARAMID=212177 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ind" THIS%PARAMID=212178 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="ref" THIS%PARAMID=212184 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="res" THIS%PARAMID=212179 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="shp" THIS%PARAMID=212180 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="swd" THIS%PARAMID=212181 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tnr" THIS%PARAMID=212182 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="NO" THIS%SECTOR="tro" THIS%PARAMID=212183 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="NO2" THIS%SECTOR="Aviation" THIS%VERTICAL_PROFILE_TYPE="3D" THIS%PARAMID=212255 THIS%SCALING=1.53333333333333 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219208 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="emiss_bio" THIS%PARAMID=212191 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ene" THIS%PARAMID=212192 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="fef" THIS%PARAMID=212193 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ind" THIS%PARAMID=212194 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="ref" THIS%PARAMID=212200 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="res" THIS%PARAMID=212195 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="shp" THIS%PARAMID=212196 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="slv" THIS%PARAMID=212242 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="swd" THIS%PARAMID=212197 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tnr" THIS%PARAMID=212188 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="OLE" THIS%SECTOR="tro" THIS%PARAMID=212199 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219207 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="emiss_bio" THIS%PARAMID=212201 THIS%DIURNAL_CYCLE_TYPE="VOC" THIS%DIURNAL_PEAK_HOUR=14 THIS%DIURNAL_BASELINE=0.65 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ene" THIS%PARAMID=212202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="fef" THIS%PARAMID=212203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ind" THIS%PARAMID=212204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="ref" THIS%PARAMID=212139 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="res" THIS%PARAMID=212205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="shp" THIS%PARAMID=212206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="slv" THIS%PARAMID=212243 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="swd" THIS%PARAMID=212207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tnr" THIS%PARAMID=212208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="PAR" THIS%SECTOR="tro" THIS%PARAMID=212209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="Rn" THIS%SECTOR="emiss_nat" THIS%PARAMID=212210 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=210102 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="emiss_nat" THIS%PARAMID=212211 THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" THIS%VERTICAL_PARAMID=216045 THIS%VERTICAL_BASE_LEVEL=-1 THIS%VERTICAL_TOP_LEVEL=-4 THIS%VERTICAL_THRESHOLD=200 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ene" THIS%PARAMID=212212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="fef" THIS%PARAMID=212213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ind" THIS%PARAMID=212214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="ref" THIS%PARAMID=212220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="res" THIS%PARAMID=212215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="shp" THIS%PARAMID=212216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="swd" THIS%PARAMID=212217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tnr" THIS%PARAMID=212218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="SO2" THIS%SECTOR="tro" THIS%PARAMID=212219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="agl" THIS%PARAMID=216221 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ene" THIS%PARAMID=216222 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="fef" THIS%PARAMID=216223 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ind" THIS%PARAMID=216224 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="ref" THIS%PARAMID=216225 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="res" THIS%PARAMID=216226 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="shp" THIS%PARAMID=216227 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="slv" THIS%PARAMID=216228 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="swd" THIS%PARAMID=216229 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tnr" THIS%PARAMID=216230 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="SOG2B" THIS%SECTOR="tro" THIS%PARAMID=216231 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219212 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="emiss_bio" THIS%PARAMID=216200 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ene" THIS%PARAMID=216201 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="fef" THIS%PARAMID=216202 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ind" THIS%PARAMID=216203 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="ref" THIS%PARAMID=216204 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="res" THIS%PARAMID=216205 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="shp" THIS%PARAMID=216206 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="slv" THIS%PARAMID=216207 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="swd" THIS%PARAMID=216208 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tnr" THIS%PARAMID=216209 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="TOL" THIS%SECTOR="tro" THIS%PARAMID=216210 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="Biomass-burning" THIS%DIURNAL_CYCLE_TYPE="GFAS" THIS%DIURNAL_PEAK_HOUR=13.5 THIS%DIURNAL_BASELINE=0.2 THIS%VERTICAL_PROFILE_TYPE="GFAS" THIS%VERTICAL_PARAMID=210060 THIS%PARAMID=219213 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ene" THIS%PARAMID=216211 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="fef" THIS%PARAMID=216212 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ind" THIS%PARAMID=216213 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=300 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="ref" THIS%PARAMID=216214 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=200 THIS%VERTICAL_TOP_HEIGHT=800 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="res" THIS%PARAMID=216215 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="shp" THIS%PARAMID=216216 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=30 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="slv" THIS%PARAMID=216217 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="swd" THIS%PARAMID=216218 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" THIS%VERTICAL_PROFILE_TYPE="HeightRange" THIS%VERTICAL_BASE_HEIGHT=20 THIS%VERTICAL_TOP_HEIGHT=100 / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tnr" THIS%PARAMID=216219 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" / +&NAMCOMPO_EMIS THIS%SPECIES="XYL" THIS%SECTOR="tro" THIS%PARAMID=216220 THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" / +&NAMCOMPO_EMIS / +&NAMCOMPO_EMIS_AUX THIS%PARAMID=210060 / +&NAMCOMPO_EMIS_AUX THIS%PARAMID=216045 / +&NAMCOMPO_EMIS_AUX / + +EOF diff --git a/ifs-test/tests/t21/common/m7/m7_yaerodesc.nml b/ifs-test/tests/t21/common/m7/m7_yaerodesc.nml new file mode 100644 index 00000000..f14cf4ce --- /dev/null +++ b/ifs-test/tests/t21/common/m7/m7_yaerodesc.nml @@ -0,0 +1,163 @@ +cat >> fort.4 << EOF +NTYPAER=3,3,2,2,1,2,1,2,0,0, +YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, +EOF diff --git a/ifs-test/tests/t21/common/namelist_m7_from_openifsrun b/ifs-test/tests/t21/common/namelist_m7_from_openifsrun new file mode 100644 index 00000000..fbcaa40a --- /dev/null +++ b/ifs-test/tests/t21/common/namelist_m7_from_openifsrun @@ -0,0 +1,4775 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=0, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=512, +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=512, +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +LAERCHEM=true, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=96, +NFP3DFP=31, +NFP3DFT=25, +NFP3DFV=25, +MFP3DFS(:)=130,135,138,155,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210129,217003,217004,210123,217006,217007,210124,217009,217010,217011,217012,217013,217014,217015,217016,210122,217018,217019,217020,217021,217022,217023,217024,210181,217026,217027,217028,217029,217030,210121,217032,217033,217034,217035,217036,217037,217038,217039,217040,217041,217042,217043,217044,217045,217046,217047,217048,217049,217050,217051,217052,217053,217054,217055,217189,217225,217086,217226,217224,217100,217099,217222,217227,217228,217161,217107,217101,217118,217229,217230,217186,217187,217188,210071, +MFP3DFP(:)=129,130,135,138,155,157,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFT=60,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFV=133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=260, +MFPPHY(:)=31,32,33,34,35,36,37,38,39,40,41,42,44,45,47,49,50,57,58,59,78,79,129,134,136,137,139,141,142,143,228,144,145,146,147,148,151,159,164,165,166,167,168,169,170,172,175,176,177,178,179,180,181,182,183,186,187,188,189,195,196,197,198,201,202,205,208,209,210,211,235,236,238,243,244,245,229,230,231,232,213,212,8,9,228080,228081,228082,228083,228084,228085,228089,228090,228001,260121,260123,3020,228029,228251,228216,228217,228218,228219,228220,228221,260015,151131,151132,228141,228038,215022,215019,210208,215023,215020,215024,215021,215046,215043,210209,215047,215044,215048,215045,215064,215062,210210,215063,215061,215080,215078,210211,215079,215077,215088,215087,210212,215203,215201,210250,215204,215202,216042,215211,210251,216098,215218,215226,216099,215225,210072,210073,210074,210207,215104,215122,215140,215158,210217,215096,215114,215132,215150,210218,215097,215115,215133,215151,210219,215098,215116,215134,215152,210220,215099,215117,215135,215153,210221,215100,215118,215136,215154,210213,215101,215119,215137,215155,210222,215102,215120,215138,215156,210223,215103,215121,215139,215157,210224,215105,215123,215141,215159,210214,215106,215124,215142,215160,210225,215107,215125,215143,215161,210226,215108,215126,215144,215162,210215,215109,215127,215145,215163,210227,215110,215128,215146,215164,210228,215111,215129,215147,215165,210216,215112,215130,215148,215166,210229,215113,215131,215149,215167,210230,215176,215177,215178,215179,216008,216009,216010,216011,216012,210206,210127,218006,210128,210126,218019,218027,210125, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h240', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=true, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=true, + LAERSOA_COUPLED=true, + KGHG_CHEMTEND_CH4=1, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.2 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.8 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=true, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t21/common/namelist_m7_ok b/ifs-test/tests/t21/common/namelist_m7_ok new file mode 100644 index 00000000..460717f3 --- /dev/null +++ b/ifs-test/tests/t21/common/namelist_m7_ok @@ -0,0 +1,4390 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=1, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=512, +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=512, +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=5, +NFP3DFP=5, +NFP3DFT=1, +NFP3DFV=1, +MFP3DFS(:)=130,135,138,155,133, +MFP3DFP(:)=129,130,135,138,155, +MFP3DFT=60, +MFP3DFV=133, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=1, +MFPPHY(:)=31, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h24', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=false, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t21/ifsdata/rtablel_2095 b/ifs-test/tests/t21/ifsdata/rtablel_2095 new file mode 100755 index 00000000..f4e4b954 --- /dev/null +++ b/ifs-test/tests/t21/ifsdata/rtablel_2095 @@ -0,0 +1,98 @@ + &NAMRGRI + NRGRI(1)= 20, + NRGRI(2)= 25, + NRGRI(3)= 36, + NRGRI(4)= 40, + NRGRI(5)= 45, + NRGRI(6)= 50, + NRGRI(7)= 60, + NRGRI(8)= 60, + NRGRI(9)= 72, + NRGRI(10)= 75, + NRGRI(11)= 80, + NRGRI(12)= 90, + NRGRI(13)= 96, + NRGRI(14)=100, + NRGRI(15)=108, + NRGRI(16)=120, + NRGRI(17)=120, + NRGRI(18)=120, + NRGRI(19)=128, + NRGRI(20)=135, + NRGRI(21)=144, + NRGRI(22)=144, + NRGRI(23)=160, + NRGRI(24)=160, + NRGRI(25)=160, + NRGRI(26)=160, + NRGRI(27)=160, + NRGRI(28)=180, + NRGRI(29)=180, + NRGRI(30)=180, + NRGRI(31)=180, + NRGRI(32)=180, + NRGRI(33)=192, + NRGRI(34)=192, + NRGRI(35)=192, + NRGRI(36)=192, + NRGRI(37)=192, + NRGRI(38)=192, + NRGRI(39)=192, + NRGRI(40)=192, + NRGRI(41)=192, + NRGRI(42)=192, + NRGRI(43)=192, + NRGRI(44)=192, + NRGRI(45)=192, + NRGRI(46)=192, + NRGRI(47)=192, + NRGRI(48)=192, + NRGRI(49)=192, + NRGRI(50)=192, + NRGRI(51)=192, + NRGRI(52)=192, + NRGRI(53)=192, + NRGRI(54)=192, + NRGRI(55)=192, + NRGRI(56)=192, + NRGRI(57)=192, + NRGRI(58)=192, + NRGRI(59)=192, + NRGRI(60)=192, + NRGRI(61)=192, + NRGRI(62)=192, + NRGRI(63)=192, + NRGRI(64)=192, + NRGRI(65)=180, + NRGRI(66)=180, + NRGRI(67)=180, + NRGRI(68)=180, + NRGRI(69)=180, + NRGRI(70)=160, + NRGRI(71)=160, + NRGRI(72)=160, + NRGRI(73)=160, + NRGRI(74)=160, + NRGRI(75)=144, + NRGRI(76)=144, + NRGRI(77)=135, + NRGRI(78)=128, + NRGRI(79)=120, + NRGRI(80)=120, + NRGRI(81)=120, + NRGRI(82)=108, + NRGRI(83)=100, + NRGRI(84)= 96, + NRGRI(85)= 90, + NRGRI(86)= 80, + NRGRI(87)= 75, + NRGRI(88)= 72, + NRGRI(89)= 60, + NRGRI(90)= 60, + NRGRI(91)= 50, + NRGRI(92)= 45, + NRGRI(93)= 40, + NRGRI(94)= 36, + NRGRI(95)= 25, + NRGRI(96)= 20, + / diff --git a/ifs-test/tests/t21/test_compo_fc/params b/ifs-test/tests/t21/test_compo_fc/params index bdd713db..1545ce42 100644 --- a/ifs-test/tests/t21/test_compo_fc/params +++ b/ifs-test/tests/t21/test_compo_fc/params @@ -1,2 +1,2 @@ NPROC=2 -NTHREAD=2 +NTHREAD=1 diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md b/ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md new file mode 100644 index 00000000..f590620a --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/README.md @@ -0,0 +1,6 @@ +title: test_compo_fc + +# Description + +Forecast test including prognostic composition (aerosols+chemistry) as +used by CAMS. diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/params b/ifs-test/tests/t21/test_compo_fc_m7_noemi/params new file mode 100644 index 00000000..1545ce42 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/params @@ -0,0 +1,2 @@ +NPROC=2 +NTHREAD=1 diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing b/ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing new file mode 100644 index 00000000..40f80871 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/postprocessing @@ -0,0 +1,4 @@ +echo "No sanity checks implemented" + +./ifs-check-tracers +./ifs-check-bitid diff --git a/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup b/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup new file mode 100644 index 00000000..164fe951 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_noemi/setup @@ -0,0 +1,189 @@ +# Source common environment variables +. ../common/env_vars + +# Pre-empt some common namelist settings. +# NAMARG: +CNMEXP="'hmec'" + +# NAEPHY: +LEO3CH=".TRUE." +NAEPHY_EXTRA="LO3CH_HLO=.FALSE.," + +# NAMDPHY: +NVEXTR="7" +NCEXTR="102" + +# NAMCT0: +NFRPOS=3 +# NAMCT0_EXTRA="NSPPR=1," # uncomment for per-level norms + +# Include common namelists +. ../common/namelists + +# Note: In this setup we include some details by blocks to have a +# more structured and easier to read setup file. For the final +# namelist please check fort.4 after run the experiment. + +cat >> fort.4 << EOF +&NAMGFL +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +EOF + +# Include NAMGLF for aerosols (m7) +. ../common/namelist_m7_aero + +cat >> fort.4 << EOF +LAERAOT=false, +LAERLISI=false, +NAEROUT=0, +!YAEROUT_NL(1)%CNAME='AEROUT-7', +!YAEROUT_NL(1)%IGRBCODE=210022, +NUVP=1, +YUVP_NL(1)%CNAME='UVP2DRAD', +YUVP_NL(1)%IGRBCODE=210055, +EOF + +# Include NAMGLF for NAERO_WVL_DIAG +. ../common/namelist_m7_aerowvldiag + + +# Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +. ../common/namelist_aer_chem + +cat >> fort.4 << EOF + LAERCHEM=true + YQ_NL%LGP=true, + YQ_NL%LSP=false, + YL_NL%LGP=true, + YI_NL%LGP=true, + YA_NL%LGP=true, + YO3_NL%LGP=true, + YQ_NL%LGPINGP=true, + !YR_NL%NREQIN=-1, + !YS_NL%NREQIN=-1, +/ +&NAERAD + LECOMPGRID=false, + RMUZUV=0.01, + NUVTIM=72, + NRADUV=1, + NUV=24, + LUVPROC=false, !CHECK + LUVAERP=true, + KMODTS=2, + NRPROMA=0, + LEPO3RA=true, + LO3_CHEM_UV=true, + NGHGRAD=20, + NAERMACC=1, + LAER3D=.false., +/ +&NAMFPC + CFPFMT="MODEL", + NFP3DFS=3, + NFP3DFP=4, + MFP3DFS(:)=210203,210061,212255 + MFP3DFP(:)=210011,217003,210062,212253 + NFP2DF=1, + MFP2DF(:)=152, + NFPPHY=8, + MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, +!MFPPHY(:)=210031,210072,210073,210074,210119,215022,215020,210208,210052,214002,210207,215104,210217,215099,215120,215143,215179,215028,215032,215055,215058,215194,210206,215089,210064,219005,219052 + NRFP3S(:)=-99, + RFP3P=100000.,85000.,70000.,50000., +/ +&NAEAER +EOF + +# Include NAEAER description (YAERO_DESC) +. ../common/namelist_m7_yaerodesc + +cat >> fort.4 << EOF + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=1, + NDDUST=3, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERHYGRO=true, + LAERRRTM=false, +/ +&NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", +/ +&NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + KCHEM_DRYDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., +/ + +&NAMMCC + LMCCEC=true, + LMCCIEC=false, + LMCC_COMPO=false, +/ +EOF +# Do NOT include compo emissions namelist since LMCC_COMPO=F +#. ../common/namelist_m7_compoemis + +cat >> fort.4 << EOF +&NAMM7CTL +/ +EOF diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/README.md b/ifs-test/tests/t21/test_compo_fc_m7_norad/README.md new file mode 100644 index 00000000..f590620a --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/README.md @@ -0,0 +1,6 @@ +title: test_compo_fc + +# Description + +Forecast test including prognostic composition (aerosols+chemistry) as +used by CAMS. diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/params b/ifs-test/tests/t21/test_compo_fc_m7_norad/params new file mode 100644 index 00000000..1545ce42 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/params @@ -0,0 +1,2 @@ +NPROC=2 +NTHREAD=1 diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing b/ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing new file mode 100644 index 00000000..40f80871 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/postprocessing @@ -0,0 +1,4 @@ +echo "No sanity checks implemented" + +./ifs-check-tracers +./ifs-check-bitid diff --git a/ifs-test/tests/t21/test_compo_fc_m7_norad/setup b/ifs-test/tests/t21/test_compo_fc_m7_norad/setup new file mode 100644 index 00000000..c73ce5c0 --- /dev/null +++ b/ifs-test/tests/t21/test_compo_fc_m7_norad/setup @@ -0,0 +1,191 @@ +# Source common environment variables +. ../common/env_vars + +# Pre-empt some common namelist settings. +# NAMARG: +CNMEXP="'hmec'" + +# NAEPHY: +LEO3CH=".TRUE." +NAEPHY_EXTRA="LO3CH_HLO=.FALSE.," + +# NAMDPHY: +NVEXTR="7" +NCEXTR="102" + +# NAMCT0: +NFRPOS=3 +# NAMCT0_EXTRA="NSPPR=1," # uncomment for per-level norms + +# Include common namelists +. ../common/namelists + +# Note: In this setup we include some details by blocks to have a +# more structured and easier to read setup file. For the final +# namelist please check fort.4 after run the experiment. + +cat >> fort.4 << EOF +&NAMGFL +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +EOF + +# Include NAMGLF for aerosols (m7) +. ../common/namelist_m7_aero + +cat >> fort.4 << EOF +LAERAOT=false, +LAERLISI=false, +NAEROUT=0, +!YAEROUT_NL(1)%CNAME='AEROUT-7', +!YAEROUT_NL(1)%IGRBCODE=210022, +NUVP=1, +YUVP_NL(1)%CNAME='UVP2DRAD', +YUVP_NL(1)%IGRBCODE=210055, +EOF + +# Include NAMGLF for NAERO_WVL_DIAG +. ../common/namelist_m7_aerowvldiag + + +# Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +. ../common/namelist_aer_chem + +cat >> fort.4 << EOF + LAERCHEM=true + YQ_NL%LGP=true, + YQ_NL%LSP=false, + YL_NL%LGP=true, + YI_NL%LGP=true, + YA_NL%LGP=true, + YO3_NL%LGP=true, + YQ_NL%LGPINGP=true, + !YR_NL%NREQIN=-1, + !YS_NL%NREQIN=-1, +/ +&NAERAD + LECOMPGRID=false, + RMUZUV=0.01, + NUVTIM=72, + NRADUV=1, + NUV=24, + LUVPROC=false, !CHECK + LUVAERP=true, + KMODTS=2, + NRPROMA=0, + LEPO3RA=true, + LO3_CHEM_UV=true, + NGHGRAD=20, + NAERMACC=1, + LAER3D=.false., +/ +&NAMFPC + CFPFMT="MODEL", + NFP3DFS=3, + NFP3DFP=4, + MFP3DFS(:)=210203,210061,212255 + MFP3DFP(:)=210011,217003,210062,212253 + NFP2DF=1, + MFP2DF(:)=152, + NFPPHY=8, + MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, +!MFPPHY(:)=210031,210072,210073,210074,210119,215022,215020,210208,210052,214002,210207,215104,210217,215099,215120,215143,215179,215028,215032,215055,215058,215194,210206,215089,210064,219005,219052 + NRFP3S(:)=-99, + RFP3P=100000.,85000.,70000.,50000., +/ +&NAEAER +EOF + +# Include NAEAER description (YAERO_DESC) => possible not for m7 +. ../common/namelist_m7_yaerodesc + +cat >> fort.4 << EOF + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=1, + NDDUST=3, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERHYGRO=true, + LAERRRTM=false, +/ +&NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", +/ +&NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + KCHEM_DRYDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., +/ + +&NAMMCC + LMCCEC=true, + LMCCIEC=false, + LMCC_COMPO=false, +/ +EOF +# Include compo emissions namelist (moved to end of file) +. ../common/namelist_aer_compoemis + +#. ../common/namelist_m7_compoemis + +cat >> fort.4 << EOF +&NAMM7CTL +/ +EOF diff --git a/ifs-test/tests/t255/CMakeLists.txt b/ifs-test/tests/t255/CMakeLists.txt new file mode 100644 index 00000000..b0bcd535 --- /dev/null +++ b/ifs-test/tests/t255/CMakeLists.txt @@ -0,0 +1,147 @@ +# (C) Copyright 1996-2019 ECMWF. + +get_filename_component(IFS_EXECUTABLE_NAME ${IFS_EXECUTABLE} NAME) + +if( TARGET ${IFS_EXECUTABLE_NAME} ) + list( APPEND TEST_DEPENDS ${IFS_EXECUTABLE_NAME} ) +endif() + +if( IFS_EXECUTABLE_NAME STREQUAL ifsMASTER.DP ) + set(DOUBLE_PRECISION ON) +endif() + +set(APATH_255l_2 /ec/res4/hpcperm/nld5163/openifs/oifs_data/48r1/climate.v020/255l_2) + +execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/ifsdata ${CMAKE_CURRENT_BINARY_DIR}/ifsdata ) + +add_subdirectory( common ) + +################################################################# +# Helper function +function( add_ifs_test TARGET ) + + ### (1) COMMON for all tests + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-run ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-run ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-debug ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-debug ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-clean ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-clean ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-check-bitid ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-check-bitid ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-check-tracers ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-check-tracers ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/ifs-grep-norms.pl ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs-grep-norms.pl ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${PROJECT_SOURCE_DIR}/bin/set_launcher.bash ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/set_launcher.bash ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${SHARE_BINARY_DIR}/ifs_env ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifs_env ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMGGham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGham7INIT ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMGGham7INIUA ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMGGham7INIUA ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMSHham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMSHham7INIT ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMCLham7INIT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMCLham7INIT ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/inidata/ICMCLham7INIT_COMPO ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ICMCLham7INIT_COMPO ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_optical_properties_lw_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_lw_M7.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_optical_properties_M7.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_optical_properties_M7.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lookup_table.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lookup_table.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/refractive_indices_hdfstyle.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/refractive_indices_hdfstyle.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/namelist.echam ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/namelist.echam) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/parnuc.15H2SO4.A0.total.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/parnuc.15H2SO4.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/m7/lut_kappa.nc ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/lut_kappa.nc) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/OMI.data.extraterrest ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/OMI.data.extraterrest ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/aerosol_reduce.dat ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/aerosol_reduce.dat ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/tropo_look_up_cbmhybrid.dat ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/tropo_look_up_cbmhybrid.dat ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/uars_ratio.txt ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/uars_ratio.txt ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/haloe_ch4clim.dat ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/haloe_ch4clim.dat ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${APATH_255l_2} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/255l_2 ) + + # execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + # ${CMAKE_CURRENT_SOURCE_DIR}/../compo_data/255l_2 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/255l_2 ) + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/ifsdata ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/ifsdata ) + + if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/params" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/params ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/params ) + endif() + + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/setup ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/setup ) + + if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/postprocessing" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET}/postprocessing ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}/postprocessing ) + endif() + + ecbuild_add_test( TARGET ifs_t255_${TARGET} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${TARGET} + COMMAND "./ifs-run" + DEPENDS ${TEST_DEPENDS} + ) + set_property(TEST ifs_t255_${TARGET} APPEND PROPERTY LABELS t255) + +endfunction() + +################################################################# +# add tests + +add_ifs_test( test_compo_fc_m7 ) + +# Test which can only be run if OOPS-IFS has been compiled: +# if( ifs_HAVE_OOPS ) +# add_ifs_test( test_compo_fc_dualconf ) +# endif() + + +if( ENABLE_TESTS ) + + set_property(TEST ifs_t255_test_compo_fc_m7 APPEND PROPERTY LABELS forecast mpi threading composition m7) + +endif() diff --git a/ifs-test/tests/t255/common/CMakeLists.txt b/ifs-test/tests/t255/common/CMakeLists.txt new file mode 100644 index 00000000..0716ebff --- /dev/null +++ b/ifs-test/tests/t255/common/CMakeLists.txt @@ -0,0 +1,19 @@ +# (C) Copyright 1996-2019 ECMWF. +# (C) Copyright 2024 KNMI. + +configure_file(env_vars env_vars COPYONLY) +configure_file(namelists namelists COPYONLY) + +# === Specific for m7 tests ============================================= + +configure_file(m7/m7_aero.nml namelist_m7_aero COPYONLY) +configure_file(m7/m7_aerowvldiag.nml namelist_m7_aerowvldiag COPYONLY) +configure_file(m7/m7_chem.nml namelist_m7_chem COPYONLY) +configure_file(m7/m7_compoemis.nml namelist_m7_compoemis COPYONLY) +configure_file(m7/fort.4-oac-adapted fort.4-oac-adapted COPYONLY) + +# === Parts that are replicated from test_compo_fc ==================== + +configure_file(aer/aer_yaerodesc.nml namelist_aer_yaerodesc COPYONLY) +configure_file(aer/aer_chem.nml namelist_aer_chem COPYONLY) +configure_file(aer/aer_compoemis.nml namelist_aer_compoemis COPYONLY) diff --git a/ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml b/ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml new file mode 100644 index 00000000..3cddf1e5 --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_aerowvldiag.nml @@ -0,0 +1,46 @@ +cat >> fort.4 << EOF +NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +EOF + + diff --git a/ifs-test/tests/t255/common/aer/aer_chem.nml b/ifs-test/tests/t255/common/aer/aer_chem.nml new file mode 100644 index 00000000..6c508241 --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_chem.nml @@ -0,0 +1,675 @@ +cat >> fort.4 << EOF +NGHG=2, +YLRCH4_NL%CNAME='kCH4', +YLRCH4_NL%IGRBCODE=210071, +YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +YGHG_NL(1)%CNAME='CO2_GHG', +YGHG_NL(1)%IGRBCODE=210061, +YGHG_NL(1)%LADV5=true, +YGHG_NL(1)%LASSIM=true, +YGHG_NL(1)%LMASSFIX=true, +YGHG_NL(1)%LNEGFIX=.FALSE., +YGHG_NL(1)%LQM=false, +YGHG_NL(1)%LQM3D=true, +YGHG_NL(1)%BETAMFBC=2, +YGHG_NL(2)%CNAME='CH4_GHG', +YGHG_NL(2)%IGRBCODE=210062, +YGHG_NL(2)%LADV5=true, +YGHG_NL(2)%LASSIM=true, +YGHG_NL(2)%LMASSFIX=true, +YGHG_NL(2)%LNEGFIX=.FALSE., +YGHG_NL(2)%LQM=false, +YGHG_NL(2)%LQM3D=true, +YGHG_NL(2)%BETAMFBC=2, +NCHEM=57, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=1, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485, +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.FALSE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e4, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LMASSFIX=.TRUE., +YCHEM_NL(27)%BETAMFBC=-999.9, +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0 +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LMASSFIX=.TRUE., +YCHEM_NL(31)%BETAMFBC=-999.9, +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LMASSFIX=.TRUE., +YCHEM_NL(32)%BETAMFBC=-999.9, +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LMASSFIX=.TRUE., +YCHEM_NL(41)%BETAMFBC=-999.9, +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LADV=.FALSE., +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=0, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=0, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=0, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=0, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=0, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='NOXA', +YCHEM_NL(57)%NREQIN=0, +YCHEM_NL(57)%RMOLMASS=46.0, +YCHEM_NL(57)%IGRBCODE=217056, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218056, +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +NGFL_EXT=4, +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='DDVEL', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=212250, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +YEXT_NL(3)%CNAME='DDFLXA', +YEXT_NL(3)%NREQIN=0, +YEXT_NL(3)%IGRBCODE=212251, +YEXT_NL(3)%LADV=.FALSE., +YEXT_NL(3)%LGP=.TRUE., +YEXT_NL(3)%LGPINGP=.TRUE., +YEXT_NL(4)%CNAME='WDFLXA', +YEXT_NL(4)%NREQIN=0, +YEXT_NL(4)%IGRBCODE=212252, +YEXT_NL(4)%LADV=.FALSE., +YEXT_NL(4)%LGP=.TRUE., +YEXT_NL(4)%LGPINGP=.TRUE., +EOF diff --git a/ifs-test/tests/t255/common/aer/aer_compoemis.nml b/ifs-test/tests/t255/common/aer/aer_compoemis.nml new file mode 100644 index 00000000..d3778767 --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_compoemis.nml @@ -0,0 +1,51 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS THIS%SPECIES='ALD2', THIS%SECTOR='All', THIS%PARAMID=219012, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.2, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210031, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210040, THIS%SCALING=0.8, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Black-carbon_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210032, THIS%SCALING=0.8 / +&NAMCOMPO_EMIS THIS%SPECIES='C10H16', THIS%SECTOR='All', THIS%PARAMID=219049, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H4', THIS%SECTOR='All', THIS%PARAMID=219010, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H5OH', THIS%SECTOR='All', THIS%PARAMID=219046, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='C2H6', THIS%SECTOR='All', THIS%PARAMID=219045, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H6', THIS%SECTOR='All', THIS%PARAMID=219048, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C3H8', THIS%SECTOR='All', THIS%PARAMID=219047, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='C5H8', THIS%SECTOR='All', THIS%PARAMID=219016, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.0, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH2O', THIS%SECTOR='All', THIS%PARAMID=219008, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCH3', THIS%SECTOR='All', THIS%PARAMID=219052, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3COCHO', THIS%SECTOR='All', THIS%PARAMID=219023, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='CH3OH', THIS%SECTOR='All', THIS%PARAMID=219042, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='AllButBiomassBur', THIS%PARAMID=210070, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CH4_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210082, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO', THIS%SECTOR='All', THIS%PARAMID=219005, THIS%DIURNAL_CYCLE_TYPE='AnthroCO', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Anthropogenic', THIS%PARAMID=210069, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Aviation', THIS%PARAMID=212253, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210080, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='CO2_GHG', THIS%SECTOR='Ocean', THIS%PARAMID=210067, THIS%SCALING=-1.0 / +&NAMCOMPO_EMIS THIS%SPECIES='DMS', THIS%SECTOR='All', THIS%PARAMID=219018, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='HCOOH', THIS%SECTOR='All', THIS%PARAMID=219043, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='ISPD', THIS%SECTOR='All', THIS%PARAMID=219050, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='MCOOH', THIS%SECTOR='All', THIS%PARAMID=219044, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.25, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='NH3', THIS%SECTOR='All', THIS%PARAMID=219019, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_AGS', THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='NO', THIS%SECTOR='AllButAviation', THIS%PARAMID=219027, THIS%DIURNAL_CYCLE_TYPE='AnthroNOx', THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS THIS%SPECIES='NO2', THIS%SECTOR='Aviation', THIS%PARAMID=212255, THIS%SCALING=1.5333333333333333333, THIS%VERTICAL_PROFILE_TYPE='3D' / +&NAMCOMPO_EMIS THIS%SPECIES='OLE', THIS%SECTOR='All', THIS%PARAMID=219011, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119, THIS%LEGACY_CHEM_OVERRIDE=16 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_A', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='AnthroSecondary', THIS%PARAMID=216007, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=12.0, THIS%DIURNAL_BASELINE=0.2 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biogenic/biofuel', THIS%PARAMID=210033, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='AnthroCO' / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='BiogenicSecondary', THIS%PARAMID=210039, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Biomass-burning', THIS%PARAMID=210041, THIS%SCALING=0.5, THIS%DIURNAL_CYCLE_TYPE='GFAS', THIS%DIURNAL_PEAK_HOUR=13.5, THIS%DIURNAL_BASELINE=0.2, THIS%VERTICAL_PROFILE_TYPE='GFAS', THIS%VERTICAL_PARAMID=210119 / +&NAMCOMPO_EMIS THIS%SPECIES='Organic-matter_B', THIS%SECTOR='Fossil-fuel', THIS%PARAMID=210034, THIS%SCALING=0.5 / +&NAMCOMPO_EMIS THIS%SPECIES='PAR', THIS%SECTOR='All', THIS%PARAMID=219009, THIS%DIURNAL_CYCLE_TYPE='VOC', THIS%DIURNAL_PEAK_HOUR=14.0, THIS%DIURNAL_BASELINE=0.65, THIS%LEGACY_CHEM_OVERRIDE=3 / +&NAMCOMPO_EMIS THIS%SPECIES='Rn', THIS%SECTOR='All', THIS%PARAMID=219025, THIS%LEGACY_CHEM_OVERRIDE=1 / +&NAMCOMPO_EMIS THIS%SPECIES='SO2', THIS%SECTOR='All', THIS%PARAMID=219017, THIS%DIURNAL_CYCLE_TYPE='CAMS_GLOB_ENE', THIS%VERTICAL_PROFILE_TYPE="AltitudeMap", THIS%VERTICAL_PARAMID=216045, THIS%VERTICAL_BASE_LEVEL=-1, THIS%VERTICAL_TOP_LEVEL=-4, THIS%VERTICAL_THRESHOLD=200, THIS%LEGACY_CHEM_OVERRIDE=11 / +&NAMCOMPO_EMIS / + +EOF diff --git a/ifs-test/tests/t255/common/aer/aer_yaerodesc.nml b/ifs-test/tests/t255/common/aer/aer_yaerodesc.nml new file mode 100644 index 00000000..f14cf4ce --- /dev/null +++ b/ifs-test/tests/t255/common/aer/aer_yaerodesc.nml @@ -0,0 +1,163 @@ +cat >> fort.4 << EOF +NTYPAER=3,3,2,2,1,2,1,2,0,0, +YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, +EOF diff --git a/ifs-test/tests/t255/common/env_vars b/ifs-test/tests/t255/common/env_vars new file mode 100644 index 00000000..76761244 --- /dev/null +++ b/ifs-test/tests/t255/common/env_vars @@ -0,0 +1,24 @@ +# Environment variables inherited by all t21 tests: + +export OMP_STACKSIZE="64M" + +export CRAYBLAS_AUTOTUNING_OFF=1 +export ATP_ENABLED=1 + +export MPICH_RANK_REORDER_DISPLAY=1 + +export GRIB_API_IO_BUFFER_SIZE=4194304 +export GRIB_API_WRITE_ON_FAIL=0 +export GRIB_API_LARGE_CONSTANT_FIELDS=1 + +export DR_HOOK=1 +export DR_HOOK_IGNORE_SIGNALS=0 + +export DR_HOOK_OPT="prof" +export DATA=${WORK_DIR} + +export FDB_DEBUG=no +export FDB_IO=aio +export TRACEBACK_LEVEL=2 + +export MPICH_MAX_THREAD_SAFETY=multiple diff --git a/ifs-test/tests/t255/common/m7/fort.4-oac-adapted b/ifs-test/tests/t255/common/m7/fort.4-oac-adapted new file mode 100644 index 00000000..91b1c6e2 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/fort.4-oac-adapted @@ -0,0 +1,4995 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +!B +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=.true. +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAERAD +CRTABLEDIR='./ifsdata/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=0 +NAEROOPT=2 +NCLOUDACT=0 +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=.false. +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=256 +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=256 +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=40, +NACTAERO=39, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=1, + +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=1, + +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=1, + +YAERO_NL(4)%CNAME='AS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=1, +YAERO_NL(5)%CNAME='SO4_AS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=1, +YAERO_NL(6)%CNAME='BC_AS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=1, +YAERO_NL(7)%CNAME='POM_AS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=1, +YAERO_NL(8)%CNAME='SS_AS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=1, +YAERO_NL(9)%CNAME='DU_AS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=1, +YAERO_NL(10)%CNAME='SOA_NS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=1, +YAERO_NL(11)%CNAME='SOA_KS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=1, +YAERO_NL(12)%CNAME='SOA_AS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=1, +YAERO_NL(13)%CNAME='SOA_CS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=1, +YAERO_NL(14)%CNAME='SOA_KI', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=1, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=1, +YAERO_NL(16)%CNAME='KI_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=1, +YAERO_NL(17)%CNAME='BC_KI', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=1, +YAERO_NL(18)%CNAME='POM_KI', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='AI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=1, +YAERO_NL(20)%CNAME='DU_AI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=1, +YAERO_NL(21)%CNAME='KS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=1, +YAERO_NL(22)%CNAME='SO4_KS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=1, +YAERO_NL(23)%CNAME='BC_KS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=1, +YAERO_NL(24)%CNAME='POM_KS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=1, +YAERO_NL(25)%CNAME='CI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=1, +YAERO_NL(26)%CNAME='DU_CI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=1, +YAERO_NL(27)%CNAME='CS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=1, +YAERO_NL(28)%CNAME='SO4_CS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=1, +YAERO_NL(29)%CNAME='BC_CS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=1, +YAERO_NL(30)%CNAME='POM_CS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=1, +YAERO_NL(31)%CNAME='SS_CS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=1, +YAERO_NL(32)%CNAME='DU_CS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=1, +YAERO_NL(33)%CNAME='NS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=1, +YAERO_NL(34)%CNAME='SO4_NS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=1, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=1, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=1, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=1, + +YAERO_NL(38)%CNAME='CDNC', +YAERO_NL(38)%NREQIN=0, +YAERO_NL(38)%IGRBCODE=212037, +YAERO_NL(38)%LQM=.TRUE., +YAERO_NL(38)%LQM3D=.FALSE., +YAERO_NL(38)%LMASSFIX=.TRUE., +YAERO_NL(38)%BETAMFBC=-999.9, + +YAERO_NL(39)%CNAME='ICNC', +YAERO_NL(39)%NREQIN=0, +YAERO_NL(39)%IGRBCODE=212038, +YAERO_NL(39)%LQM=.TRUE., +YAERO_NL(39)%LQM3D=.FALSE., +YAERO_NL(39)%LMASSFIX=.TRUE., +YAERO_NL(39)%BETAMFBC=-999.9, + +YAERO_NL(40)%CNAME='Total_aerosol', +YAERO_NL(40)%IGRBCODE=210048, +YAERO_NL(40)%LADV5=true, + + +NAEROUT=45, +YAEROUT_NL(1)%CNAME='AEROUT-1', +YAEROUT_NL(1)%IGRBCODE=219001, +YAEROUT_NL(2)%CNAME='AEROUT-2', +YAEROUT_NL(2)%IGRBCODE=219002, +YAEROUT_NL(3)%CNAME='AEROUT-3', +YAEROUT_NL(3)%IGRBCODE=219003, +YAEROUT_NL(4)%CNAME='AEROUT-4', +YAEROUT_NL(4)%IGRBCODE=219004, +YAEROUT_NL(5)%CNAME='AEROUT-5', +YAEROUT_NL(5)%IGRBCODE=219005, +YAEROUT_NL(6)%CNAME='AEROUT-6', +YAEROUT_NL(6)%IGRBCODE=219006, +YAEROUT_NL(7)%CNAME='AEROUT-7', +YAEROUT_NL(7)%IGRBCODE=219007, +YAEROUT_NL(8)%CNAME='AEROUT-8', +YAEROUT_NL(8)%IGRBCODE=219008, +YAEROUT_NL(9)%CNAME='AEROUT-9', +YAEROUT_NL(9)%IGRBCODE=219009, +YAEROUT_NL(10)%CNAME='AEROUT-10', +YAEROUT_NL(10)%IGRBCODE=219010, +YAEROUT_NL(11)%CNAME='AEROUT-11', +YAEROUT_NL(11)%IGRBCODE=219011, +YAEROUT_NL(12)%CNAME='AEROUT-12', +YAEROUT_NL(12)%IGRBCODE=219012, +YAEROUT_NL(13)%CNAME='AEROUT-13', +YAEROUT_NL(13)%IGRBCODE=219013, +YAEROUT_NL(14)%CNAME='AEROUT-14', +YAEROUT_NL(14)%IGRBCODE=219014, +YAEROUT_NL(15)%CNAME='AEROUT-15', +YAEROUT_NL(15)%IGRBCODE=219015, +YAEROUT_NL(16)%CNAME='AEROUT-16', +YAEROUT_NL(16)%IGRBCODE=219016, +YAEROUT_NL(17)%CNAME='AEROUT-17', +YAEROUT_NL(17)%IGRBCODE=219017, +YAEROUT_NL(18)%CNAME='AEROUT-18', +YAEROUT_NL(18)%IGRBCODE=219018, +YAEROUT_NL(19)%CNAME='AEROUT-19', +YAEROUT_NL(19)%IGRBCODE=219019, +YAEROUT_NL(20)%CNAME='AEROUT-20', +YAEROUT_NL(20)%IGRBCODE=219020, +YAEROUT_NL(21)%CNAME='AEROUT-21', +YAEROUT_NL(21)%IGRBCODE=219021, +YAEROUT_NL(22)%CNAME='AEROUT-22', +YAEROUT_NL(22)%IGRBCODE=219022, +YAEROUT_NL(23)%CNAME='AEROUT-23', +YAEROUT_NL(23)%IGRBCODE=219023, +YAEROUT_NL(24)%CNAME='AEROUT-24', +YAEROUT_NL(24)%IGRBCODE=219024, +YAEROUT_NL(25)%CNAME='AEROUT-25', +YAEROUT_NL(25)%IGRBCODE=219025, +YAEROUT_NL(26)%CNAME='AEROUT-26', +YAEROUT_NL(26)%IGRBCODE=219026, +YAEROUT_NL(27)%CNAME='AEROUT-27', +YAEROUT_NL(27)%IGRBCODE=219027, +YAEROUT_NL(28)%CNAME='AEROUT-28', +YAEROUT_NL(28)%IGRBCODE=219028, +YAEROUT_NL(29)%CNAME='AEROUT-29', +YAEROUT_NL(29)%IGRBCODE=219029, +YAEROUT_NL(30)%CNAME='AEROUT-30', +YAEROUT_NL(30)%IGRBCODE=219030, +YAEROUT_NL(31)%CNAME='AEROUT-31', +YAEROUT_NL(31)%IGRBCODE=219031, +YAEROUT_NL(32)%CNAME='AEROUT-32', +YAEROUT_NL(32)%IGRBCODE=219032, +YAEROUT_NL(33)%CNAME='AEROUT-33', +YAEROUT_NL(33)%IGRBCODE=219033, +YAEROUT_NL(34)%CNAME='AEROUT-34', +YAEROUT_NL(34)%IGRBCODE=219034, +YAEROUT_NL(35)%CNAME='AEROUT-35', +YAEROUT_NL(35)%IGRBCODE=219035, +YAEROUT_NL(36)%CNAME='AEROUT-36', +YAEROUT_NL(36)%IGRBCODE=219036, +YAEROUT_NL(37)%CNAME='AEROUT-37', +YAEROUT_NL(37)%IGRBCODE=219037, +YAEROUT_NL(38)%CNAME='AEROUT-38', +YAEROUT_NL(38)%IGRBCODE=219038, +YAEROUT_NL(39)%CNAME='AEROUT-39', +YAEROUT_NL(39)%IGRBCODE=219039, +YAEROUT_NL(40)%CNAME='AEROUT-40', +YAEROUT_NL(40)%IGRBCODE=219040, +YAEROUT_NL(41)%CNAME='AEROUT-41', +YAEROUT_NL(41)%IGRBCODE=219041, +YAEROUT_NL(42)%CNAME='AEROUT-42', +YAEROUT_NL(42)%IGRBCODE=219042, +YAEROUT_NL(43)%CNAME='AEROUT-43', +YAEROUT_NL(43)%IGRBCODE=219043, +YAEROUT_NL(44)%CNAME='AEROUT-44', +YAEROUT_NL(44)%IGRBCODE=219044, +YAEROUT_NL(45)%CNAME='AEROUT-45', +YAEROUT_NL(45)%IGRBCODE=219045, + + +LAERAOT=false, +LAERLISI=false, +NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=5, +NFP3DFP=5, +NFP3DFT=1, +NFP3DFV=1, +MFP3DFS(:)=130,135,138,155,133, +MFP3DFP(:)=129,130,135,138,155, +MFP3DFT=60, +MFP3DFV=133, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=1, +MFPPHY(:)=31, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='t48' +/ +&NAMARG +NCONF=1, +CNMEXP='ham7' +/ +&NAMRLX +/ +&NAEAER +NTYPAER=3,3,2,2,1,2,1,2,0,0, +YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, +LAERVOL=false, +NDRYDEPVEL_DYN=2, +LAERDUSTSOURCE=true, +LAERDUSTSIZEVAR=true, +LAERDUST_NEWBIN=false, +RAERDUST_REBOUND=0.1, +LAERNGAT=true, +NAERSCAV=3, +LAERGTOP=true, +LAERHYGRO=true, +LAERSEDIM=true, +LAERSEDIMSS=true, +LAERDRYDP=true, +LAERSURF=true, +NSSALT=1, +NDDUST=3, +NSO4SCHEME=1, +LSEASALT_RH80=true, +LAERRRTM=true, +/ +&NAMCOMPO +LCHEM_DIA=true +LCHEM_DDFLX=true, +LCOMPO_DDFLX_DIR=true, +LCHEM_TROPO=true, +LCOMPO_DCDD=true, +LAERNITRATE=false, +LAEREQSAM4CLIM=false, +LAERSOA=false, +LAERSOA_COUPLED=false, +KGHG_CHEMTEND_CH4=0, +LAERNUCL=true, +AERO_SCHEME="hamm7", + + +/ +&NAMCHEM +CHEM_SCHEME='tm5' +LCHEM_DIAC=.false. +LCHEM_LIGHT=false, + +KCHEM_WETDEP=2, +LCHEM_0NOX=false, +KCHEM_NOXADV=0, +LCHEM_ANAO3=false, +KCHEM_SOLVE=2 +LCHEM_REVCHEM=false, +LCHEM_BASCOE_JON=false, +LCHEM_BASCOE_HETCHEM=true, +LCHEM_EXTENDJNO2=true, +LCHEM_JOUT=false, +LCHEM_AEROI=.false. +LCHEM_O3RAD=true, +KCHEM_DRYDEP=3, +LCHEM_CSHAPE=.false., +LCHEM_WDFR=.true., +/ +&NAMVAR +LMODERR=.false., +LJCDFI=.false., +LUSEJCDFI=.false., +LECV=false, +/ +&NAETLDIAG +/ +&NAMVV0 +LLFORCE_READ=false, +/ +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="awb" + THIS%PARAMID=216145 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="com" + THIS%PARAMID=216121 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216142 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="com" + THIS%PARAMID=216119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="awb" + THIS%PARAMID=216123 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="com" + THIS%PARAMID=212101 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="awb" + THIS%PARAMID=216124 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="com" + THIS%PARAMID=212102 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="com" + THIS%PARAMID=212103 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="awb" + THIS%PARAMID=216126 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="com" + THIS%PARAMID=212104 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="awb" + THIS%PARAMID=216127 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="com" + THIS%PARAMID=212105 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="awb" + THIS%PARAMID=216128 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="com" + THIS%PARAMID=212106 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="awb" + THIS%PARAMID=216129 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="com" + THIS%PARAMID=212107 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="awb" + THIS%PARAMID=216130 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="com" + THIS%PARAMID=212108 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="awb" + THIS%PARAMID=216131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="com" + THIS%PARAMID=212109 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="com" + THIS%PARAMID=212245 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="awb" + THIS%PARAMID=216133 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="com" + THIS%PARAMID=212246 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emi_oceans" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212247 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212248 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="awb" + THIS%PARAMID=216134 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="com" + THIS%PARAMID=212249 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="TotalSoilEmis" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="awb" + THIS%PARAMID=216135 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="com" + THIS%PARAMID=212250 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="awb" + THIS%PARAMID=216136 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="com" + THIS%PARAMID=212251 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="awb" + THIS%PARAMID=216137 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="com" + THIS%PARAMID=212252 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216143 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="com" + THIS%PARAMID=216120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="awb" + THIS%PARAMID=216138 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="com" + THIS%PARAMID=216114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ags" + THIS%PARAMID=216117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="awb" + THIS%PARAMID=216141 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="com" + THIS%PARAMID=216118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="awb" + THIS%PARAMID=216139 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="com" + THIS%PARAMID=216115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="awb" + THIS%PARAMID=216140 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="com" + THIS%PARAMID=216116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ diff --git a/ifs-test/tests/t255/common/m7/m7_aero.nml b/ifs-test/tests/t255/common/m7/m7_aero.nml new file mode 100644 index 00000000..03f2aec9 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_aero.nml @@ -0,0 +1,411 @@ +cat >> fort.4 <> fort.4 << EOF +NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +EOF + + diff --git a/ifs-test/tests/t255/common/m7/m7_chem.nml b/ifs-test/tests/t255/common/m7/m7_chem.nml new file mode 100644 index 00000000..454a91b7 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_chem.nml @@ -0,0 +1,1120 @@ +cat >> fort.4 << EOF +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +!YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +!YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +!YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +!YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +!YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +!YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +!YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +!YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +!YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +!YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +!YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +!YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +!YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +!YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +!YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +!YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +!YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +!YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +!YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +!YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +!YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +!YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +!YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +!YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +!YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +!YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +!YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +!YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +!YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +!YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +!YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +!YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +!YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +!YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +!YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +!YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +!YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +!YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +!YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +!YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +!YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +!YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +!YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +!YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +!YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +!YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +!YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +!YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +!YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +!YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +!YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +!YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +!YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +!YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +!YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +!YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +!YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +!YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +!YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +!YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +!YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +!YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +!YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +!YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +!YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +!YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +!YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +!YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +!YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +!YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +!YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +!YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +!YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +!YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +NGFL_EXT=1, +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +!YEXT_NL(2)%CNAME='KCH4CHEM', +!YEXT_NL(2)%NREQIN=0, +!YEXT_NL(2)%IGRBCODE=210071, +!YEXT_NL(2)%LADV=.FALSE., +!YEXT_NL(2)%LGP=.TRUE., +!YEXT_NL(2)%LGPINGP=.TRUE., +EOF diff --git a/ifs-test/tests/t255/common/m7/m7_compoemis.nml b/ifs-test/tests/t255/common/m7/m7_compoemis.nml new file mode 100644 index 00000000..097df8e7 --- /dev/null +++ b/ifs-test/tests/t255/common/m7/m7_compoemis.nml @@ -0,0 +1,2604 @@ +cat >> fort.4 << EOF + +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="awb" + THIS%PARAMID=216145 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="com" + THIS%PARAMID=216121 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216142 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="com" + THIS%PARAMID=216119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="BC_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="awb" + THIS%PARAMID=216123 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="com" + THIS%PARAMID=212101 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="awb" + THIS%PARAMID=216124 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="com" + THIS%PARAMID=212102 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="com" + THIS%PARAMID=212103 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="awb" + THIS%PARAMID=216126 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="com" + THIS%PARAMID=212104 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="awb" + THIS%PARAMID=216127 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="com" + THIS%PARAMID=212105 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="awb" + THIS%PARAMID=216128 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="com" + THIS%PARAMID=212106 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="awb" + THIS%PARAMID=216129 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="com" + THIS%PARAMID=212107 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="awb" + THIS%PARAMID=216130 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="com" + THIS%PARAMID=212108 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="awb" + THIS%PARAMID=216131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="com" + THIS%PARAMID=212109 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="com" + THIS%PARAMID=212245 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="awb" + THIS%PARAMID=216133 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="com" + THIS%PARAMID=212246 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emi_oceans" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212247 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="com" + THIS%PARAMID=212248 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="awb" + THIS%PARAMID=216134 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="com" + THIS%PARAMID=212249 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="TotalSoilEmis" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="awb" + THIS%PARAMID=216135 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="com" + THIS%PARAMID=212250 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="awb" + THIS%PARAMID=216136 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="com" + THIS%PARAMID=212251 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="awb" + THIS%PARAMID=216137 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="com" + THIS%PARAMID=212252 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PSD_RADIUS=0.03e-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="awb" + THIS%PARAMID=216143 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="com" + THIS%PARAMID=216120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="POM_KI" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%PSD_RADIUS=0.03E-6 + THIS%PSD_SIGMA=1.59 + THIS%PSD_N0_TRACER="KI_N" + THIS%MASS_DENSITY=1300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="awb" + THIS%PARAMID=216138 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="com" + THIS%PARAMID=216114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ags" + THIS%PARAMID=216117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="awb" + THIS%PARAMID=216141 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="com" + THIS%PARAMID=216118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="awb" + THIS%PARAMID=216139 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="com" + THIS%PARAMID=216115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="awb" + THIS%PARAMID=216140 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="com" + THIS%PARAMID=216116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + +EOF diff --git a/ifs-test/tests/t255/common/namelist_m7_from_openifsrun b/ifs-test/tests/t255/common/namelist_m7_from_openifsrun new file mode 100644 index 00000000..fbcaa40a --- /dev/null +++ b/ifs-test/tests/t255/common/namelist_m7_from_openifsrun @@ -0,0 +1,4775 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=0, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +NOUTTYPE=1, +LSPLIT=true, +NWRTOUT=4, +NFLDIN=0, +NSTRIN=1, +/ +&NAMPAR0 +LXML_STATS=false, +LSTATS=true, +LDETAILED_STATS=false, +LSYNCSTATS=false, +LSTATSCPU=false, +NPRNT_STATS=512, +LBARRIER_STATS=false, +LBARRIER_STATS2=false, +NPROC=512, +NSPECRESMIN=256, +NOUTPUT=1, +MP_TYPE=1, +MBX_SIZE=0, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NFRDHP=12, +NFRDHFD=1, +NFRSDI=1, +NFRPOS=6, +NFRHIS=6, +NFRMASSCON=1, +NFPOS=2, +NPOSTS=0, +NHISTS=0, +NMASSCONS=0, +NFRCO=4, +NFRDHFZ=48, +NDHFZTS=0, +NDHFDTS=0, +NUNDEFLD=-999999, +CMETER="ecflow_client --meter", +CEVENT="ecflow_client --event", +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=20, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=340, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210217,215096,215114,215132,215150, +YAERO_WVL_DIAG_NL(3)%IWVL=355, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210218,215097,215115,215133,215151, +YAERO_WVL_DIAG_NL(4)%IWVL=380, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(5)%IWVL=400, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210220,215099,215117,215135,215153, +YAERO_WVL_DIAG_NL(6)%IWVL=440, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(7)%IWVL=469, +YAERO_WVL_DIAG_NL(7)%IGRIBDIAG=210213,215101,215119,215137,215155, +YAERO_WVL_DIAG_NL(8)%IWVL=500, +YAERO_WVL_DIAG_NL(8)%IGRIBDIAG=210222,215102,215120,215138,215156, +YAERO_WVL_DIAG_NL(9)%IWVL=532, +YAERO_WVL_DIAG_NL(9)%IGRIBDIAG=210223,215103,215121,215139,215157, +YAERO_WVL_DIAG_NL(10)%IWVL=645, +YAERO_WVL_DIAG_NL(10)%IGRIBDIAG=210224,215105,215123,215141,215159, +YAERO_WVL_DIAG_NL(11)%IWVL=670, +YAERO_WVL_DIAG_NL(11)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(12)%IWVL=800, +YAERO_WVL_DIAG_NL(12)%IGRIBDIAG=210225,215107,215125,215143,215161, +YAERO_WVL_DIAG_NL(13)%IWVL=858, +YAERO_WVL_DIAG_NL(13)%IGRIBDIAG=210226,215108,215126,215144,215162, +YAERO_WVL_DIAG_NL(14)%IWVL=865, +YAERO_WVL_DIAG_NL(14)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(15)%IWVL=1020, +YAERO_WVL_DIAG_NL(15)%IGRIBDIAG=210227,215110,215128,215146,215164, +YAERO_WVL_DIAG_NL(16)%IWVL=1064, +YAERO_WVL_DIAG_NL(16)%IGRIBDIAG=210228,215111,215129,215147,215165, +YAERO_WVL_DIAG_NL(17)%IWVL=1240, +YAERO_WVL_DIAG_NL(17)%IGRIBDIAG=210216,215112,215130,215148,215166, +YAERO_WVL_DIAG_NL(18)%IWVL=1640, +YAERO_WVL_DIAG_NL(18)%IGRIBDIAG=210229,215113,215131,215149,215167, +YAERO_WVL_DIAG_NL(19)%IWVL=2130, +YAERO_WVL_DIAG_NL(19)%IGRIBDIAG=210230,215176,215177,215178,215179, +YAERO_WVL_DIAG_NL(20)%IWVL=10000, +YAERO_WVL_DIAG_NL(20)%IGRIBDIAG=216008,216009,216010,216011,216012, +LAERCHEM=true, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=96, +NFP3DFP=31, +NFP3DFT=25, +NFP3DFV=25, +MFP3DFS(:)=130,135,138,155,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210129,217003,217004,210123,217006,217007,210124,217009,217010,217011,217012,217013,217014,217015,217016,210122,217018,217019,217020,217021,217022,217023,217024,210181,217026,217027,217028,217029,217030,210121,217032,217033,217034,217035,217036,217037,217038,217039,217040,217041,217042,217043,217044,217045,217046,217047,217048,217049,217050,217051,217052,217053,217054,217055,217189,217225,217086,217226,217224,217100,217099,217222,217227,217228,217161,217107,217101,217118,217229,217230,217186,217187,217188,210071, +MFP3DFP(:)=129,130,135,138,155,157,133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFT=60,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +MFP3DFV=133,210001,210002,210003,210004,210005,210006,210007,210008,210009,210010,210011,210247,210248,210249,210252,210253,210203,210123,217006,210124,210122,217019,217027,210121, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=260, +MFPPHY(:)=31,32,33,34,35,36,37,38,39,40,41,42,44,45,47,49,50,57,58,59,78,79,129,134,136,137,139,141,142,143,228,144,145,146,147,148,151,159,164,165,166,167,168,169,170,172,175,176,177,178,179,180,181,182,183,186,187,188,189,195,196,197,198,201,202,205,208,209,210,211,235,236,238,243,244,245,229,230,231,232,213,212,8,9,228080,228081,228082,228083,228084,228085,228089,228090,228001,260121,260123,3020,228029,228251,228216,228217,228218,228219,228220,228221,260015,151131,151132,228141,228038,215022,215019,210208,215023,215020,215024,215021,215046,215043,210209,215047,215044,215048,215045,215064,215062,210210,215063,215061,215080,215078,210211,215079,215077,215088,215087,210212,215203,215201,210250,215204,215202,216042,215211,210251,216098,215218,215226,216099,215225,210072,210073,210074,210207,215104,215122,215140,215158,210217,215096,215114,215132,215150,210218,215097,215115,215133,215151,210219,215098,215116,215134,215152,210220,215099,215117,215135,215153,210221,215100,215118,215136,215154,210213,215101,215119,215137,215155,210222,215102,215120,215138,215156,210223,215103,215121,215139,215157,210224,215105,215123,215141,215159,210214,215106,215124,215142,215160,210225,215107,215125,215143,215161,210226,215108,215126,215144,215162,210215,215109,215127,215145,215163,210227,215110,215128,215146,215164,210228,215111,215129,215147,215165,210216,215112,215130,215148,215166,210229,215113,215131,215149,215167,210230,215176,215177,215178,215179,216008,216009,216010,216011,216012,210206,210127,218006,210128,210126,218019,218027,210125, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h240', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=true, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=true, + LAERSOA_COUPLED=true, + KGHG_CHEMTEND_CH4=1, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.2 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_A" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.2 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.8 + THIS%PARAMID=210091 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ene" + THIS%PARAMID=212221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="fef" + THIS%PARAMID=212222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ind" + THIS%PARAMID=212223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="ref" + THIS%PARAMID=212229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="res" + THIS%PARAMID=212224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="shp" + THIS%PARAMID=212225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="swd" + THIS%PARAMID=212226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Black-carbon_B" + THIS%SECTOR="tro" + THIS%PARAMID=212228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.8 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_A" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%SCALING=0.5 + THIS%PARAMID=210090 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ene" + THIS%PARAMID=212231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="fef" + THIS%PARAMID=212232 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ind" + THIS%PARAMID=212233 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="ref" + THIS%PARAMID=212239 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="res" + THIS%PARAMID=212234 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="shp" + THIS%PARAMID=212235 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="swd" + THIS%PARAMID=212236 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tnr" + THIS%PARAMID=212237 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Organic-matter_B" + THIS%SECTOR="tro" + THIS%PARAMID=212238 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" + THIS%SCALING=0.5 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=true, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t255/common/namelist_m7_ok b/ifs-test/tests/t255/common/namelist_m7_ok new file mode 100644 index 00000000..bad30aea --- /dev/null +++ b/ifs-test/tests/t255/common/namelist_m7_ok @@ -0,0 +1,4390 @@ +&NAMIOS +CFRCF="./rcf", +CIOSPRF="./srf", +/ +&NAMGRIB +CFCLASS="rd", +NCYCLE=154, +/ +&NAMCVER +LVERTFE=true, +NVSCH=3, +LVFE_GWMPA=true, +LVFE_GW=false, +LVFE_Z_TERM=false, +LVFE_X_TERM=false, +LVFE_LAPL_BC=true, +LVFE_LAPL=true, +NDLNPR=0, +/ +&NAMMCC +LMCC_COMPO=false, +LMCCEC=true, +LMCCIEC=false, +/ +&NAMTRANS +LUSEFLT=false, +LFFTW=false, +/ +&NAMRES +NFRRES=1, +NRESTS(:)=-1,-32767, +/ +&NAERAD +CRTABLEDIR='./rtables/', +LECOMPGRID=false, +RMUZUV=0.01, +NUVTIM=72, +NRADUV=1, +NUV=24, +LUVPROC=false, +LUVAERP=true, +LO3_CHEM_UV=true, +KMODTS=2, +NAERMACC=1, +NRPROMA=0, +/ +&NAEPHY +LNEEONLINE=true, +LWETONLINE=false, +LBFASCO2=false, +LEPHYS=true, +LEVDIF=true, +LESURF=true, +LECOND=true, +LECUMF=true, +LEPCLD=true, +LEEVAP=true, +LEVGEN=true, +LESSRO=true, +LECURR=false, +LEOCWA=true, +LEGWDG=true, +LEGWWMS=true, +LEOZOC=true, +LEQNGT=true, +LERADI=true, +LERADS=true, +LESICE=true, +LEO3CH=true, +LO3CH_HLO=true, +CO3CHEM="H1.0", +LEDCLD=true, +LDUCTDIA=false, +LDIAGTURB_EC=false, +LELIGHT=false, +LWCOU=true, +LWCOU2W=true, +LWCOUHMF=false, +LWCOURNW=false, +NSTPW=1, +LSLPHY=true, +LESNML=true, +NSNMLWS=2, +LEFARQUHAR=true, +LEOPTSURF=false, +LEAIRCO2COUP=false, +LEC4MAP=true, +LEAGS=false, +/ +&NAMPAR1 +LSPLIT=true, +NFLDIN=0, +NOUTTYPE=1, +NSTRIN=1, +NWRTOUT=4, +/ +&NAMPAR0 +LBARRIER_STATS2=false, +LBARRIER_STATS=false, +LDETAILED_STATS=false, +LSTATS=true, +LSTATSCPU=false, +LSYNCSTATS=false, +LXML_STATS=false, +MBX_SIZE=0, +MP_TYPE=1, +NOUTPUT=1, +NPRNT_STATS=512, +NPROC=512, +NSPECRESMIN=256, +/ +&NAMDYNA +LSLAG=true, +LNHEE=false, +LNHQE=false, +LGRADSP=true, +LCOMAD_GFL=true, +LCOMADH=true, +/ +&NAMDYNCORE +LAQUA=false, +/ +&NAMDYN +LMASCOR=true, +NITMP=3, +/ +&NAMCT0 +CEVENT="ecflow_client --event", +CMETER="ecflow_client --meter", +LARPEGEF=false, +LFDBOP=false, +LSMSSIG=false, +N3DINI=0, +NDHFDTS=0, +NDHFZTS=0, +NFPOS=2, +NFRCO=4, +NFRDHFD=1, +NFRDHFZ=48, +NFRDHP=12, +NFRHIS=6, +NFRMASSCON=1, +NFRPOS=6, +NFRSDI=1, +NHISTS=0, +NMASSCONS=0, +NPOSTS=0, +NUNDEFLD=-999999, +/ +&NAMDDH +BDEDDH(1:6,1)=4.0,1.0,0.0,50.0,0.0,49.0, +NDHKD=120, +LHDZON=false, +LHDEFZ=false, +LHDDOP=false, +LHDEFD=false, +LHDGLB=false, +LHDPRG=false, +LHDHKS=false, +/ +&NAMIO_SERV +NPROCESS_LEVEL=5, +NIO_SERV_METHOD=2, +NMSG_LEVEL_CLIENT=0, +NMSG_LEVEL_SERVER=1, +/ +&NAMGFL +NAERO=37, +NACTAERO=37, +YAERO_NL(1)%CNAME='SO4', +YAERO_NL(1)%IGRBCODE=210011, +YAERO_NL(1)%LMASSFIX=.true., +YAERO_NL(1)%LCOMAD=.true., +YAERO_NL(1)%LQM=.false., +YAERO_NL(1)%LQM3D=.true., +YAERO_NL(1)%BETAMFBC=-999, +YAERO_NL(1)%LADV=.true., +YAERO_NL(1)%NREQIN=0, +YAERO_NL(2)%CNAME='NH4', +YAERO_NL(2)%IGRBCODE=212035, +YAERO_NL(2)%LMASSFIX=.true., +YAERO_NL(2)%LCOMAD=.true., +YAERO_NL(2)%LQM=.false., +YAERO_NL(2)%LQM3D=.true., +YAERO_NL(2)%BETAMFBC=-999, +YAERO_NL(2)%LADV=.true., +YAERO_NL(2)%NREQIN=0, +YAERO_NL(3)%CNAME='NO3_A', +YAERO_NL(3)%IGRBCODE=212036, +YAERO_NL(3)%LMASSFIX=.true., +YAERO_NL(3)%LCOMAD=.true., +YAERO_NL(3)%LQM=.false., +YAERO_NL(3)%LQM3D=.true., +YAERO_NL(3)%BETAMFBC=-999, +YAERO_NL(3)%LADV=.true., +YAERO_NL(3)%NREQIN=0, +YAERO_NL(4)%CNAME='ACS_N', +YAERO_NL(4)%IGRBCODE=212001, +YAERO_NL(4)%LMASSFIX=.true., +YAERO_NL(4)%LCOMAD=.true., +YAERO_NL(4)%LQM=.false., +YAERO_NL(4)%LQM3D=.true., +YAERO_NL(4)%BETAMFBC=-999, +YAERO_NL(4)%LADV=.true., +YAERO_NL(4)%NREQIN=0, +YAERO_NL(5)%CNAME='SO4ACS', +YAERO_NL(5)%IGRBCODE=212002, +YAERO_NL(5)%LMASSFIX=.true., +YAERO_NL(5)%LCOMAD=.true., +YAERO_NL(5)%LQM=.false., +YAERO_NL(5)%LQM3D=.true., +YAERO_NL(5)%BETAMFBC=-999, +YAERO_NL(5)%LADV=.true., +YAERO_NL(5)%NREQIN=0, +YAERO_NL(6)%CNAME='BCACS', +YAERO_NL(6)%IGRBCODE=212003, +YAERO_NL(6)%LMASSFIX=.true., +YAERO_NL(6)%LCOMAD=.true., +YAERO_NL(6)%LQM=.false., +YAERO_NL(6)%LQM3D=.true., +YAERO_NL(6)%BETAMFBC=-999, +YAERO_NL(6)%LADV=.true., +YAERO_NL(6)%NREQIN=0, +YAERO_NL(7)%CNAME='POMACS', +YAERO_NL(7)%IGRBCODE=212004, +YAERO_NL(7)%LMASSFIX=.true., +YAERO_NL(7)%LCOMAD=.true., +YAERO_NL(7)%LQM=.false., +YAERO_NL(7)%LQM3D=.true., +YAERO_NL(7)%BETAMFBC=-999, +YAERO_NL(7)%LADV=.true., +YAERO_NL(7)%NREQIN=0, +YAERO_NL(8)%CNAME='SSACS', +YAERO_NL(8)%IGRBCODE=212005, +YAERO_NL(8)%LMASSFIX=.true., +YAERO_NL(8)%LCOMAD=.true., +YAERO_NL(8)%LQM=.false., +YAERO_NL(8)%LQM3D=.true., +YAERO_NL(8)%BETAMFBC=-999, +YAERO_NL(8)%LADV=.true., +YAERO_NL(8)%NREQIN=0, +YAERO_NL(9)%CNAME='DUACS', +YAERO_NL(9)%IGRBCODE=212006, +YAERO_NL(9)%LMASSFIX=.true., +YAERO_NL(9)%LCOMAD=.true., +YAERO_NL(9)%LQM=.false., +YAERO_NL(9)%LQM3D=.true., +YAERO_NL(9)%BETAMFBC=-999, +YAERO_NL(9)%LADV=.true., +YAERO_NL(9)%NREQIN=0, +YAERO_NL(10)%CNAME='SOANUS', +YAERO_NL(10)%IGRBCODE=212007, +YAERO_NL(10)%LMASSFIX=.true., +YAERO_NL(10)%LCOMAD=.true., +YAERO_NL(10)%LQM=.false., +YAERO_NL(10)%LQM3D=.true., +YAERO_NL(10)%BETAMFBC=-999, +YAERO_NL(10)%LADV=.true., +YAERO_NL(10)%NREQIN=0, +YAERO_NL(11)%CNAME='SOAAIS', +YAERO_NL(11)%IGRBCODE=212008, +YAERO_NL(11)%LMASSFIX=.true., +YAERO_NL(11)%LCOMAD=.true., +YAERO_NL(11)%LQM=.false., +YAERO_NL(11)%LQM3D=.true., +YAERO_NL(11)%BETAMFBC=-999, +YAERO_NL(11)%LADV=.true., +YAERO_NL(11)%NREQIN=0, +YAERO_NL(12)%CNAME='SOAACS', +YAERO_NL(12)%IGRBCODE=212009, +YAERO_NL(12)%LMASSFIX=.true., +YAERO_NL(12)%LCOMAD=.true., +YAERO_NL(12)%LQM=.false., +YAERO_NL(12)%LQM3D=.true., +YAERO_NL(12)%BETAMFBC=-999, +YAERO_NL(12)%LADV=.true., +YAERO_NL(12)%NREQIN=0, +YAERO_NL(13)%CNAME='SOACOS', +YAERO_NL(13)%IGRBCODE=212010, +YAERO_NL(13)%LMASSFIX=.true., +YAERO_NL(13)%LCOMAD=.true., +YAERO_NL(13)%LQM=.false., +YAERO_NL(13)%LQM3D=.true., +YAERO_NL(13)%BETAMFBC=-999, +YAERO_NL(13)%LADV=.true., +YAERO_NL(13)%NREQIN=0, +YAERO_NL(14)%CNAME='SOAAII', +YAERO_NL(14)%IGRBCODE=212011, +YAERO_NL(14)%LMASSFIX=.true., +YAERO_NL(14)%LCOMAD=.true., +YAERO_NL(14)%LQM=.false., +YAERO_NL(14)%LQM3D=.true., +YAERO_NL(14)%BETAMFBC=-999, +YAERO_NL(14)%LADV=.true., +YAERO_NL(14)%NREQIN=0, +YAERO_NL(15)%CNAME='H2OPART', +YAERO_NL(15)%IGRBCODE=212012, +YAERO_NL(15)%LMASSFIX=.true., +YAERO_NL(15)%LCOMAD=.true., +YAERO_NL(15)%LQM=.false., +YAERO_NL(15)%LQM3D=.true., +YAERO_NL(15)%BETAMFBC=-999, +YAERO_NL(15)%LADV=.true., +YAERO_NL(15)%NREQIN=0, +YAERO_NL(16)%CNAME='AII_N', +YAERO_NL(16)%IGRBCODE=212013, +YAERO_NL(16)%LMASSFIX=.true., +YAERO_NL(16)%LCOMAD=.true., +YAERO_NL(16)%LQM=.false., +YAERO_NL(16)%LQM3D=.true., +YAERO_NL(16)%BETAMFBC=-999, +YAERO_NL(16)%LADV=.true., +YAERO_NL(16)%NREQIN=0, +YAERO_NL(17)%CNAME='BCAII', +YAERO_NL(17)%IGRBCODE=212014, +YAERO_NL(17)%LMASSFIX=.true., +YAERO_NL(17)%LCOMAD=.true., +YAERO_NL(17)%LQM=.false., +YAERO_NL(17)%LQM3D=.true., +YAERO_NL(17)%BETAMFBC=-999, +YAERO_NL(17)%LADV=.true., +YAERO_NL(17)%NREQIN=0, +YAERO_NL(18)%CNAME='POMAII', +YAERO_NL(18)%IGRBCODE=212015, +YAERO_NL(18)%LMASSFIX=.true., +YAERO_NL(18)%LCOMAD=.true., +YAERO_NL(18)%LQM=.false., +YAERO_NL(18)%LQM3D=.true., +YAERO_NL(18)%BETAMFBC=-999, +YAERO_NL(18)%LADV=.true., +YAERO_NL(18)%NREQIN=0, +YAERO_NL(19)%CNAME='ACI_N', +YAERO_NL(19)%IGRBCODE=212016, +YAERO_NL(19)%LMASSFIX=.true., +YAERO_NL(19)%LCOMAD=.true., +YAERO_NL(19)%LQM=.false., +YAERO_NL(19)%LQM3D=.true., +YAERO_NL(19)%BETAMFBC=-999, +YAERO_NL(19)%LADV=.true., +YAERO_NL(19)%NREQIN=0, +YAERO_NL(20)%CNAME='DUACI', +YAERO_NL(20)%IGRBCODE=212017, +YAERO_NL(20)%LMASSFIX=.true., +YAERO_NL(20)%LCOMAD=.true., +YAERO_NL(20)%LQM=.false., +YAERO_NL(20)%LQM3D=.true., +YAERO_NL(20)%BETAMFBC=-999, +YAERO_NL(20)%LADV=.true., +YAERO_NL(20)%NREQIN=0, +YAERO_NL(21)%CNAME='AIS_N', +YAERO_NL(21)%IGRBCODE=212018, +YAERO_NL(21)%LMASSFIX=.true., +YAERO_NL(21)%LCOMAD=.true., +YAERO_NL(21)%LQM=.false., +YAERO_NL(21)%LQM3D=.true., +YAERO_NL(21)%BETAMFBC=-999, +YAERO_NL(21)%LADV=.true., +YAERO_NL(21)%NREQIN=0, +YAERO_NL(22)%CNAME='SO4AIS', +YAERO_NL(22)%IGRBCODE=212019, +YAERO_NL(22)%LMASSFIX=.true., +YAERO_NL(22)%LCOMAD=.true., +YAERO_NL(22)%LQM=.false., +YAERO_NL(22)%LQM3D=.true., +YAERO_NL(22)%BETAMFBC=-999, +YAERO_NL(22)%LADV=.true., +YAERO_NL(22)%NREQIN=0, +YAERO_NL(23)%CNAME='BCAIS', +YAERO_NL(23)%IGRBCODE=212020, +YAERO_NL(23)%LMASSFIX=.true., +YAERO_NL(23)%LCOMAD=.true., +YAERO_NL(23)%LQM=.false., +YAERO_NL(23)%LQM3D=.true., +YAERO_NL(23)%BETAMFBC=-999, +YAERO_NL(23)%LADV=.true., +YAERO_NL(23)%NREQIN=0, +YAERO_NL(24)%CNAME='POMAIS', +YAERO_NL(24)%IGRBCODE=212021, +YAERO_NL(24)%LMASSFIX=.true., +YAERO_NL(24)%LCOMAD=.true., +YAERO_NL(24)%LQM=.false., +YAERO_NL(24)%LQM3D=.true., +YAERO_NL(24)%BETAMFBC=-999, +YAERO_NL(24)%LADV=.true., +YAERO_NL(24)%NREQIN=0, +YAERO_NL(25)%CNAME='COI_N', +YAERO_NL(25)%IGRBCODE=212022, +YAERO_NL(25)%LMASSFIX=.true., +YAERO_NL(25)%LCOMAD=.true., +YAERO_NL(25)%LQM=.false., +YAERO_NL(25)%LQM3D=.true., +YAERO_NL(25)%BETAMFBC=-999, +YAERO_NL(25)%LADV=.true., +YAERO_NL(25)%NREQIN=0, +YAERO_NL(26)%CNAME='DUCOI', +YAERO_NL(26)%IGRBCODE=212023, +YAERO_NL(26)%LMASSFIX=.true., +YAERO_NL(26)%LCOMAD=.true., +YAERO_NL(26)%LQM=.false., +YAERO_NL(26)%LQM3D=.true., +YAERO_NL(26)%BETAMFBC=-999, +YAERO_NL(26)%LADV=.true., +YAERO_NL(26)%NREQIN=0, +YAERO_NL(27)%CNAME='COS_N', +YAERO_NL(27)%IGRBCODE=212024, +YAERO_NL(27)%LMASSFIX=.true., +YAERO_NL(27)%LCOMAD=.true., +YAERO_NL(27)%LQM=.false., +YAERO_NL(27)%LQM3D=.true., +YAERO_NL(27)%BETAMFBC=-999, +YAERO_NL(27)%LADV=.true., +YAERO_NL(27)%NREQIN=0, +YAERO_NL(28)%CNAME='SO4COS', +YAERO_NL(28)%IGRBCODE=212025, +YAERO_NL(28)%LMASSFIX=.true., +YAERO_NL(28)%LCOMAD=.true., +YAERO_NL(28)%LQM=.false., +YAERO_NL(28)%LQM3D=.true., +YAERO_NL(28)%BETAMFBC=-999, +YAERO_NL(28)%LADV=.true., +YAERO_NL(28)%NREQIN=0, +YAERO_NL(29)%CNAME='BCCOS', +YAERO_NL(29)%IGRBCODE=212026, +YAERO_NL(29)%LMASSFIX=.true., +YAERO_NL(29)%LCOMAD=.true., +YAERO_NL(29)%LQM=.false., +YAERO_NL(29)%LQM3D=.true., +YAERO_NL(29)%BETAMFBC=-999, +YAERO_NL(29)%LADV=.true., +YAERO_NL(29)%NREQIN=0, +YAERO_NL(30)%CNAME='POMCOS', +YAERO_NL(30)%IGRBCODE=212027, +YAERO_NL(30)%LMASSFIX=.true., +YAERO_NL(30)%LCOMAD=.true., +YAERO_NL(30)%LQM=.false., +YAERO_NL(30)%LQM3D=.true., +YAERO_NL(30)%BETAMFBC=-999, +YAERO_NL(30)%LADV=.true., +YAERO_NL(30)%NREQIN=0, +YAERO_NL(31)%CNAME='SSCOS', +YAERO_NL(31)%IGRBCODE=212028, +YAERO_NL(31)%LMASSFIX=.true., +YAERO_NL(31)%LCOMAD=.true., +YAERO_NL(31)%LQM=.false., +YAERO_NL(31)%LQM3D=.true., +YAERO_NL(31)%BETAMFBC=-999, +YAERO_NL(31)%LADV=.true., +YAERO_NL(31)%NREQIN=0, +YAERO_NL(32)%CNAME='DUCOS', +YAERO_NL(32)%IGRBCODE=212029, +YAERO_NL(32)%LMASSFIX=.true., +YAERO_NL(32)%LCOMAD=.true., +YAERO_NL(32)%LQM=.false., +YAERO_NL(32)%LQM3D=.true., +YAERO_NL(32)%BETAMFBC=-999, +YAERO_NL(32)%LADV=.true., +YAERO_NL(32)%NREQIN=0, +YAERO_NL(33)%CNAME='NUS_N', +YAERO_NL(33)%IGRBCODE=212030, +YAERO_NL(33)%LMASSFIX=.true., +YAERO_NL(33)%LCOMAD=.true., +YAERO_NL(33)%LQM=.false., +YAERO_NL(33)%LQM3D=.true., +YAERO_NL(33)%BETAMFBC=-999, +YAERO_NL(33)%LADV=.true., +YAERO_NL(33)%NREQIN=0, +YAERO_NL(34)%CNAME='SO4NUS', +YAERO_NL(34)%IGRBCODE=212031, +YAERO_NL(34)%LMASSFIX=.true., +YAERO_NL(34)%LCOMAD=.true., +YAERO_NL(34)%LQM=.false., +YAERO_NL(34)%LQM3D=.true., +YAERO_NL(34)%BETAMFBC=-999, +YAERO_NL(34)%LADV=.true., +YAERO_NL(34)%NREQIN=0, +YAERO_NL(35)%CNAME='ELVOC', +YAERO_NL(35)%IGRBCODE=212032, +YAERO_NL(35)%LMASSFIX=.true., +YAERO_NL(35)%LCOMAD=.true., +YAERO_NL(35)%LQM=.false., +YAERO_NL(35)%LQM3D=.true., +YAERO_NL(35)%BETAMFBC=-999, +YAERO_NL(35)%LADV=.true., +YAERO_NL(35)%NREQIN=0, +YAERO_NL(36)%CNAME='ISVOC', +YAERO_NL(36)%IGRBCODE=212033, +YAERO_NL(36)%LMASSFIX=.true., +YAERO_NL(36)%LCOMAD=.true., +YAERO_NL(36)%LQM=.false., +YAERO_NL(36)%LQM3D=.true., +YAERO_NL(36)%BETAMFBC=-999, +YAERO_NL(36)%LADV=.true., +YAERO_NL(36)%NREQIN=0, +YAERO_NL(37)%CNAME='MSA', +YAERO_NL(37)%IGRBCODE=212034, +YAERO_NL(37)%LMASSFIX=.true., +YAERO_NL(37)%LCOMAD=.true., +YAERO_NL(37)%LQM=.false., +YAERO_NL(37)%LQM3D=.true., +YAERO_NL(37)%BETAMFBC=-999, +YAERO_NL(37)%LADV=.true., +YAERO_NL(37)%NREQIN=0, +LAERAOT=false, +LAERLISI=false, +NAEROUT=0,NAERO_WVL_DIAG=6, +NAERO_WVL_DIAG_TYPES=5, +YAERO_WVL_DIAG_NL(1)%IWVL=550, +YAERO_WVL_DIAG_NL(1)%IGRIBDIAG=210207,215104,215122,215140,215158, +YAERO_WVL_DIAG_NL(2)%IWVL=380, +YAERO_WVL_DIAG_NL(2)%IGRIBDIAG=210219,215098,215116,215134,215152, +YAERO_WVL_DIAG_NL(3)%IWVL=440, +YAERO_WVL_DIAG_NL(3)%IGRIBDIAG=210221,215100,215118,215136,215154, +YAERO_WVL_DIAG_NL(4)%IWVL=670, +YAERO_WVL_DIAG_NL(4)%IGRIBDIAG=210214,215106,215124,215142,215160, +YAERO_WVL_DIAG_NL(5)%IWVL=870, +YAERO_WVL_DIAG_NL(5)%IGRIBDIAG=210215,215109,215127,215145,215163, +YAERO_WVL_DIAG_NL(6)%IWVL=1020, +YAERO_WVL_DIAG_NL(6)%IGRIBDIAG=210227,215110,215128,215146,215164, +NCHEM=74, +YCHEM_NL(1)%CNAME='O3', +YCHEM_NL(1)%NREQIN=1, +YCHEM_NL(1)%RMOLMASS=48.0, +YCHEM_NL(1)%IGRBCODE=210203, +YCHEM_NL(1)%LNEGFIX=.TRUE., +YCHEM_NL(1)%IGRIBTC=210206, +YCHEM_NL(1)%IGRIBDV=221001, +YCHEM_NL(1)%HENRYA=1.0e-2, +YCHEM_NL(1)%HENRYB=2800.0, +YCHEM_NL(1)%LQM=.false., +YCHEM_NL(1)%LQM3D=.TRUE., +YCHEM_NL(1)%LCOMAD=.true., +YCHEM_NL(1)%LADV=.TRUE., +YCHEM_NL(1)%LMASSFIX=.TRUE., +YCHEM_NL(1)%BETAMFBC=-999.9, +YCHEM_NL(1)%LASSIM=.TRUE., +YCHEM_NL(1)%LADV5=.TRUE., +YCHEM_NL(2)%CNAME='NOx', +YCHEM_NL(2)%NREQIN=0, +YCHEM_NL(2)%RMOLMASS=14.0, +YCHEM_NL(2)%IGRBCODE=210129, +YCHEM_NL(2)%LNEGFIX=.TRUE., +YCHEM_NL(2)%IGRIBTC=210130, +YCHEM_NL(2)%LQM=.false., +YCHEM_NL(2)%LQM3D=.TRUE., +YCHEM_NL(2)%LCOMAD=.true., +YCHEM_NL(2)%LADV=.TRUE., +YCHEM_NL(2)%LMASSFIX=.TRUE., +YCHEM_NL(2)%BETAMFBC=-999.9, +YCHEM_NL(2)%LASSIM=.FALSE., +YCHEM_NL(3)%CNAME='H2O2', +YCHEM_NL(3)%NREQIN=1, +YCHEM_NL(3)%RMOLMASS=34.0, +YCHEM_NL(3)%IGRBCODE=217003, +YCHEM_NL(3)%LNEGFIX=.TRUE., +YCHEM_NL(3)%IGRIBTC=218003, +YCHEM_NL(3)%IGRIBDV=221003, +YCHEM_NL(3)%HENRYA=8.3e4, +YCHEM_NL(3)%HENRYB=7600.0, +YCHEM_NL(3)%LQM=.false., +YCHEM_NL(3)%LQM3D=.TRUE., +YCHEM_NL(3)%LCOMAD=.true., +YCHEM_NL(3)%LADV=.TRUE., +YCHEM_NL(3)%LMASSFIX=.TRUE., +YCHEM_NL(3)%BETAMFBC=-999.9, +YCHEM_NL(3)%LASSIM=.FALSE., +YCHEM_NL(4)%CNAME='CH4', +YCHEM_NL(4)%NREQIN=1, +YCHEM_NL(4)%RMOLMASS=16.0, +YCHEM_NL(4)%IGRBCODE=217004, +YCHEM_NL(4)%LNEGFIX=.TRUE., +YCHEM_NL(4)%IGRIBTC=218004, +YCHEM_NL(4)%LQM=.false., +YCHEM_NL(4)%LQM3D=.TRUE., +YCHEM_NL(4)%LCOMAD=.true., +YCHEM_NL(4)%LADV=.TRUE., +YCHEM_NL(4)%LMASSFIX=.TRUE., +YCHEM_NL(4)%BETAMFBC=-999.9, +YCHEM_NL(4)%LASSIM=.FALSE., +YCHEM_NL(5)%CNAME='CO', +YCHEM_NL(5)%NREQIN=1, +YCHEM_NL(5)%RMOLMASS=28.0, +YCHEM_NL(5)%IGRBCODE=210123, +YCHEM_NL(5)%LNEGFIX=.TRUE., +YCHEM_NL(5)%IGRIBTC=210127, +YCHEM_NL(5)%IGRIBDV=221005, +YCHEM_NL(5)%HENRYA=9.7e-4, +YCHEM_NL(5)%HENRYB=1300.0, +YCHEM_NL(5)%LQM=.false., +YCHEM_NL(5)%LQM3D=.TRUE., +YCHEM_NL(5)%LCOMAD=.true., +YCHEM_NL(5)%LADV=.TRUE., +YCHEM_NL(5)%LMASSFIX=.TRUE., +YCHEM_NL(5)%BETAMFBC=-999.9, +YCHEM_NL(5)%LASSIM=.TRUE., +YCHEM_NL(5)%LADV5=.TRUE., +YCHEM_NL(6)%CNAME='HNO3', +YCHEM_NL(6)%NREQIN=1, +YCHEM_NL(6)%RMOLMASS=63.0, +YCHEM_NL(6)%IGRBCODE=217006, +YCHEM_NL(6)%LNEGFIX=.TRUE., +YCHEM_NL(6)%IGRIBTC=218006, +YCHEM_NL(6)%IGRIBDV=221006, +YCHEM_NL(6)%HENRYA=3.2e11, +YCHEM_NL(6)%HENRYB=8700.0, +YCHEM_NL(6)%LQM=.false., +YCHEM_NL(6)%LQM3D=.TRUE., +YCHEM_NL(6)%LCOMAD=.true., +YCHEM_NL(6)%LADV=.TRUE., +YCHEM_NL(6)%LMASSFIX=.TRUE., +YCHEM_NL(6)%BETAMFBC=-999.9, +YCHEM_NL(6)%LASSIM=.FALSE., +YCHEM_NL(7)%CNAME='CH3OOH', +YCHEM_NL(7)%NREQIN=1, +YCHEM_NL(7)%RMOLMASS=48.0, +YCHEM_NL(7)%IGRBCODE=217007, +YCHEM_NL(7)%LNEGFIX=.TRUE., +YCHEM_NL(7)%IGRIBTC=218007, +YCHEM_NL(7)%IGRIBDV=221007, +YCHEM_NL(7)%HENRYA=2.9e2, +YCHEM_NL(7)%HENRYB=5200.0, +YCHEM_NL(7)%LQM=.false., +YCHEM_NL(7)%LQM3D=.TRUE., +YCHEM_NL(7)%LCOMAD=.true., +YCHEM_NL(7)%LADV=.TRUE., +YCHEM_NL(7)%LMASSFIX=.TRUE., +YCHEM_NL(7)%BETAMFBC=-999.9, +YCHEM_NL(7)%LASSIM=.FALSE., +YCHEM_NL(8)%CNAME='CH2O', +YCHEM_NL(8)%NREQIN=1, +YCHEM_NL(8)%RMOLMASS=30.0, +YCHEM_NL(8)%IGRBCODE=210124, +YCHEM_NL(8)%LNEGFIX=.TRUE., +YCHEM_NL(8)%IGRIBTC=210128, +YCHEM_NL(8)%IGRIBDV=221008, +YCHEM_NL(8)%HENRYA=3.2e3, +YCHEM_NL(8)%HENRYB=6800.0, +YCHEM_NL(8)%LQM=.false., +YCHEM_NL(8)%LQM3D=.TRUE., +YCHEM_NL(8)%LCOMAD=.true., +YCHEM_NL(8)%LADV=.TRUE., +YCHEM_NL(8)%LMASSFIX=.TRUE., +YCHEM_NL(8)%BETAMFBC=-999.9, +YCHEM_NL(8)%LASSIM=.TRUE., +YCHEM_NL(8)%LADV5=.TRUE., +YCHEM_NL(9)%CNAME='PAR', +YCHEM_NL(9)%NREQIN=1, +YCHEM_NL(9)%RMOLMASS=12.0, +YCHEM_NL(9)%IGRBCODE=217009, +YCHEM_NL(9)%LNEGFIX=.TRUE., +YCHEM_NL(9)%IGRIBTC=218009, +YCHEM_NL(9)%LQM=.false., +YCHEM_NL(9)%LQM3D=.TRUE., +YCHEM_NL(9)%LCOMAD=.true., +YCHEM_NL(9)%LADV=.TRUE., +YCHEM_NL(9)%LMASSFIX=.TRUE., +YCHEM_NL(9)%BETAMFBC=-999.9, +YCHEM_NL(9)%LASSIM=.FALSE., +YCHEM_NL(10)%CNAME='C2H4', +YCHEM_NL(10)%NREQIN=1, +YCHEM_NL(10)%RMOLMASS=28.0, +YCHEM_NL(10)%IGRBCODE=217010, +YCHEM_NL(10)%LNEGFIX=.TRUE., +YCHEM_NL(10)%IGRIBTC=218010, +YCHEM_NL(10)%LQM=.false., +YCHEM_NL(10)%LQM3D=.TRUE., +YCHEM_NL(10)%LCOMAD=.true., +YCHEM_NL(10)%LADV=.TRUE., +YCHEM_NL(10)%LMASSFIX=.TRUE., +YCHEM_NL(10)%BETAMFBC=-999.9, +YCHEM_NL(10)%LASSIM=.FALSE., +YCHEM_NL(11)%CNAME='OLE', +YCHEM_NL(11)%NREQIN=1, +YCHEM_NL(11)%RMOLMASS=24.0, +YCHEM_NL(11)%IGRBCODE=217011, +YCHEM_NL(11)%LNEGFIX=.TRUE., +YCHEM_NL(11)%IGRIBTC=218011, +YCHEM_NL(11)%LQM=.false., +YCHEM_NL(11)%LQM3D=.TRUE., +YCHEM_NL(11)%LCOMAD=.true., +YCHEM_NL(11)%LADV=.TRUE., +YCHEM_NL(11)%LMASSFIX=.TRUE., +YCHEM_NL(11)%BETAMFBC=-999.9, +YCHEM_NL(11)%LASSIM=.FALSE., +YCHEM_NL(12)%CNAME='ALD2', +YCHEM_NL(12)%NREQIN=1, +YCHEM_NL(12)%RMOLMASS=24.0, +YCHEM_NL(12)%IGRBCODE=217012, +YCHEM_NL(12)%LNEGFIX=.TRUE., +YCHEM_NL(12)%IGRIBTC=218012, +YCHEM_NL(12)%IGRIBDV=221012, +YCHEM_NL(12)%HENRYA=17.0, +YCHEM_NL(12)%HENRYB=5000.0, +YCHEM_NL(12)%LQM=.false., +YCHEM_NL(12)%LQM3D=.TRUE., +YCHEM_NL(12)%LCOMAD=.true., +YCHEM_NL(12)%LADV=.TRUE., +YCHEM_NL(12)%LMASSFIX=.TRUE., +YCHEM_NL(12)%BETAMFBC=-999.9, +YCHEM_NL(12)%LASSIM=.FALSE., +YCHEM_NL(13)%CNAME='PAN', +YCHEM_NL(13)%NREQIN=1, +YCHEM_NL(13)%RMOLMASS=121.0, +YCHEM_NL(13)%IGRBCODE=217013, +YCHEM_NL(13)%LNEGFIX=.TRUE., +YCHEM_NL(13)%IGRIBTC=218013, +YCHEM_NL(13)%IGRIBDV=221013, +YCHEM_NL(13)%HENRYA=2.9e+0, +YCHEM_NL(13)%HENRYB=5700.0, +YCHEM_NL(13)%LQM=.false., +YCHEM_NL(13)%LQM3D=.TRUE., +YCHEM_NL(13)%LCOMAD=.true., +YCHEM_NL(13)%LADV=.TRUE., +YCHEM_NL(13)%LMASSFIX=.TRUE., +YCHEM_NL(13)%BETAMFBC=-999.9, +YCHEM_NL(13)%LASSIM=.FALSE., +YCHEM_NL(14)%CNAME='ROOH', +YCHEM_NL(14)%NREQIN=1, +YCHEM_NL(14)%RMOLMASS=47.0, +YCHEM_NL(14)%IGRBCODE=217014, +YCHEM_NL(14)%LNEGFIX=.TRUE., +YCHEM_NL(14)%IGRIBTC=218014, +YCHEM_NL(14)%IGRIBDV=221014, +YCHEM_NL(14)%HENRYA=340.0, +YCHEM_NL(14)%HENRYB=6000.0, +YCHEM_NL(14)%LQM=.false., +YCHEM_NL(14)%LQM3D=.TRUE., +YCHEM_NL(14)%LCOMAD=.true., +YCHEM_NL(14)%LADV=.TRUE., +YCHEM_NL(14)%LMASSFIX=.TRUE., +YCHEM_NL(14)%BETAMFBC=-999.9, +YCHEM_NL(14)%LASSIM=.FALSE., +YCHEM_NL(15)%CNAME='ONIT', +YCHEM_NL(15)%NREQIN=1, +YCHEM_NL(15)%RMOLMASS=77.0, +YCHEM_NL(15)%IGRBCODE=217015, +YCHEM_NL(15)%LNEGFIX=.TRUE., +YCHEM_NL(15)%IGRIBTC=218015, +YCHEM_NL(15)%IGRIBDV=221015, +YCHEM_NL(15)%HENRYA=1.0e3, +YCHEM_NL(15)%HENRYB=6485., +YCHEM_NL(15)%LQM=.false., +YCHEM_NL(15)%LQM3D=.TRUE., +YCHEM_NL(15)%LCOMAD=.true., +YCHEM_NL(15)%LADV=.TRUE., +YCHEM_NL(15)%LMASSFIX=.TRUE., +YCHEM_NL(15)%BETAMFBC=-999.9, +YCHEM_NL(15)%LASSIM=.FALSE., +YCHEM_NL(16)%CNAME='C5H8', +YCHEM_NL(16)%NREQIN=1, +YCHEM_NL(16)%RMOLMASS=68.1, +YCHEM_NL(16)%IGRBCODE=217016, +YCHEM_NL(16)%LNEGFIX=.TRUE., +YCHEM_NL(16)%IGRIBTC=218016, +YCHEM_NL(16)%IGRIBDV=221016, +YCHEM_NL(16)%HENRYA=1.3e-2, +YCHEM_NL(16)%HENRYB=0.0, +YCHEM_NL(16)%LQM=.false., +YCHEM_NL(16)%LQM3D=.TRUE., +YCHEM_NL(16)%LCOMAD=.true., +YCHEM_NL(16)%LADV=.TRUE., +YCHEM_NL(16)%LMASSFIX=.TRUE., +YCHEM_NL(16)%BETAMFBC=-999.9, +YCHEM_NL(16)%LASSIM=.FALSE., +YCHEM_NL(17)%CNAME='SO2', +YCHEM_NL(17)%NREQIN=1, +YCHEM_NL(17)%RMOLMASS=64.1, +YCHEM_NL(17)%IGRBCODE=210122, +YCHEM_NL(17)%LNEGFIX=.TRUE., +YCHEM_NL(17)%IGRIBTC=210126, +YCHEM_NL(17)%IGRIBDV=221017, +YCHEM_NL(17)%HENRYA=1.0e5, +YCHEM_NL(17)%HENRYB=3000.0, +YCHEM_NL(17)%LQM=.false., +YCHEM_NL(17)%LQM3D=.TRUE., +YCHEM_NL(17)%LCOMAD=.true., +YCHEM_NL(17)%LADV=.TRUE., +YCHEM_NL(17)%LMASSFIX=.TRUE., +YCHEM_NL(17)%BETAMFBC=-999.9, +YCHEM_NL(17)%LASSIM=.TRUE., +YCHEM_NL(17)%LADV5=.TRUE., +YCHEM_NL(18)%CNAME='DMS', +YCHEM_NL(18)%NREQIN=1, +YCHEM_NL(18)%RMOLMASS=62.1, +YCHEM_NL(18)%IGRBCODE=217018, +YCHEM_NL(18)%LNEGFIX=.TRUE., +YCHEM_NL(18)%IGRIBTC=218018, +YCHEM_NL(18)%LQM=.false., +YCHEM_NL(18)%LQM3D=.TRUE., +YCHEM_NL(18)%LCOMAD=.true., +YCHEM_NL(18)%LADV=.TRUE., +YCHEM_NL(18)%LMASSFIX=.TRUE., +YCHEM_NL(18)%BETAMFBC=-999.9, +YCHEM_NL(18)%LASSIM=.FALSE., +YCHEM_NL(19)%CNAME='NH3', +YCHEM_NL(19)%NREQIN=1, +YCHEM_NL(19)%RMOLMASS=17.0, +YCHEM_NL(19)%IGRBCODE=217019, +YCHEM_NL(19)%LNEGFIX=.TRUE., +YCHEM_NL(19)%IGRIBTC=218019, +YCHEM_NL(19)%IGRIBDV=221019, +YCHEM_NL(19)%HENRYA=59.0, +YCHEM_NL(19)%HENRYB=4200.0, +YCHEM_NL(19)%LQM=.false., +YCHEM_NL(19)%LQM3D=.TRUE., +YCHEM_NL(19)%LCOMAD=.true., +YCHEM_NL(19)%LADV=.TRUE., +YCHEM_NL(19)%LMASSFIX=.TRUE., +YCHEM_NL(19)%BETAMFBC=-999.9, +YCHEM_NL(19)%LASSIM=.FALSE., +YCHEM_NL(20)%CNAME='SO4', +YCHEM_NL(20)%NREQIN=-1, +YCHEM_NL(20)%RMOLMASS=96.1, +YCHEM_NL(20)%IGRBCODE=217020, +YCHEM_NL(20)%LNEGFIX=.TRUE., +YCHEM_NL(20)%IGRIBTC=218020, +YCHEM_NL(20)%IGRIBDV=221020, +YCHEM_NL(20)%HENRYA=3.2e11, +YCHEM_NL(20)%HENRYB=8700.0, +YCHEM_NL(20)%LQM=.false., +YCHEM_NL(20)%LQM3D=.TRUE., +YCHEM_NL(20)%LCOMAD=.true., +YCHEM_NL(20)%LADV=.TRUE., +YCHEM_NL(20)%LMASSFIX=.TRUE., +YCHEM_NL(20)%BETAMFBC=-999.9, +YCHEM_NL(20)%LASSIM=.FALSE., +YCHEM_NL(21)%CNAME='NH4', +YCHEM_NL(21)%NREQIN=1, +YCHEM_NL(21)%RMOLMASS=18.0, +YCHEM_NL(21)%IGRBCODE=217021, +YCHEM_NL(21)%LNEGFIX=.TRUE., +YCHEM_NL(21)%IGRIBTC=218021, +YCHEM_NL(21)%IGRIBDV=221021, +YCHEM_NL(21)%HENRYA=3.2e11, +YCHEM_NL(21)%HENRYB=8700.0, +YCHEM_NL(21)%LQM=.false., +YCHEM_NL(21)%LQM3D=.TRUE., +YCHEM_NL(21)%LCOMAD=.true., +YCHEM_NL(21)%LADV=.TRUE., +YCHEM_NL(21)%LMASSFIX=.TRUE., +YCHEM_NL(21)%BETAMFBC=-999.9, +YCHEM_NL(21)%LASSIM=.FALSE., +YCHEM_NL(22)%CNAME='MSA', +YCHEM_NL(22)%NREQIN=1, +YCHEM_NL(22)%RMOLMASS=96.1, +YCHEM_NL(22)%IGRBCODE=217022, +YCHEM_NL(22)%LNEGFIX=.TRUE., +YCHEM_NL(22)%IGRIBTC=218022, +YCHEM_NL(22)%HENRYA=3.2e11, +YCHEM_NL(22)%HENRYB=8700.0, +YCHEM_NL(22)%LQM=.false., +YCHEM_NL(22)%LQM3D=.TRUE., +YCHEM_NL(22)%LCOMAD=.true., +YCHEM_NL(22)%LADV=.TRUE., +YCHEM_NL(22)%LMASSFIX=.TRUE., +YCHEM_NL(22)%BETAMFBC=-999.9, +YCHEM_NL(22)%LASSIM=.FALSE., +YCHEM_NL(23)%CNAME='CH3COCHO', +YCHEM_NL(23)%NREQIN=1, +YCHEM_NL(23)%RMOLMASS=72.1, +YCHEM_NL(23)%IGRBCODE=217023, +YCHEM_NL(23)%LNEGFIX=.TRUE., +YCHEM_NL(23)%IGRIBTC=218023, +YCHEM_NL(23)%IGRIBDV=221023, +YCHEM_NL(23)%HENRYA=3.4e3, +YCHEM_NL(23)%HENRYB=7500.0, +YCHEM_NL(23)%LQM=.false., +YCHEM_NL(23)%LQM3D=.TRUE., +YCHEM_NL(23)%LCOMAD=.true., +YCHEM_NL(23)%LADV=.TRUE., +YCHEM_NL(23)%LMASSFIX=.TRUE., +YCHEM_NL(23)%BETAMFBC=-999.9, +YCHEM_NL(23)%LASSIM=.FALSE., +YCHEM_NL(24)%CNAME='O3S', +YCHEM_NL(24)%NREQIN=1, +YCHEM_NL(24)%RMOLMASS=48.0, +YCHEM_NL(24)%IGRBCODE=217024, +YCHEM_NL(24)%LNEGFIX=.TRUE., +YCHEM_NL(24)%IGRIBTC=218024, +YCHEM_NL(24)%IGRIBDV=221024, +YCHEM_NL(24)%HENRYA=1.0e-2, +YCHEM_NL(24)%HENRYB=2800.0, +YCHEM_NL(24)%LQM=.false., +YCHEM_NL(24)%LQM3D=.TRUE., +YCHEM_NL(24)%LCOMAD=.true., +YCHEM_NL(24)%LADV=.TRUE., +YCHEM_NL(24)%LMASSFIX=.TRUE., +YCHEM_NL(24)%BETAMFBC=-999.9, +YCHEM_NL(24)%LASSIM=.FALSE., +YCHEM_NL(25)%CNAME='Rn', +YCHEM_NL(25)%NREQIN=1, +YCHEM_NL(25)%RMOLMASS=222.0, +YCHEM_NL(25)%IGRBCODE=210181, +YCHEM_NL(25)%LNEGFIX=.TRUE., +YCHEM_NL(25)%IGRIBTC=210183, +YCHEM_NL(25)%LQM=.false., +YCHEM_NL(25)%LQM3D=.TRUE., +YCHEM_NL(25)%LCOMAD=.true., +YCHEM_NL(25)%LADV=.TRUE., +YCHEM_NL(25)%LMASSFIX=.TRUE., +YCHEM_NL(25)%BETAMFBC=-999.9, +YCHEM_NL(25)%LASSIM=.FALSE., +YCHEM_NL(26)%CNAME='Pb', +YCHEM_NL(26)%NREQIN=1, +YCHEM_NL(26)%RMOLMASS=210.0, +YCHEM_NL(26)%IGRBCODE=217026, +YCHEM_NL(26)%LNEGFIX=.TRUE., +YCHEM_NL(26)%IGRIBTC=218026, +YCHEM_NL(26)%HENRYA=3.2e11, +YCHEM_NL(26)%HENRYB=8700.0, +YCHEM_NL(26)%LQM=.false., +YCHEM_NL(26)%LQM3D=.TRUE., +YCHEM_NL(26)%LCOMAD=.true., +YCHEM_NL(26)%LADV=.TRUE., +YCHEM_NL(26)%LMASSFIX=.TRUE., +YCHEM_NL(26)%BETAMFBC=-999.9, +YCHEM_NL(26)%LASSIM=.FALSE., +YCHEM_NL(27)%CNAME='NO', +YCHEM_NL(27)%NREQIN=1, +YCHEM_NL(27)%RMOLMASS=30.0, +YCHEM_NL(27)%IGRBCODE=217027, +YCHEM_NL(27)%LNEGFIX=.TRUE., +YCHEM_NL(27)%IGRIBTC=218027, +YCHEM_NL(27)%IGRIBDV=221027, +YCHEM_NL(27)%HENRYA=1.9e-3, +YCHEM_NL(27)%HENRYB=1600.0, +YCHEM_NL(27)%LQM=.false., +YCHEM_NL(27)%LQM3D=.TRUE., +YCHEM_NL(27)%LCOMAD=.true., +YCHEM_NL(27)%LADV=.TRUE., +YCHEM_NL(27)%LMASSFIX=.FALSE., +YCHEM_NL(27)%LASSIM=.FALSE., +YCHEM_NL(27)%LADV5=.TRUE., +YCHEM_NL(28)%CNAME='HO2', +YCHEM_NL(28)%NREQIN=1, +YCHEM_NL(28)%RMOLMASS=33.0, +YCHEM_NL(28)%IGRBCODE=217028, +YCHEM_NL(28)%LNEGFIX=.TRUE., +YCHEM_NL(28)%IGRIBTC=218028, +YCHEM_NL(28)%IGRIBDV=221028, +YCHEM_NL(28)%HENRYA=6.8e2, +YCHEM_NL(28)%HENRYB=0.0, +YCHEM_NL(28)%LQM=.false., +YCHEM_NL(28)%LQM3D=.TRUE., +YCHEM_NL(28)%LCOMAD=.true., +YCHEM_NL(28)%LADV=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LMASSFIX=.FALSE., +YCHEM_NL(28)%LASSIM=.FALSE., +YCHEM_NL(29)%CNAME='CH3O2', +YCHEM_NL(29)%NREQIN=1, +YCHEM_NL(29)%RMOLMASS=47.0, +YCHEM_NL(29)%IGRBCODE=217029, +YCHEM_NL(29)%LNEGFIX=.TRUE., +YCHEM_NL(29)%IGRIBTC=218029, +YCHEM_NL(29)%IGRIBDV=221029, +YCHEM_NL(29)%HENRYA=1.5e1, +YCHEM_NL(29)%HENRYB=3700.0, +YCHEM_NL(29)%LQM=.false., +YCHEM_NL(29)%LQM3D=.TRUE., +YCHEM_NL(29)%LCOMAD=.true., +YCHEM_NL(29)%LADV=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LMASSFIX=.FALSE., +YCHEM_NL(29)%LASSIM=.FALSE., +YCHEM_NL(30)%CNAME='OH', +YCHEM_NL(30)%NREQIN=1, +YCHEM_NL(30)%RMOLMASS=17.0, +YCHEM_NL(30)%IGRBCODE=217030, +YCHEM_NL(30)%LNEGFIX=.TRUE., +YCHEM_NL(30)%IGRIBTC=218030, +YCHEM_NL(30)%LQM=.false., +YCHEM_NL(30)%LQM3D=.TRUE., +YCHEM_NL(30)%LCOMAD=.true., +YCHEM_NL(30)%LADV=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LMASSFIX=.FALSE., +YCHEM_NL(30)%LASSIM=.FALSE., +YCHEM_NL(30)%LADV5=.TRUE., +YCHEM_NL(31)%CNAME='NO2', +YCHEM_NL(31)%NREQIN=1, +YCHEM_NL(31)%RMOLMASS=46.0, +YCHEM_NL(31)%IGRBCODE=210121, +YCHEM_NL(31)%LNEGFIX=.TRUE., +YCHEM_NL(31)%IGRIBTC=210125, +YCHEM_NL(31)%IGRIBDV=221031, +YCHEM_NL(31)%HENRYA=1.2e-2, +YCHEM_NL(31)%HENRYB=2400.0, +YCHEM_NL(31)%LQM=.false., +YCHEM_NL(31)%LQM3D=.TRUE., +YCHEM_NL(31)%LCOMAD=.true., +YCHEM_NL(31)%LADV=.TRUE., +YCHEM_NL(31)%LMASSFIX=.FALSE., +YCHEM_NL(31)%LASSIM=.TRUE., +YCHEM_NL(31)%LADV5=.TRUE., +YCHEM_NL(32)%CNAME='NO3', +YCHEM_NL(32)%NREQIN=1, +YCHEM_NL(32)%RMOLMASS=62.0, +YCHEM_NL(32)%IGRBCODE=217032, +YCHEM_NL(32)%LNEGFIX=.TRUE., +YCHEM_NL(32)%IGRIBTC=218032, +YCHEM_NL(32)%IGRIBDV=221032, +YCHEM_NL(32)%HENRYA=3.8e-2, +YCHEM_NL(32)%HENRYB=0., +YCHEM_NL(32)%LQM=.false., +YCHEM_NL(32)%LQM3D=.TRUE., +YCHEM_NL(32)%LCOMAD=.true., +YCHEM_NL(32)%LADV=.TRUE., +YCHEM_NL(32)%LMASSFIX=.FALSE., +YCHEM_NL(32)%LASSIM=.FALSE., +YCHEM_NL(33)%CNAME='N2O5', +YCHEM_NL(33)%NREQIN=1, +YCHEM_NL(33)%RMOLMASS=108.0, +YCHEM_NL(33)%IGRBCODE=217033, +YCHEM_NL(33)%LNEGFIX=.TRUE., +YCHEM_NL(33)%IGRIBTC=218033, +YCHEM_NL(33)%IGRIBDV=221033, +YCHEM_NL(33)%HENRYA=2.1e+1, +YCHEM_NL(33)%HENRYB=3400.0, +YCHEM_NL(33)%LQM=.false., +YCHEM_NL(33)%LQM3D=.TRUE., +YCHEM_NL(33)%LCOMAD=.true., +YCHEM_NL(33)%LADV=.TRUE., +YCHEM_NL(33)%LMASSFIX=.TRUE., +YCHEM_NL(33)%BETAMFBC=-999.9, +YCHEM_NL(33)%LASSIM=.FALSE., +YCHEM_NL(34)%CNAME='HO2NO2', +YCHEM_NL(34)%NREQIN=1, +YCHEM_NL(34)%RMOLMASS=79.0, +YCHEM_NL(34)%IGRBCODE=217034, +YCHEM_NL(34)%LNEGFIX=.TRUE., +YCHEM_NL(34)%IGRIBTC=218034, +YCHEM_NL(34)%IGRIBDV=221034, +YCHEM_NL(34)%HENRYA=1.2e+4, +YCHEM_NL(34)%HENRYB=6900.0, +YCHEM_NL(34)%LQM=.false., +YCHEM_NL(34)%LQM3D=.TRUE., +YCHEM_NL(34)%LCOMAD=.true., +YCHEM_NL(34)%LADV=.TRUE., +YCHEM_NL(34)%LMASSFIX=.TRUE., +YCHEM_NL(34)%BETAMFBC=-999.9, +YCHEM_NL(34)%LASSIM=.FALSE., +YCHEM_NL(35)%CNAME='C2O3', +YCHEM_NL(35)%NREQIN=1, +YCHEM_NL(35)%RMOLMASS=75.0, +YCHEM_NL(35)%IGRBCODE=217035, +YCHEM_NL(35)%LNEGFIX=.TRUE., +YCHEM_NL(35)%IGRIBTC=218035, +YCHEM_NL(35)%LQM=.false., +YCHEM_NL(35)%LQM3D=.TRUE., +YCHEM_NL(35)%LCOMAD=.true., +YCHEM_NL(35)%LADV=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LMASSFIX=.FALSE., +YCHEM_NL(35)%LASSIM=.FALSE., +YCHEM_NL(36)%CNAME='ROR', +YCHEM_NL(36)%NREQIN=1, +YCHEM_NL(36)%RMOLMASS=28.0, +YCHEM_NL(36)%IGRBCODE=217036, +YCHEM_NL(36)%LNEGFIX=.TRUE., +YCHEM_NL(36)%IGRIBTC=218036, +YCHEM_NL(36)%LQM=.false., +YCHEM_NL(36)%LQM3D=.TRUE., +YCHEM_NL(36)%LCOMAD=.true., +YCHEM_NL(36)%LADV=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LMASSFIX=.FALSE., +YCHEM_NL(36)%LASSIM=.FALSE., +YCHEM_NL(37)%CNAME='RXPAR', +YCHEM_NL(37)%NREQIN=1, +YCHEM_NL(37)%RMOLMASS=12.0, +YCHEM_NL(37)%IGRBCODE=217037, +YCHEM_NL(37)%LNEGFIX=.TRUE., +YCHEM_NL(37)%IGRIBTC=218037, +YCHEM_NL(37)%LQM=.false., +YCHEM_NL(37)%LQM3D=.TRUE., +YCHEM_NL(37)%LCOMAD=.true., +YCHEM_NL(37)%LADV=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LMASSFIX=.FALSE., +YCHEM_NL(37)%LASSIM=.FALSE., +YCHEM_NL(38)%CNAME='XO2', +YCHEM_NL(38)%NREQIN=1, +YCHEM_NL(38)%RMOLMASS=44.0, +YCHEM_NL(38)%IGRBCODE=217038, +YCHEM_NL(38)%LNEGFIX=.TRUE., +YCHEM_NL(38)%IGRIBTC=218038, +YCHEM_NL(38)%LQM=.false., +YCHEM_NL(38)%LQM3D=.TRUE., +YCHEM_NL(38)%LCOMAD=.true., +YCHEM_NL(38)%LADV=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LMASSFIX=.FALSE., +YCHEM_NL(38)%LASSIM=.FALSE., +YCHEM_NL(39)%CNAME='XO2N', +YCHEM_NL(39)%NREQIN=1, +YCHEM_NL(39)%RMOLMASS=44.0, +YCHEM_NL(39)%IGRBCODE=217039, +YCHEM_NL(39)%LNEGFIX=.TRUE., +YCHEM_NL(39)%IGRIBTC=218039, +YCHEM_NL(39)%LQM=.false., +YCHEM_NL(39)%LQM3D=.TRUE., +YCHEM_NL(39)%LCOMAD=.true., +YCHEM_NL(39)%LADV=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LMASSFIX=.FALSE., +YCHEM_NL(39)%LASSIM=.FALSE., +YCHEM_NL(40)%CNAME='NH2', +YCHEM_NL(40)%NREQIN=1, +YCHEM_NL(40)%RMOLMASS=16.0, +YCHEM_NL(40)%IGRBCODE=217040, +YCHEM_NL(40)%LNEGFIX=.TRUE., +YCHEM_NL(40)%IGRIBTC=218040, +YCHEM_NL(40)%LQM=.false., +YCHEM_NL(40)%LQM3D=.TRUE., +YCHEM_NL(40)%LCOMAD=.true., +YCHEM_NL(40)%LADV=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LMASSFIX=.FALSE., +YCHEM_NL(40)%LASSIM=.FALSE., +YCHEM_NL(41)%CNAME='PSC', +YCHEM_NL(41)%NREQIN=0, +YCHEM_NL(41)%RMOLMASS=1.0, +YCHEM_NL(41)%IGRBCODE=217041, +YCHEM_NL(41)%LNEGFIX=.TRUE., +YCHEM_NL(41)%IGRIBTC=218041, +YCHEM_NL(41)%LQM=.false., +YCHEM_NL(41)%LQM3D=.TRUE., +YCHEM_NL(41)%LCOMAD=.true., +YCHEM_NL(41)%LADV=.TRUE., +YCHEM_NL(41)%LMASSFIX=.FALSE., +YCHEM_NL(41)%REFVALI=0.0, +YCHEM_NL(41)%NREQIN=-1, +YCHEM_NL(41)%LASSIM=.FALSE., +YCHEM_NL(42)%CNAME='CH3OH', +YCHEM_NL(42)%NREQIN=1, +YCHEM_NL(42)%RMOLMASS=31.01, +YCHEM_NL(42)%IGRBCODE=217042, +YCHEM_NL(42)%LNEGFIX=.TRUE., +YCHEM_NL(42)%IGRIBTC=218042, +YCHEM_NL(42)%IGRIBDV=221042, +YCHEM_NL(42)%HENRYA=200.0, +YCHEM_NL(42)%HENRYB=5600.0, +YCHEM_NL(42)%LQM=.false., +YCHEM_NL(42)%LQM3D=.TRUE., +YCHEM_NL(42)%LCOMAD=.true., +YCHEM_NL(42)%LADV=.TRUE., +YCHEM_NL(42)%LMASSFIX=.TRUE., +YCHEM_NL(42)%BETAMFBC=-999.9, +YCHEM_NL(42)%LASSIM=.FALSE., +YCHEM_NL(43)%CNAME='HCOOH', +YCHEM_NL(43)%NREQIN=1, +YCHEM_NL(43)%RMOLMASS=46.01, +YCHEM_NL(43)%IGRBCODE=217043, +YCHEM_NL(43)%LNEGFIX=.TRUE., +YCHEM_NL(43)%IGRIBTC=218043, +YCHEM_NL(43)%IGRIBDV=221043, +YCHEM_NL(43)%HENRYA=8.8e3, +YCHEM_NL(43)%HENRYB=6100.0, +YCHEM_NL(43)%LQM=.false., +YCHEM_NL(43)%LQM3D=.TRUE., +YCHEM_NL(43)%LCOMAD=.true., +YCHEM_NL(43)%LADV=.TRUE., +YCHEM_NL(43)%LMASSFIX=.TRUE., +YCHEM_NL(43)%BETAMFBC=-999.9, +YCHEM_NL(43)%LASSIM=.FALSE., +YCHEM_NL(44)%CNAME='MCOOH', +YCHEM_NL(44)%NREQIN=1, +YCHEM_NL(44)%RMOLMASS=62.02, +YCHEM_NL(44)%IGRBCODE=217044, +YCHEM_NL(44)%LNEGFIX=.TRUE., +YCHEM_NL(44)%IGRIBTC=218044, +YCHEM_NL(44)%IGRIBDV=221044, +YCHEM_NL(44)%HENRYA=4.1e3, +YCHEM_NL(44)%HENRYB=6300.0, +YCHEM_NL(44)%LQM=.false., +YCHEM_NL(44)%LQM3D=.TRUE., +YCHEM_NL(44)%LCOMAD=.true., +YCHEM_NL(44)%LADV=.TRUE., +YCHEM_NL(44)%LMASSFIX=.TRUE., +YCHEM_NL(44)%BETAMFBC=-999.9, +YCHEM_NL(44)%LASSIM=.FALSE., +YCHEM_NL(45)%CNAME='C2H6', +YCHEM_NL(45)%NREQIN=1, +YCHEM_NL(45)%RMOLMASS=30.02, +YCHEM_NL(45)%IGRBCODE=217045, +YCHEM_NL(45)%LNEGFIX=.TRUE., +YCHEM_NL(45)%IGRIBTC=218045, +YCHEM_NL(45)%IGRIBDV=221045, +YCHEM_NL(45)%HENRYA=1.9e-3, +YCHEM_NL(45)%HENRYB=2400.0, +YCHEM_NL(45)%LQM=.false., +YCHEM_NL(45)%LQM3D=.TRUE., +YCHEM_NL(45)%LCOMAD=.true., +YCHEM_NL(45)%LADV=.TRUE., +YCHEM_NL(45)%LMASSFIX=.TRUE., +YCHEM_NL(45)%BETAMFBC=-999.9, +YCHEM_NL(45)%LASSIM=.FALSE., +YCHEM_NL(46)%CNAME='C2H5OH', +YCHEM_NL(46)%NREQIN=1, +YCHEM_NL(46)%RMOLMASS=46.02, +YCHEM_NL(46)%IGRBCODE=217046, +YCHEM_NL(46)%LNEGFIX=.TRUE., +YCHEM_NL(46)%IGRIBTC=218046, +YCHEM_NL(46)%IGRIBDV=221046, +YCHEM_NL(46)%HENRYA=190.0, +YCHEM_NL(46)%HENRYB=6400.0, +YCHEM_NL(46)%LQM=.false., +YCHEM_NL(46)%LQM3D=.TRUE., +YCHEM_NL(46)%LCOMAD=.true., +YCHEM_NL(46)%LADV=.TRUE., +YCHEM_NL(46)%LMASSFIX=.TRUE., +YCHEM_NL(46)%BETAMFBC=-999.9, +YCHEM_NL(46)%LASSIM=.FALSE., +YCHEM_NL(47)%CNAME='C3H8', +YCHEM_NL(47)%NREQIN=1, +YCHEM_NL(47)%RMOLMASS=44.03, +YCHEM_NL(47)%IGRBCODE=217047, +YCHEM_NL(47)%LNEGFIX=.TRUE., +YCHEM_NL(47)%IGRIBTC=218047, +YCHEM_NL(47)%LQM=.false., +YCHEM_NL(47)%LQM3D=.TRUE., +YCHEM_NL(47)%LCOMAD=.true., +YCHEM_NL(47)%LADV=.TRUE., +YCHEM_NL(47)%LMASSFIX=.TRUE., +YCHEM_NL(47)%BETAMFBC=-999.9, +YCHEM_NL(47)%LASSIM=.FALSE., +YCHEM_NL(48)%CNAME='C3H6', +YCHEM_NL(48)%NREQIN=1, +YCHEM_NL(48)%RMOLMASS=42.03, +YCHEM_NL(48)%IGRBCODE=217048, +YCHEM_NL(48)%LNEGFIX=.TRUE., +YCHEM_NL(48)%IGRIBTC=218048, +YCHEM_NL(48)%LQM=.false., +YCHEM_NL(48)%LQM3D=.TRUE., +YCHEM_NL(48)%LCOMAD=.true., +YCHEM_NL(48)%LADV=.TRUE., +YCHEM_NL(48)%LMASSFIX=.TRUE., +YCHEM_NL(48)%BETAMFBC=-999.9, +YCHEM_NL(48)%LASSIM=.FALSE., +YCHEM_NL(49)%CNAME='C10H16', +YCHEM_NL(49)%NREQIN=1, +YCHEM_NL(49)%RMOLMASS=136.0, +YCHEM_NL(49)%IGRBCODE=217049, +YCHEM_NL(49)%LNEGFIX=.TRUE., +YCHEM_NL(49)%IGRIBTC=218049, +YCHEM_NL(49)%LQM=.false., +YCHEM_NL(49)%LQM3D=.TRUE., +YCHEM_NL(49)%LCOMAD=.true., +YCHEM_NL(49)%LADV=.TRUE., +YCHEM_NL(49)%LMASSFIX=.TRUE., +YCHEM_NL(49)%BETAMFBC=-999.9, +YCHEM_NL(49)%LASSIM=.FALSE., +YCHEM_NL(50)%CNAME='ISPD', +YCHEM_NL(50)%NREQIN=1, +YCHEM_NL(50)%RMOLMASS=70.0, +YCHEM_NL(50)%IGRBCODE=217050, +YCHEM_NL(50)%LNEGFIX=.TRUE., +YCHEM_NL(50)%IGRIBTC=218050, +YCHEM_NL(50)%IGRIBDV=221050, +YCHEM_NL(50)%HENRYA=4.3, +YCHEM_NL(50)%HENRYB=5300.0, +YCHEM_NL(50)%LQM=.false., +YCHEM_NL(50)%LQM3D=.TRUE., +YCHEM_NL(50)%LCOMAD=.true., +YCHEM_NL(50)%LADV=.TRUE., +YCHEM_NL(50)%LMASSFIX=.TRUE., +YCHEM_NL(50)%BETAMFBC=-999.9, +YCHEM_NL(50)%LASSIM=.FALSE., +YCHEM_NL(51)%CNAME='NO3_A', +YCHEM_NL(51)%NREQIN=1, +YCHEM_NL(51)%RMOLMASS=62.0, +YCHEM_NL(51)%IGRBCODE=217051, +YCHEM_NL(51)%LNEGFIX=.TRUE., +YCHEM_NL(51)%IGRIBTC=218051, +YCHEM_NL(51)%IGRIBDV=221051, +YCHEM_NL(51)%HENRYA=3.2e11, +YCHEM_NL(51)%HENRYB=8700.0, +YCHEM_NL(51)%LQM=.false., +YCHEM_NL(51)%LQM3D=.TRUE., +YCHEM_NL(51)%LCOMAD=.true., +YCHEM_NL(51)%LADV=.TRUE., +YCHEM_NL(51)%LMASSFIX=.TRUE., +YCHEM_NL(51)%BETAMFBC=-999.9, +YCHEM_NL(51)%LASSIM=.FALSE., +YCHEM_NL(52)%CNAME='CH3COCH3', +YCHEM_NL(52)%NREQIN=1, +YCHEM_NL(52)%RMOLMASS=58.0, +YCHEM_NL(52)%IGRBCODE=217052, +YCHEM_NL(52)%LNEGFIX=.TRUE., +YCHEM_NL(52)%IGRIBTC=218052, +YCHEM_NL(52)%IGRIBDV=221052, +YCHEM_NL(52)%HENRYA=27.0, +YCHEM_NL(52)%HENRYB=5500.0, +YCHEM_NL(52)%LQM=.false., +YCHEM_NL(52)%LQM3D=.TRUE., +YCHEM_NL(52)%LCOMAD=.true., +YCHEM_NL(52)%LADV=.TRUE., +YCHEM_NL(52)%LMASSFIX=.TRUE., +YCHEM_NL(52)%BETAMFBC=-999.9, +YCHEM_NL(52)%LASSIM=.FALSE., +YCHEM_NL(53)%CNAME='ACO2', +YCHEM_NL(53)%NREQIN=1, +YCHEM_NL(53)%RMOLMASS=58.0, +YCHEM_NL(53)%IGRBCODE=217053, +YCHEM_NL(53)%LNEGFIX=.TRUE., +YCHEM_NL(53)%IGRIBTC=218053, +YCHEM_NL(53)%LQM=.false., +YCHEM_NL(53)%LQM3D=.TRUE., +YCHEM_NL(53)%LCOMAD=.true., +YCHEM_NL(53)%LADV=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LMASSFIX=.FALSE., +YCHEM_NL(53)%LASSIM=.FALSE., +YCHEM_NL(54)%CNAME='IC3H7O2', +YCHEM_NL(54)%NREQIN=1, +YCHEM_NL(54)%RMOLMASS=75.0, +YCHEM_NL(54)%IGRBCODE=217054, +YCHEM_NL(54)%LNEGFIX=.TRUE., +YCHEM_NL(54)%IGRIBTC=218054, +YCHEM_NL(54)%LQM=.false., +YCHEM_NL(54)%LQM3D=.TRUE., +YCHEM_NL(54)%LCOMAD=.true., +YCHEM_NL(54)%LADV=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LMASSFIX=.FALSE., +YCHEM_NL(54)%LASSIM=.FALSE., +YCHEM_NL(55)%CNAME='HYPROPO2', +YCHEM_NL(55)%NREQIN=1, +YCHEM_NL(55)%RMOLMASS=91.0, +YCHEM_NL(55)%IGRBCODE=217055, +YCHEM_NL(55)%LNEGFIX=.TRUE., +YCHEM_NL(55)%IGRIBTC=218055, +YCHEM_NL(55)%LQM=.false., +YCHEM_NL(55)%LQM3D=.TRUE., +YCHEM_NL(55)%LCOMAD=.true., +YCHEM_NL(55)%LADV=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LMASSFIX=.FALSE., +YCHEM_NL(55)%LASSIM=.FALSE., +YCHEM_NL(56)%CNAME='SO3', +YCHEM_NL(56)%NREQIN=1, +YCHEM_NL(56)%RMOLMASS=80.0, +YCHEM_NL(56)%IGRBCODE=217189, +YCHEM_NL(56)%LNEGFIX=.TRUE., +YCHEM_NL(56)%IGRIBTC=218189, +YCHEM_NL(56)%LQM=.false., +YCHEM_NL(56)%LQM3D=.TRUE., +YCHEM_NL(56)%LCOMAD=.true., +YCHEM_NL(56)%LADV=.TRUE., +YCHEM_NL(56)%LMASSFIX=.TRUE., +YCHEM_NL(56)%BETAMFBC=-999.9, +YCHEM_NL(56)%LASSIM=.FALSE., +YCHEM_NL(57)%CNAME='CH3O2NO2', +YCHEM_NL(57)%NREQIN=1, +YCHEM_NL(57)%RMOLMASS=93.0, +YCHEM_NL(57)%IGRBCODE=217225, +YCHEM_NL(57)%LNEGFIX=.TRUE., +YCHEM_NL(57)%IGRIBTC=218225, +YCHEM_NL(57)%LQM=.false., +YCHEM_NL(57)%LQM3D=.TRUE., +YCHEM_NL(57)%LCOMAD=.true., +YCHEM_NL(57)%LADV=.TRUE., +YCHEM_NL(57)%LMASSFIX=.TRUE., +YCHEM_NL(57)%BETAMFBC=-999.9, +YCHEM_NL(57)%LASSIM=.FALSE., +YCHEM_NL(58)%CNAME='HONO', +YCHEM_NL(58)%NREQIN=1, +YCHEM_NL(58)%RMOLMASS=47.0, +YCHEM_NL(58)%IGRBCODE=217086, +YCHEM_NL(58)%LNEGFIX=.TRUE., +YCHEM_NL(58)%IGRIBTC=218086, +YCHEM_NL(58)%IGRIBDV=221086, +YCHEM_NL(58)%HENRYA=4.8e+1, +YCHEM_NL(58)%HENRYB=4800.0, +YCHEM_NL(58)%LQM=.false., +YCHEM_NL(58)%LQM3D=.TRUE., +YCHEM_NL(58)%LCOMAD=.true., +YCHEM_NL(58)%LADV=.TRUE., +YCHEM_NL(58)%LMASSFIX=.TRUE., +YCHEM_NL(58)%BETAMFBC=-999.9, +YCHEM_NL(58)%LASSIM=.FALSE., +YCHEM_NL(59)%CNAME='HCN', +YCHEM_NL(59)%NREQIN=1, +YCHEM_NL(59)%RMOLMASS=27.0, +YCHEM_NL(59)%IGRBCODE=217226, +YCHEM_NL(59)%LNEGFIX=.TRUE., +YCHEM_NL(59)%IGRIBTC=218226, +YCHEM_NL(59)%IGRIBDV=221226, +YCHEM_NL(59)%HENRYA=12, +YCHEM_NL(59)%HENRYB=5000., +YCHEM_NL(59)%LQM=.false., +YCHEM_NL(59)%LQM3D=.TRUE., +YCHEM_NL(59)%LCOMAD=.true., +YCHEM_NL(59)%LADV=.TRUE., +YCHEM_NL(59)%LMASSFIX=.TRUE., +YCHEM_NL(59)%BETAMFBC=-999.9, +YCHEM_NL(59)%LASSIM=.FALSE., +YCHEM_NL(60)%CNAME='CH3CN', +YCHEM_NL(60)%NREQIN=1, +YCHEM_NL(60)%RMOLMASS=41.0, +YCHEM_NL(60)%IGRBCODE=217224, +YCHEM_NL(60)%LNEGFIX=.TRUE., +YCHEM_NL(60)%IGRIBTC=218224, +YCHEM_NL(60)%IGRIBDV=221224, +YCHEM_NL(60)%HENRYA=49, +YCHEM_NL(60)%HENRYB=4000., +YCHEM_NL(60)%LQM=.false., +YCHEM_NL(60)%LQM3D=.TRUE., +YCHEM_NL(60)%LCOMAD=.true., +YCHEM_NL(60)%LADV=.TRUE., +YCHEM_NL(60)%LMASSFIX=.TRUE., +YCHEM_NL(60)%BETAMFBC=-999.9, +YCHEM_NL(60)%LASSIM=.FALSE., +YCHEM_NL(61)%CNAME='XYL', +YCHEM_NL(61)%NREQIN=1, +YCHEM_NL(61)%RMOLMASS=106.0, +YCHEM_NL(61)%IGRBCODE=217100, +YCHEM_NL(61)%LNEGFIX=.TRUE., +YCHEM_NL(61)%IGRIBTC=218100, +YCHEM_NL(61)%IGRIBDV=221100, +YCHEM_NL(61)%HENRYA=0.14, +YCHEM_NL(61)%HENRYB=4200.0, +YCHEM_NL(61)%LQM=.false., +YCHEM_NL(61)%LQM3D=.TRUE., +YCHEM_NL(61)%LCOMAD=.true., +YCHEM_NL(61)%LADV=.TRUE., +YCHEM_NL(61)%LMASSFIX=.TRUE., +YCHEM_NL(61)%BETAMFBC=-999.9, +YCHEM_NL(61)%LASSIM=.FALSE., +YCHEM_NL(62)%CNAME='TOL', +YCHEM_NL(62)%NREQIN=1, +YCHEM_NL(62)%RMOLMASS=92.0, +YCHEM_NL(62)%IGRBCODE=217099, +YCHEM_NL(62)%LNEGFIX=.TRUE., +YCHEM_NL(62)%IGRIBTC=218099, +YCHEM_NL(62)%IGRIBDV=221099, +YCHEM_NL(62)%HENRYA=0.15, +YCHEM_NL(62)%HENRYB=4300.0, +YCHEM_NL(62)%LQM=.false., +YCHEM_NL(62)%LQM3D=.TRUE., +YCHEM_NL(62)%LCOMAD=.true., +YCHEM_NL(62)%LADV=.TRUE., +YCHEM_NL(62)%LMASSFIX=.TRUE., +YCHEM_NL(62)%BETAMFBC=-999.9, +YCHEM_NL(62)%LASSIM=.FALSE., +YCHEM_NL(63)%CNAME='AROO2', +YCHEM_NL(63)%NREQIN=1, +YCHEM_NL(63)%RMOLMASS=124.0, +YCHEM_NL(63)%IGRBCODE=217222, +YCHEM_NL(63)%LNEGFIX=.TRUE., +YCHEM_NL(63)%IGRIBTC=218222, +YCHEM_NL(63)%LQM=.false., +YCHEM_NL(63)%LQM3D=.TRUE., +YCHEM_NL(63)%LCOMAD=.true., +YCHEM_NL(63)%LADV=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LMASSFIX=.FALSE., +YCHEM_NL(63)%LASSIM=.FALSE., +YCHEM_NL(64)%CNAME='HPALD1', +YCHEM_NL(64)%NREQIN=1, +YCHEM_NL(64)%RMOLMASS=148.0, +YCHEM_NL(64)%IGRBCODE=217227, +YCHEM_NL(64)%LNEGFIX=.TRUE., +YCHEM_NL(64)%IGRIBTC=218227, +YCHEM_NL(64)%HENRYA=17.0, +YCHEM_NL(64)%HENRYB=5000.0, +YCHEM_NL(64)%LQM=.false., +YCHEM_NL(64)%LQM3D=.TRUE., +YCHEM_NL(64)%LCOMAD=.true., +YCHEM_NL(64)%LADV=.TRUE., +YCHEM_NL(64)%LMASSFIX=.TRUE., +YCHEM_NL(64)%BETAMFBC=-999.9, +YCHEM_NL(64)%LASSIM=.FALSE., +YCHEM_NL(65)%CNAME='HPALD2', +YCHEM_NL(65)%NREQIN=1, +YCHEM_NL(65)%RMOLMASS=148.0, +YCHEM_NL(65)%IGRBCODE=217228, +YCHEM_NL(65)%LNEGFIX=.TRUE., +YCHEM_NL(65)%IGRIBTC=218228, +YCHEM_NL(65)%HENRYA=17.0, +YCHEM_NL(65)%HENRYB=5000.0, +YCHEM_NL(65)%LQM=.false., +YCHEM_NL(65)%LQM3D=.TRUE., +YCHEM_NL(65)%LCOMAD=.true., +YCHEM_NL(65)%LADV=.TRUE., +YCHEM_NL(65)%LMASSFIX=.TRUE., +YCHEM_NL(65)%BETAMFBC=-999.9, +YCHEM_NL(65)%LASSIM=.FALSE., +YCHEM_NL(66)%CNAME='ISOPOOH', +YCHEM_NL(66)%NREQIN=1, +YCHEM_NL(66)%RMOLMASS=118.0, +YCHEM_NL(66)%IGRBCODE=217161, +YCHEM_NL(66)%LNEGFIX=.TRUE., +YCHEM_NL(66)%IGRIBTC=218161, +YCHEM_NL(66)%IGRIBDV=221161, +YCHEM_NL(66)%HENRYA=3.2E11, +YCHEM_NL(66)%HENRYB=8700.0, +YCHEM_NL(66)%LQM=.false., +YCHEM_NL(66)%LQM3D=.TRUE., +YCHEM_NL(66)%LCOMAD=.true., +YCHEM_NL(66)%LADV=.TRUE., +YCHEM_NL(66)%LMASSFIX=.TRUE., +YCHEM_NL(66)%BETAMFBC=-999.9, +YCHEM_NL(66)%LASSIM=.FALSE., +YCHEM_NL(67)%CNAME='GLY', +YCHEM_NL(67)%NREQIN=1, +YCHEM_NL(67)%RMOLMASS=58.04, +YCHEM_NL(67)%IGRBCODE=217107, +YCHEM_NL(67)%LNEGFIX=.TRUE., +YCHEM_NL(67)%IGRIBTC=218107, +YCHEM_NL(67)%IGRIBDV=221107, +YCHEM_NL(67)%HENRYA=4.1E5, +YCHEM_NL(67)%HENRYB=7500.0, +YCHEM_NL(67)%LQM=.false., +YCHEM_NL(67)%LQM3D=.TRUE., +YCHEM_NL(67)%LCOMAD=.true., +YCHEM_NL(67)%LADV=.TRUE., +YCHEM_NL(67)%LMASSFIX=.TRUE., +YCHEM_NL(67)%BETAMFBC=-999.9, +YCHEM_NL(67)%LASSIM=.FALSE., +YCHEM_NL(68)%CNAME='GLYALD', +YCHEM_NL(68)%NREQIN=1, +YCHEM_NL(68)%RMOLMASS=60.05, +YCHEM_NL(68)%IGRBCODE=217101, +YCHEM_NL(68)%LNEGFIX=.TRUE., +YCHEM_NL(68)%IGRIBTC=218101, +YCHEM_NL(68)%IGRIBDV=221101, +YCHEM_NL(68)%HENRYA=4.1E4, +YCHEM_NL(68)%HENRYB=4600.0, +YCHEM_NL(68)%LQM=.false., +YCHEM_NL(68)%LQM3D=.TRUE., +YCHEM_NL(68)%LCOMAD=.true., +YCHEM_NL(68)%LADV=.TRUE., +YCHEM_NL(68)%LMASSFIX=.TRUE., +YCHEM_NL(68)%BETAMFBC=-999.9, +YCHEM_NL(68)%LASSIM=.FALSE., +YCHEM_NL(69)%CNAME='HYAC', +YCHEM_NL(69)%NREQIN=1, +YCHEM_NL(69)%RMOLMASS=74.1, +YCHEM_NL(69)%IGRBCODE=217118, +YCHEM_NL(69)%LNEGFIX=.TRUE., +YCHEM_NL(69)%IGRIBTC=218117, +YCHEM_NL(69)%IGRIBDV=221118, +YCHEM_NL(69)%HENRYA=6.3E3, +YCHEM_NL(69)%HENRYB=6460.0, +YCHEM_NL(69)%LQM=.false., +YCHEM_NL(69)%LQM3D=.TRUE., +YCHEM_NL(69)%LCOMAD=.true., +YCHEM_NL(69)%LADV=.TRUE., +YCHEM_NL(69)%LMASSFIX=.TRUE., +YCHEM_NL(69)%BETAMFBC=-999.9, +YCHEM_NL(69)%LASSIM=.FALSE., +YCHEM_NL(70)%CNAME='ISOPBO2', +YCHEM_NL(70)%NREQIN=1, +YCHEM_NL(70)%RMOLMASS=117.0, +YCHEM_NL(70)%IGRBCODE=217229, +YCHEM_NL(70)%LNEGFIX=.TRUE., +YCHEM_NL(70)%IGRIBTC=218229, +YCHEM_NL(70)%LQM=.false., +YCHEM_NL(70)%LQM3D=.TRUE., +YCHEM_NL(70)%LCOMAD=.true., +YCHEM_NL(70)%LADV=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LMASSFIX=.FALSE., +YCHEM_NL(70)%LASSIM=.FALSE., +YCHEM_NL(71)%CNAME='ISOPDO2', +YCHEM_NL(71)%NREQIN=1, +YCHEM_NL(71)%RMOLMASS=117.0, +YCHEM_NL(71)%IGRBCODE=217230, +YCHEM_NL(71)%LNEGFIX=.TRUE., +YCHEM_NL(71)%IGRIBTC=218230, +YCHEM_NL(71)%LQM=.false., +YCHEM_NL(71)%LQM3D=.TRUE., +YCHEM_NL(71)%LCOMAD=.true., +YCHEM_NL(71)%LADV=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LMASSFIX=.FALSE., +YCHEM_NL(71)%LASSIM=.FALSE., +YCHEM_NL(72)%CNAME='SOG1', +YCHEM_NL(72)%NREQIN=1, +YCHEM_NL(72)%RMOLMASS=180.0, +YCHEM_NL(72)%IGRBCODE=217186, +YCHEM_NL(72)%LNEGFIX=.TRUE., +YCHEM_NL(72)%IGRIBTC=218186, +YCHEM_NL(72)%HENRYA=1.E5, +YCHEM_NL(72)%HENRYB=6000.0, +YCHEM_NL(72)%LQM=.false., +YCHEM_NL(72)%LQM3D=.TRUE., +YCHEM_NL(72)%LCOMAD=.true., +YCHEM_NL(72)%LADV=.TRUE., +YCHEM_NL(72)%LMASSFIX=.TRUE., +YCHEM_NL(72)%BETAMFBC=-999.9, +YCHEM_NL(72)%LASSIM=.FALSE., +YCHEM_NL(73)%CNAME='SOG2A', +YCHEM_NL(73)%NREQIN=1, +YCHEM_NL(73)%RMOLMASS=120.0, +YCHEM_NL(73)%IGRBCODE=217187, +YCHEM_NL(73)%LNEGFIX=.TRUE., +YCHEM_NL(73)%IGRIBTC=218187, +YCHEM_NL(73)%HENRYA=1.E3, +YCHEM_NL(73)%HENRYB=6000.0, +YCHEM_NL(73)%LQM=.false., +YCHEM_NL(73)%LQM3D=.TRUE., +YCHEM_NL(73)%LCOMAD=.true., +YCHEM_NL(73)%LADV=.TRUE., +YCHEM_NL(73)%LMASSFIX=.TRUE., +YCHEM_NL(73)%BETAMFBC=-999.9, +YCHEM_NL(73)%LASSIM=.FALSE., +YCHEM_NL(74)%CNAME='SOG2B', +YCHEM_NL(74)%NREQIN=1, +YCHEM_NL(74)%RMOLMASS=120.0, +YCHEM_NL(74)%IGRBCODE=217188, +YCHEM_NL(74)%LNEGFIX=.TRUE., +YCHEM_NL(74)%IGRIBTC=218188, +YCHEM_NL(74)%HENRYA=1.E5, +YCHEM_NL(74)%HENRYB=6000.0, +YCHEM_NL(74)%LQM=.false., +YCHEM_NL(74)%LQM3D=.TRUE., +YCHEM_NL(74)%LCOMAD=.true., +YCHEM_NL(74)%LADV=.TRUE., +YCHEM_NL(74)%LMASSFIX=.TRUE., +YCHEM_NL(74)%BETAMFBC=-999.9, +YCHEM_NL(74)%LASSIM=.FALSE., +YEXT_NL(1)%CNAME='EMILI', +YEXT_NL(1)%NREQIN=0, +YEXT_NL(1)%IGRBCODE=212254, +YEXT_NL(1)%LADV=.FALSE., +YEXT_NL(1)%LGP=.TRUE., +YEXT_NL(1)%LGPINGP=.TRUE., +YEXT_NL(2)%CNAME='KCH4CHEM', +YEXT_NL(2)%NREQIN=0, +YEXT_NL(2)%IGRBCODE=210071, +YEXT_NL(2)%LADV=.FALSE., +YEXT_NL(2)%LGP=.TRUE., +YEXT_NL(2)%LGPINGP=.TRUE., +NGFL_EXT=2, +LAERCHEM=true +YQ_NL%LGP=true, +YQ_NL%LSP=false, +YL_NL%LGP=true, +YI_NL%LGP=true, +YA_NL%LGP=true, +YO3_NL%LGP=true, +LTRCMFQM=true, +/ +&NAMFPC +CFPFMT="MODEL", +NFP3DFS=5, +NFP3DFP=5, +NFP3DFT=1, +NFP3DFV=1, +MFP3DFS(:)=130,135,138,155,133, +MFP3DFP(:)=129,130,135,138,155, +MFP3DFT=60, +MFP3DFV=133, +NFP2DF=2, +MFP2DF(:)=129,152, +NFPPHY=1, +MFPPHY(:)=31, +NRFP3S(:)=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137, +RFP3P(:)=100000.0,92500.0,85000.0,70000.0,50000.0,40000.0,30000.0,25000.0,20000.0,15000.0,10000.0,7000.0,5000.0,3000.0,2000.0,1000.0,700.0,500.0,300.0,200.0,100.0, +NFPCLI=0, +LFPQ=false, +LTRACEFP=false, +RFPCORR=60000., +/ +&NAMDIM +NPROMA=-16, +/ +&NAMDPHY +NVEXTR=7, +NCEXTR=137, +NCSNEC=5, +/ +&NAMGEM +LNONHYD_GEOM=false, +NHTYP=2, +/ +&NAMRIP +TSTEP=1800.0, +CSTOP='h24', +/ +&NAMARG +NCONF=1, +CNMEXP="abc3", +/ + &NAMRLX + / + &NAEAER + NTYPAER=3,3,2,2,1,2,1,2,0,0, + YAERO_DESC(1)%IGRIBDIAG=215001,215004,215007,215010,215013,215016,215022,215019, +YAERO_DESC(1)%RDDEPVSEA=1.1000E-02, +YAERO_DESC(1)%RDDEPVLIC=1.1000E-02, +YAERO_DESC(1)%RSEDIMV=2.4000E-05, +YAERO_DESC(1)%RSCAVIN=0.9, +YAERO_DESC(1)%RSCAVBCR=0.001, +YAERO_DESC(1)%RSCAVBCS=0.005, +YAERO_DESC(1)%COPTCLASS='SeaSaltSmall', +YAERO_DESC(1)%CHYGCLASS='SeaSalt', +YAERO_DESC(1)%IAEROCV=1, +YAERO_DESC(2)%IGRIBDIAG=215002,215005,215008,215011,215014,215017,215023,215020, +YAERO_DESC(2)%RDDEPVSEA=1.1500E-02, +YAERO_DESC(2)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(2)%RSEDIMV=1.9500E-03, +YAERO_DESC(2)%RSCAVIN=0.9, +YAERO_DESC(2)%RSCAVBCR=0.001, +YAERO_DESC(2)%RSCAVBCS=0.005, +YAERO_DESC(2)%COPTCLASS='SeaSaltMedium', +YAERO_DESC(2)%CHYGCLASS='SeaSalt', +YAERO_DESC(2)%IAEROCV=2, +YAERO_DESC(3)%IGRIBDIAG=215003,215006,215009,215012,215015,215018,215024,215021, +YAERO_DESC(3)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(3)%RDDEPVLIC=1.5000E-02, +YAERO_DESC(3)%RSEDIMV=1.8000E-02, +YAERO_DESC(3)%RSCAVIN=0.9, +YAERO_DESC(3)%RSCAVBCR=0.1, +YAERO_DESC(3)%RSCAVBCS=0.005, +YAERO_DESC(3)%COPTCLASS='SeaSaltLarge', +YAERO_DESC(3)%CHYGCLASS='SeaSalt', +YAERO_DESC(3)%IAEROCV=2, +YAERO_DESC(4)%IGRIBDIAG=215025,215028,215031,215034,215037,215040,215046,215043, +YAERO_DESC(4)%RDDEPVSEA=2.0000E-04, +YAERO_DESC(4)%RDDEPVLIC=2.0000E-04, +YAERO_DESC(4)%RSEDIMV=6.9040E-05, +YAERO_DESC(4)%RSCAVIN=0.7, +YAERO_DESC(4)%RSCAVBCR=0.001, +YAERO_DESC(4)%RSCAVBCS=0.005, +YAERO_DESC(4)%COPTCLASS='DustSmall', +YAERO_DESC(4)%CHYGCLASS='Dust', +YAERO_DESC(4)%IAEROCV=1, +YAERO_DESC(5)%IGRIBDIAG=215026,215029,215032,215035,215038,215041,215047,215044, +YAERO_DESC(5)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(5)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(5)%RSEDIMV=1.9820E-04, +YAERO_DESC(5)%RSCAVIN=0.7, +YAERO_DESC(5)%RSCAVBCR=0.001, +YAERO_DESC(5)%RSCAVBCS=0.005, +YAERO_DESC(5)%COPTCLASS='DustMedium', +YAERO_DESC(5)%CHYGCLASS='Dust', +YAERO_DESC(5)%IAEROCV=2, +YAERO_DESC(6)%IGRIBDIAG=215027,215030,215033,215036,215039,215042,215048,215045, +YAERO_DESC(6)%RDDEPVSEA=1.2000E-02, +YAERO_DESC(6)%RDDEPVLIC=1.2000E-02, +YAERO_DESC(6)%RSEDIMV=1.9620E-03, +YAERO_DESC(6)%RSCAVIN=0.7, +YAERO_DESC(6)%RSCAVBCR=0.1, +YAERO_DESC(6)%RSCAVBCS=0.005, +YAERO_DESC(6)%COPTCLASS='DustLarge', +YAERO_DESC(6)%CHYGCLASS='Dust', +YAERO_DESC(6)%IAEROCV=2, +YAERO_DESC(7)%IGRIBDIAG=215050,215052,215054,215056,215058,215060,215064,215062, +YAERO_DESC(7)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(7)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(7)%RSEDIMV=2.0000E-04, +YAERO_DESC(7)%RSCAVIN=0.7, +YAERO_DESC(7)%RSCAVBCR=0.0001, +YAERO_DESC(7)%RSCAVBCS=0.005, +YAERO_DESC(7)%COPTCLASS='OrganicMatter', +YAERO_DESC(7)%CHYGCLASS='OrganicMatter', +YAERO_DESC(7)%IAEROCV=1, +YAERO_DESC(8)%IGRIBDIAG=215049,215051,215053,215055,215057,215059,215063,215061, +YAERO_DESC(8)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(8)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(8)%RSEDIMV=2.0000E-04, +YAERO_DESC(8)%RSCAVIN=0, +YAERO_DESC(8)%RSCAVBCR=0.0001, +YAERO_DESC(8)%RSCAVBCS=0.005, +YAERO_DESC(8)%COPTCLASS='OrganicMatter', +YAERO_DESC(8)%CHYGCLASS='Hydrophobic', +YAERO_DESC(8)%IAEROCV=1, +YAERO_DESC(9)%IGRIBDIAG=215066,215068,215070,215072,215074,215076,215080,215078, +YAERO_DESC(9)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(9)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(9)%RSEDIMV=2.0000E-04, +YAERO_DESC(9)%RSCAVIN=0.7, +YAERO_DESC(9)%RSCAVBCR=0.0001, +YAERO_DESC(9)%RSCAVBCS=0.005, +YAERO_DESC(9)%COPTCLASS='BlackCarbon', +YAERO_DESC(9)%CHYGCLASS='BlackCarbon', +YAERO_DESC(9)%IAEROCV=1, +YAERO_DESC(10)%IGRIBDIAG=215065,215067,215069,215071,215073,215075,215079,215077, +YAERO_DESC(10)%RDDEPVSEA=1.0000E-03, +YAERO_DESC(10)%RDDEPVLIC=1.0000E-03, +YAERO_DESC(10)%RSEDIMV=2.0000E-04, +YAERO_DESC(10)%RSCAVIN=0, +YAERO_DESC(10)%RSCAVBCR=0.0001, +YAERO_DESC(10)%RSCAVBCS=0.005, +YAERO_DESC(10)%COPTCLASS='BlackCarbon', +YAERO_DESC(10)%CHYGCLASS='Hydrophobic', +YAERO_DESC(10)%IAEROCV=1, +YAERO_DESC(11)%IGRIBDIAG=215081,215082,215083,215084,215085,215086,215088,215087, +YAERO_DESC(11)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(11)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(11)%RSEDIMV=2.0000E-04, +YAERO_DESC(11)%RSCAVIN=0.7, +YAERO_DESC(11)%RSCAVBCR=0.0001, +YAERO_DESC(11)%RSCAVBCS=0.005, +YAERO_DESC(11)%COPTCLASS='Sulphate', +YAERO_DESC(11)%CHYGCLASS='Sulphate', +YAERO_DESC(11)%IAEROCV=1, +YAERO_DESC(12)%IGRIBDIAG=215189,215191,215193,215195,215197,215199,215203,215201, +YAERO_DESC(12)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(12)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(12)%RSEDIMV=2.0000E-04, +YAERO_DESC(12)%RSCAVIN=0.8, +YAERO_DESC(12)%RSCAVBCR=0.0001, +YAERO_DESC(12)%RSCAVBCS=0.005, +YAERO_DESC(12)%COPTCLASS='NitrateFine', +YAERO_DESC(12)%CHYGCLASS='Nitrate', +YAERO_DESC(12)%IAEROCV=1, +YAERO_DESC(13)%IGRIBDIAG=215190,215192,215194,215196,215198,215200,215204,215202, +YAERO_DESC(13)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(13)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(13)%RSEDIMV=1.3352E-03, +YAERO_DESC(13)%RSCAVIN=0.8, +YAERO_DESC(13)%RSCAVBCR=0.1, +YAERO_DESC(13)%RSCAVBCS=0.005, +YAERO_DESC(13)%COPTCLASS='NitrateCoarse', +YAERO_DESC(13)%CHYGCLASS='Nitrate', +YAERO_DESC(13)%IAEROCV=2, +YAERO_DESC(14)%IGRIBDIAG=215205,215206,215207,215208,215209,215210,216042,215211, +YAERO_DESC(14)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(14)%RDDEPVLIC=1.5000E-03, +YAERO_DESC(14)%RSEDIMV=2.0000E-04, +YAERO_DESC(14)%RSCAVIN=0.9, +YAERO_DESC(14)%RSCAVBCR=0.0001, +YAERO_DESC(14)%RSCAVBCS=0.005, +YAERO_DESC(14)%COPTCLASS='Ammonium', +YAERO_DESC(14)%CHYGCLASS='Ammonium', +YAERO_DESC(14)%IAEROCV=1, +YAERO_DESC(15)%IGRIBDIAG=215212,215213,215214,215215,215216,215217,216098,215218, +YAERO_DESC(15)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(15)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(15)%RSEDIMV=2.4000E-04, +YAERO_DESC(15)%RSCAVIN=0.7, +YAERO_DESC(15)%RSCAVBCR=0.0001, +YAERO_DESC(15)%RSCAVBCS=0.005, +YAERO_DESC(15)%COPTCLASS='SecOrgBio', +YAERO_DESC(15)%CHYGCLASS='SecOrgBio', +YAERO_DESC(15)%IAEROCV=1, +YAERO_DESC(16)%IGRIBDIAG=215219,215220,215221,215222,215223,215224,216099,215225, +YAERO_DESC(16)%RDDEPVSEA=1.5000E-03, +YAERO_DESC(16)%RDDEPVLIC=2.5000E-03, +YAERO_DESC(16)%RSEDIMV=2.4000E-04, +YAERO_DESC(16)%RSCAVIN=0.7, +YAERO_DESC(16)%RSCAVBCR=0.0001, +YAERO_DESC(16)%RSCAVBCS=0.005, +YAERO_DESC(16)%COPTCLASS='SecOrgAnth', +YAERO_DESC(16)%CHYGCLASS='SecOrgAnth', +YAERO_DESC(16)%IAEROCV=1, + LAERVOL=false, + NDRYDEPVEL_DYN=2, + LAERDUSTSOURCE=true, + LAERDUSTSIZEVAR=true, + LAERDUST_NEWBIN=false, + RAERDUST_REBOUND=0.1, + LAERNGAT=true, + NAERSCAV=3, + LAERGTOP=true, + LAERHYGRO=true, + LAERSEDIM=true, + LAERSEDIMSS=true, + LAERDRYDP=true, + LAERSURF=true, + NSSALT=4, + NDDUST=2, + NSO4SCHEME=1, + LSEASALT_RH80=true, + LAERRRTM=false, + / + &NAMCOMPO + LCHEM_DIA=true, + LCHEM_DDFLX=true, + LCOMPO_DDFLX_DIR=true, + LCHEM_TROPO=true, + LCOMPO_DCDD=true, + LAERNITRATE=true, + LAEREQSAM4CLIM=false, + LAERSOA=false, + LAERSOA_COUPLED=false, + KGHG_CHEMTEND_CH4=0, + LAERNUCL=true, + AERO_SCHEME="hamm7", + +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219209 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212001 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ene" + THIS%PARAMID=212002 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="fef" + THIS%PARAMID=212003 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="ind" + THIS%PARAMID=212004 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="res" + THIS%PARAMID=212006 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="shp" + THIS%PARAMID=212007 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="slv" + THIS%PARAMID=212189 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="swd" + THIS%PARAMID=212008 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tnr" + THIS%PARAMID=212009 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ALD2" + THIS%SECTOR="tro" + THIS%PARAMID=212010 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212011 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ene" + THIS%PARAMID=212012 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="fef" + THIS%PARAMID=212013 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="ind" + THIS%PARAMID=212014 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="res" + THIS%PARAMID=212015 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="shp" + THIS%PARAMID=212016 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="slv" + THIS%PARAMID=212019 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="swd" + THIS%PARAMID=212017 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C10H16" + THIS%SECTOR="tnr" + THIS%PARAMID=212018 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210106 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212021 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212022 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ene" + THIS%PARAMID=212023 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="fef" + THIS%PARAMID=212024 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ind" + THIS%PARAMID=212025 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="ref" + THIS%PARAMID=212020 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="res" + THIS%PARAMID=212026 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="shp" + THIS%PARAMID=212027 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="slv" + THIS%PARAMID=212133 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="swd" + THIS%PARAMID=212028 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tnr" + THIS%PARAMID=212029 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H4" + THIS%SECTOR="tro" + THIS%PARAMID=212030 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210104 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212031 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ene" + THIS%PARAMID=212032 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="fef" + THIS%PARAMID=212033 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ind" + THIS%PARAMID=212034 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="ref" + THIS%PARAMID=212040 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="res" + THIS%PARAMID=212035 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="shp" + THIS%PARAMID=212036 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="slv" + THIS%PARAMID=212137 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="swd" + THIS%PARAMID=212037 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212038 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H5OH" + THIS%SECTOR="tro" + THIS%PARAMID=212039 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210118 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212041 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212042 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ene" + THIS%PARAMID=212043 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="fef" + THIS%PARAMID=212044 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ind" + THIS%PARAMID=212045 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="ref" + THIS%PARAMID=212134 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="res" + THIS%PARAMID=212046 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="shp" + THIS%PARAMID=212047 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="slv" + THIS%PARAMID=212185 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="swd" + THIS%PARAMID=212048 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212049 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C2H6" + THIS%SECTOR="tro" + THIS%PARAMID=212050 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210107 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212051 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212052 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ene" + THIS%PARAMID=212053 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="fef" + THIS%PARAMID=212054 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ind" + THIS%PARAMID=212055 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="ref" + THIS%PARAMID=212135 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="res" + THIS%PARAMID=212056 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="shp" + THIS%PARAMID=212057 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="slv" + THIS%PARAMID=212186 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="swd" + THIS%PARAMID=212058 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tnr" + THIS%PARAMID=212059 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H6" + THIS%SECTOR="tro" + THIS%PARAMID=212060 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210105 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212061 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212062 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ene" + THIS%PARAMID=212063 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="fef" + THIS%PARAMID=212064 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ind" + THIS%PARAMID=212065 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="ref" + THIS%PARAMID=212136 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="res" + THIS%PARAMID=212066 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="shp" + THIS%PARAMID=212067 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="slv" + THIS%PARAMID=212187 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="swd" + THIS%PARAMID=212068 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212069 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C3H8" + THIS%SECTOR="tro" + THIS%PARAMID=212070 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210108 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212071 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.00 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ene" + THIS%PARAMID=212072 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="fef" + THIS%PARAMID=212073 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ind" + THIS%PARAMID=212074 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="ref" + THIS%PARAMID=212080 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="res" + THIS%PARAMID=212075 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="shp" + THIS%PARAMID=212076 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="slv" + THIS%PARAMID=212198 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="swd" + THIS%PARAMID=212077 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tnr" + THIS%PARAMID=212078 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="C5H8" + THIS%SECTOR="tro" + THIS%PARAMID=212079 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210113 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212081 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ene" + THIS%PARAMID=212082 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="fef" + THIS%PARAMID=212083 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="ind" + THIS%PARAMID=212084 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="res" + THIS%PARAMID=212085 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="shp" + THIS%PARAMID=212086 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="slv" + THIS%PARAMID=212090 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="swd" + THIS%PARAMID=212087 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tnr" + THIS%PARAMID=212088 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH2O" + THIS%SECTOR="tro" + THIS%PARAMID=212089 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219220 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ene" + THIS%SCALING=0.0015 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ind" + THIS%SCALING=0.0015 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="ref" + THIS%SCALING=0.0015 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3CN" + THIS%SECTOR="res" + THIS%SCALING=0.0015 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210115 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212091 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="emiss_nat" + THIS%SCALING=1.4 + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ene" + THIS%PARAMID=212092 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="fef" + THIS%PARAMID=212093 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ind" + THIS%PARAMID=212094 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="ref" + THIS%PARAMID=212100 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="res" + THIS%PARAMID=212095 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="shp" + THIS%PARAMID=212096 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="slv" + THIS%PARAMID=212190 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="swd" + THIS%PARAMID=212097 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212098 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3COCH3" + THIS%SECTOR="tro" + THIS%PARAMID=212099 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210103 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212111 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ene" + THIS%PARAMID=212112 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="fef" + THIS%PARAMID=212113 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ind" + THIS%PARAMID=212114 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="ref" + THIS%PARAMID=212110 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="res" + THIS%PARAMID=212115 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="shp" + THIS%PARAMID=212116 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="slv" + THIS%PARAMID=212140 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="swd" + THIS%PARAMID=212117 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tnr" + THIS%PARAMID=212118 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CH3OH" + THIS%SECTOR="tro" + THIS%PARAMID=212119 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210081 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212121 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212122 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ene" + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="fef" + THIS%PARAMID=212124 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ind" + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="ref" + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="res" + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="shp" + THIS%PARAMID=212127 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="swd" + THIS%PARAMID=212128 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tnr" + THIS%PARAMID=212129 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="CO" + THIS%SECTOR="tro" + THIS%PARAMID=212130 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210117 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212132 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="DMS" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212131 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="GLY" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=212244 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219219 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ene" + THIS%SCALING=0.001 + THIS%PARAMID=212123 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ind" + THIS%SCALING=0.001 + THIS%PARAMID=212125 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="ref" + THIS%SCALING=0.001 + THIS%PARAMID=212120 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCN" + THIS%SECTOR="res" + THIS%SCALING=0.001 + THIS%PARAMID=212126 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212141 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212142 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212143 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212144 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212145 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212146 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212240 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212147 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212148 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="HCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212149 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="ISPD" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212150 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212151 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.25 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ene" + THIS%PARAMID=212152 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="fef" + THIS%PARAMID=212153 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="ind" + THIS%PARAMID=212154 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="res" + THIS%PARAMID=212155 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="shp" + THIS%PARAMID=212156 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="slv" + THIS%PARAMID=212241 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="swd" + THIS%PARAMID=212157 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tnr" + THIS%PARAMID=212158 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="MCOOH" + THIS%SECTOR="tro" + THIS%PARAMID=212159 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210116 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="agl" + THIS%PARAMID=212163 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ags" + THIS%PARAMID=212164 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGS" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212161 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212162 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ene" + THIS%PARAMID=212165 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ind" + THIS%PARAMID=212166 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="ref" + THIS%PARAMID=212138 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="res" + THIS%PARAMID=212167 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="slv" + THIS%PARAMID=212169 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="swd" + THIS%PARAMID=212170 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tnr" + THIS%PARAMID=212171 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NH3" + THIS%SECTOR="tro" + THIS%PARAMID=212172 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210085 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="agl" + THIS%PARAMID=212174 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212173 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ene" + THIS%PARAMID=212176 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="fef" + THIS%PARAMID=212177 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ind" + THIS%PARAMID=212178 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="ref" + THIS%PARAMID=212184 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="res" + THIS%PARAMID=212179 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="shp" + THIS%PARAMID=212180 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="swd" + THIS%PARAMID=212181 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tnr" + THIS%PARAMID=212182 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO" + THIS%SECTOR="tro" + THIS%PARAMID=212183 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="NO2" + THIS%SECTOR="Aviation" + THIS%VERTICAL_PROFILE_TYPE="3D" + THIS%PARAMID=212255 + THIS%SCALING=1.53333333333333 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219208 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212191 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ene" + THIS%PARAMID=212192 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="fef" + THIS%PARAMID=212193 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ind" + THIS%PARAMID=212194 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="ref" + THIS%PARAMID=212200 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="res" + THIS%PARAMID=212195 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="shp" + THIS%PARAMID=212196 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="slv" + THIS%PARAMID=212242 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="swd" + THIS%PARAMID=212197 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tnr" + THIS%PARAMID=212188 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="OLE" + THIS%SECTOR="tro" + THIS%PARAMID=212199 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219207 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=212201 + THIS%DIURNAL_CYCLE_TYPE="VOC" + THIS%DIURNAL_PEAK_HOUR=14 + THIS%DIURNAL_BASELINE=0.65 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ene" + THIS%PARAMID=212202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="fef" + THIS%PARAMID=212203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ind" + THIS%PARAMID=212204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="ref" + THIS%PARAMID=212139 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="res" + THIS%PARAMID=212205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="shp" + THIS%PARAMID=212206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="slv" + THIS%PARAMID=212243 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="swd" + THIS%PARAMID=212207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tnr" + THIS%PARAMID=212208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="PAR" + THIS%SECTOR="tro" + THIS%PARAMID=212209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="Rn" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212210 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=210102 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="emiss_nat" + THIS%PARAMID=212211 + THIS%VERTICAL_PROFILE_TYPE="AltitudeMap" + THIS%VERTICAL_PARAMID=216045 + THIS%VERTICAL_BASE_LEVEL=-1 + THIS%VERTICAL_TOP_LEVEL=-4 + THIS%VERTICAL_THRESHOLD=200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ene" + THIS%PARAMID=212212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="fef" + THIS%PARAMID=212213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ind" + THIS%PARAMID=212214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="ref" + THIS%PARAMID=212220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="res" + THIS%PARAMID=212215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="shp" + THIS%PARAMID=212216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="swd" + THIS%PARAMID=212217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tnr" + THIS%PARAMID=212218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SO2" + THIS%SECTOR="tro" + THIS%PARAMID=212219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="agl" + THIS%PARAMID=216221 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_AGL" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ene" + THIS%PARAMID=216222 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="fef" + THIS%PARAMID=216223 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ind" + THIS%PARAMID=216224 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="ref" + THIS%PARAMID=216225 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="res" + THIS%PARAMID=216226 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="shp" + THIS%PARAMID=216227 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="slv" + THIS%PARAMID=216228 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="swd" + THIS%PARAMID=216229 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tnr" + THIS%PARAMID=216230 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="SOG2B" + THIS%SECTOR="tro" + THIS%PARAMID=216231 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219212 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="emiss_bio" + THIS%PARAMID=216200 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ene" + THIS%PARAMID=216201 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="fef" + THIS%PARAMID=216202 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ind" + THIS%PARAMID=216203 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="ref" + THIS%PARAMID=216204 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="res" + THIS%PARAMID=216205 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="shp" + THIS%PARAMID=216206 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="slv" + THIS%PARAMID=216207 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="swd" + THIS%PARAMID=216208 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tnr" + THIS%PARAMID=216209 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="TOL" + THIS%SECTOR="tro" + THIS%PARAMID=216210 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="Biomass-burning" + THIS%DIURNAL_CYCLE_TYPE="GFAS" + THIS%DIURNAL_PEAK_HOUR=13.5 + THIS%DIURNAL_BASELINE=0.2 + THIS%VERTICAL_PROFILE_TYPE="GFAS" + THIS%VERTICAL_PARAMID=210060 + THIS%PARAMID=219213 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ene" + THIS%PARAMID=216211 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="fef" + THIS%PARAMID=216212 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_FEF" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ind" + THIS%PARAMID=216213 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_IND" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=300 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="ref" + THIS%PARAMID=216214 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_ENE" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=200 + THIS%VERTICAL_TOP_HEIGHT=800 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="res" + THIS%PARAMID=216215 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_RES" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="shp" + THIS%PARAMID=216216 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SHP" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=30 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="slv" + THIS%PARAMID=216217 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SLV" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="swd" + THIS%PARAMID=216218 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_SWD" + THIS%VERTICAL_PROFILE_TYPE="HeightRange" + THIS%VERTICAL_BASE_HEIGHT=20 + THIS%VERTICAL_TOP_HEIGHT=100 +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tnr" + THIS%PARAMID=216219 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TNR" +/ +&NAMCOMPO_EMIS + THIS%SPECIES="XYL" + THIS%SECTOR="tro" + THIS%PARAMID=216220 + THIS%DIURNAL_CYCLE_TYPE="CAMS_GLOB_TRO" +/ +&NAMCOMPO_EMIS +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=210060 +/ +&NAMCOMPO_EMIS_AUX + THIS%PARAMID=216045 +/ +&NAMCOMPO_EMIS_AUX +/ + &NAMCHEM + CHEM_SCHEME="tm5", + LCHEM_DIAC=false, + LCHEM_LIGHT=true, + + KCHEM_WETDEP=2, + LCHEM_0NOX=false, + KCHEM_NOXADV=0, + LCHEM_ANAO3=false, + KCHEM_SOLVE=2, + LCHEM_REVCHEM=false, + LCHEM_BASCOE_JON=false, + LCHEM_BASCOE_HETCHEM=true, + LCHEM_EXTENDJNO2=true, + LCHEM_JOUT=false, + LCHEM_AEROI=false, + LCHEM_O3RAD=true, + KCHEM_DRYDEP=3, + LCHEM_CSHAPE=.false., + LCHEM_WDFR=.true., + / + &NAMVAR + LMODERR=.false., + LJCDFI=.false., + LUSEJCDFI=.false., + LECV=false, + / + &NAMMCC + LMCC_COMPO=false, + / + &NAETLDIAG + / + &NAMVV0 + LLFORCE_READ=false, + / +&NAEAER +/ +&NAEPHY +/ +&NAERAD +/ +&NALBAR +/ +&NALORI +/ +&NAM_DISTRIBUTED_VECTORS +/ +&NAM926 +/ +&NAMAFN +/ +&NAMANA +/ +&NAMARPHY +/ +&NAMCA +/ +&NAMCAPE +/ +&NAMCFU +/ +&NAMCHK +/ +&NAMCHET +/ +&NAMCLDP +/ +&NAMCLTC +/ +&NAMCOM +/ +&NAMCOS +/ +&NAMCTAN +/ +&NAMCUMF +/ +&NAMCUMFS +/ +&NAMCT1 +/ +&NAMCVA +/ +&NAMDDH +/ +&NAMDFHD +/ +&NAMDFI +/ +&NAMDIF +/ +&NAMDIM +/ +&NAMDIMO +/ +&NAMDMSP +/ +&NAMDPHY +/ +&NAMDYN +/ +&NAMDYNA +/ +&NAMDYNA_STATIC +/ +&NAMDYNCORE +/ +&NAMEMIS_CONF +/ +&NAMENKF +/ +&NAMFA +/ +&NAMFFT +/ +&NAMFPC +/ +&NAMFPD +/ +&NAMFPDY2 +/ +&NAMFPDYH +/ +&NAMFPDYP +/ +&NAMFPDYS +/ +&NAMFPDYT +/ +&NAMFPDYV +/ +&NAMFPEZO +/ +&NAMFPF +/ +&NAMFPG +/ +&NAMFPIOS +/ +&NAMFPPHY +/ +&NAMFPSC2 +/ +&NAMFPSC2_DEP +/ +&NAMFY2 +/ +&NAMGEM +/ +&NAMGFL +/ +&NAMGMS +/ +&NAMGOES +/ +&NAMGOM +/ +&NAMGRIB +/ +&NAMGWD +/ +&NAMGWWMS +/ +&NAMHLOPT +/ +&NAMINI +/ +&NAMIOMI +/ +&NAMIOS +/ +&NAMJBCODES +/ +&NAMJFH +/ +&NAMJG +/ +&NAMJO +/ +&NAMKAP +/ +&NAMLCZ +/ +&NAMLEG +/ +&NAMLFI +/ +&NAMMCC +/ +&NAMMCUF +/ +&NAMMETEOSAT +/ +&NAMMTS +/ +&NAMMTSAT +/ +&NAMMTT +/ +&NAMMUL +/ +&NAMNMI +/ +&NAMNASA +/ +&NAMNN +/ +&NAMNPROF +/ +&NAMNUD +/ +&NAMOBS +/ +&NAMONEDVAR +/ +&NAMOPH +/ +&NAMOPTCMEM +/ +&NAMPAR0 +/ +&NAMPARAR +/ +&NAMPAR1 +/ +&NAMPHY +/ +&NAMPHY0 +/ +&NAMPHY1 +/ +&NAMPHY2 +/ +&NAMPHY3 +/ +&NAMPHYDS +/ +&NAMPPC +/ +&NAMPONG +/ +&NAMRAD15 +/ +&NAMRADCMEM +/ +&NAMRCOEF +/ +&NAMRES +/ +&NAMRINC +/ +&NAMRIP +/ +&NAMSATS +/ +&NAMSCC +/ +&NAMSCEN +/ +&NAMSCM +/ +&NAMSENS +/ +&NAMSIMPHL +/ +&NAMSKF +/ +&NAMSPSDT +/ +&NAMSPP +/ +&NAMSSMI +/ +&NAMSTA +/ +&NAMSTOPH +/ +&NAMTCWV +/ +&NAMTESTVAR +/ +&NAMTOPH +/ +&NAMTOVS +/ +&NAMTRAJP +/ +&NAMTRANS +/ +&NAMTRM +/ +&NAMVAR +/ +&NAMVARBC +/ +&NAMVARBC_AIREP +/ +&NAMVARBC_ALLSKY +/ +&NAMVARBC_GBRAD +/ +&NAMVARBC_RAD +/ +&NAMVARBC_SFCOBS +/ +&NAMVARBC_TCWV +/ +&NAMVARBC_TO3 +/ +&NAMVAREPS +/ +&NAMVDOZ +/ +&NAMVFP +/ +&NAMVRTL +/ +&NAMVV0 +/ +&NAMVV1 +/ +&NAMVV2 +/ +&NAMVWRK +/ +&NAMWAVELETJB +/ +&NAMXFU +/ +&NAMZDI +/ +&NAPHLC +/ +&NAV1IS +/ +&NAEPHLI +/ +&NAMCVER +/ +&NAMPPVI +/ +&NAMSPNG +/ +&NAMRLX +/ +&NAMTHLIM +/ +&NAMOOPS +/ +&NAMINTFLEX +/ +&NAMIAU +/ +&NAMDIM_TRAJ +/ +&NAMVDF +/ +&NAMGWDIAG +/ +&NAMTRANS0 +/ +&NAMMETHOX +/ +&NAM_ATLAS_IFS +/ +&NAETLDIAG +/ +&NAMACV +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMTRAJ +/ +&NAMSATSIM +/ +&NAMCMEM_MW +/ +&NAMPHMSE +/ +&NAMNORGWD +/ +&NAMCLRADLID +/ +&NAMDVISI +/ +&NAM_MGRIDS_ADVECTION +/ +&NAMNUDGLH +/ +&NAMPERTOBS +/ +&NAMVARBC_MODES +/ +&NAMM7CTL +/ diff --git a/ifs-test/tests/t255/common/namelists b/ifs-test/tests/t255/common/namelists new file mode 100644 index 00000000..d18f98de --- /dev/null +++ b/ifs-test/tests/t255/common/namelists @@ -0,0 +1,121 @@ +# Namelists that can be shared by all tests. +# Note that some tests may not use all namelists present here; +# e.g. tests adj, sv and tl_taylor do not read namelist NAMAFN. + +# Settings that may be overwritten in individual tests: +# NAMDIM +NPROMA=${NPROMA:-"-24"} + +# NAMPAR0 +LDETAILED_STATS=${LDETAILED_STATS:-".TRUE."} +MBX_SIZE=${MBX_SIZE:-"1000000"} + +# NAMPAR1 +# Additional options as needed: +NAMPAR1_EXTRA=${NAMPAR1_EXTRA:-""} + +# NAMCT0 +LFDBOP=${LFDBOP:-".FALSE."} +NFRHIS=${NFRHIS:-"99"} +NFRPOS=${NFRPOS:-"99"} +NFPOS=${NFPOS:-"2"} +NFRDHP=${NFRDHP:-"1"} +NFRDHFD=${NFRDHFD:-"1"} +NUNDEFLD=${NUNDEFLD:-"-99999999"} +# Additional options as needed: +NAMCT0_EXTRA=${NAMCT0_EXTRA:-""} + +# NAMARG +NCONF=${NCONF:-"1"} +CNMEXP=${CNMEXP:-"'epc8'"} + +# NAMRIP +CSTOP=${CSTOP:-"'t6'"} +TSTEP=${TSTEP:-"3600.000000"} + +# NAEPHY +LEPHYS=${LEPHYS:-".TRUE."} +LSLPHY=${LSLPHY:-".TRUE."} +LERADI=${LERADI:-".TRUE."} +LELAIV=${LELAIV:-".FALSE."} +LEO3CH=${LEO3CH:-".FALSE."} +# Additional options as needed: +NAEPHY_EXTRA=${NAEPHY_EXTRA:-""} + +# NAMDPHY +NVEXTR=${NVEXTR:-"0"} +NCEXTR=${NCEXTR:-"0"} +NAMGEM_EXTRA=${NAMGEM_EXTRA:-""} + +# Create namelist file: +cat > fort.4 << EOF +&NAMDIM +NPROMA=$NPROMA, +/ +&NAMPAR0 +LSTATS=.TRUE., +LDETAILED_STATS=$LDETAILED_STATS, +LSYNCSTATS=.FALSE., +MP_TYPE=2, +MBX_SIZE=$MBX_SIZE, +NPROC=$NPROC, +NOUTPUT=1, +/ +&NAMPAR1 +LSPLIT=.TRUE., +NFLDIN=0, +NSTRIN=1, +NSTROUT=0, +NOUTTYPE=1, +$NAMPAR1_EXTRA +/ +&NAMCT0 +NFRSDI=1, +N3DINI=0, +LREFOUT=.FALSE., +LFDBOP=$LFDBOP, +NFRHIS=$NFRHIS, +NFRPOS=$NFRPOS, +NFPOS=$NFPOS, +NFRDHP=$NFRDHP, +NFRDHFD=$NFRDHFD, +NUNDEFLD=$NUNDEFLD, +$NAMCT0_EXTRA +/ +&NAMARG +LECMWF=.TRUE., +NCONF=$NCONF, +CNMEXP=$CNMEXP, +/ +&NAMRIP +CSTOP=$CSTOP, +TSTEP=$TSTEP, +/ +&NAEPHY +NALBEDOSCHEME=1, +LEPHYS=$LEPHYS, +LSLPHY=$LSLPHY, +LERADI=$LERADI, +LELAIV=$LELAIV, +LEO3CH=$LEO3CH, +LESNML=.true., +NSNMLWS=2, +$NAEPHY_EXTRA +/ +&NAMGEM +NHTYP=0, +$NAMGEM_EXTRA +/ +&NAMAFN +TFP_FUA(1)%LLGP=.FALSE., +/ +&NAMDPHY +NVEXTR=$NVEXTR, +NCEXTR=$NCEXTR, +NCSNEC=5, +/ +&NAMGRIB +NCYCLE=147, +$NAMGRIB_EXTRA +/ +EOF diff --git a/ifs-test/tests/t255/ifsdata/C11CLIM b/ifs-test/tests/t255/ifsdata/C11CLIM new file mode 120000 index 00000000..f740c646 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/C11CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/C11CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/C12CLIM b/ifs-test/tests/t255/ifsdata/C12CLIM new file mode 120000 index 00000000..17d84fad --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/C12CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/C12CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/C22CLIM b/ifs-test/tests/t255/ifsdata/C22CLIM new file mode 120000 index 00000000..61ca5eb9 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/C22CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/C22CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/CCL4CLIM b/ifs-test/tests/t255/ifsdata/CCL4CLIM new file mode 120000 index 00000000..ab4102e9 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/CCL4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/CCL4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/CH4CLIM b/ifs-test/tests/t255/ifsdata/CH4CLIM new file mode 120000 index 00000000..406827a4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/CH4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/CH4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/CO2CLIM b/ifs-test/tests/t255/ifsdata/CO2CLIM new file mode 120000 index 00000000..460ea313 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/CO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/CO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/ECOZC b/ifs-test/tests/t255/ifsdata/ECOZC new file mode 120000 index 00000000..95c80910 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/ECOZC @@ -0,0 +1 @@ +../../t21/ifsdata/ECOZC \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/GCH4CLIM b/ifs-test/tests/t255/ifsdata/GCH4CLIM new file mode 120000 index 00000000..05515b27 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/GCH4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/GCH4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/GCO2CLIM b/ifs-test/tests/t255/ifsdata/GCO2CLIM new file mode 120000 index 00000000..7ac2e3b5 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/GCO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/GCO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/GOZOCLIM b/ifs-test/tests/t255/ifsdata/GOZOCLIM new file mode 120000 index 00000000..dc421863 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/GOZOCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/GOZOCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MCH4CLIM b/ifs-test/tests/t255/ifsdata/MCH4CLIM new file mode 120000 index 00000000..2e1709ba --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MCH4CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/MCH4CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MCICA b/ifs-test/tests/t255/ifsdata/MCICA new file mode 120000 index 00000000..a2c8c3fc --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MCICA @@ -0,0 +1 @@ +../../t21/ifsdata/MCICA \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MCO2CLIM b/ifs-test/tests/t255/ifsdata/MCO2CLIM new file mode 120000 index 00000000..92f7b548 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MCO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/MCO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/MOZOCLIM b/ifs-test/tests/t255/ifsdata/MOZOCLIM new file mode 120000 index 00000000..255761c6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/MOZOCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/MOZOCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/N2OCLIM b/ifs-test/tests/t255/ifsdata/N2OCLIM new file mode 120000 index 00000000..02de0c06 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/N2OCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/N2OCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/NO2CLIM b/ifs-test/tests/t255/ifsdata/NO2CLIM new file mode 120000 index 00000000..3ac8455b --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/NO2CLIM @@ -0,0 +1 @@ +../../t21/ifsdata/NO2CLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/OZOCLIM b/ifs-test/tests/t255/ifsdata/OZOCLIM new file mode 120000 index 00000000..f5669419 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/OZOCLIM @@ -0,0 +1 @@ +../../t21/ifsdata/OZOCLIM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/RADRRTM b/ifs-test/tests/t255/ifsdata/RADRRTM new file mode 120000 index 00000000..4c41eabb --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/RADRRTM @@ -0,0 +1 @@ +../../t21/ifsdata/RADRRTM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/RADSRTM b/ifs-test/tests/t255/ifsdata/RADSRTM new file mode 120000 index 00000000..6da435c6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/RADSRTM @@ -0,0 +1 @@ +../../t21/ifsdata/RADSRTM \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2000 b/ifs-test/tests/t255/ifsdata/SO4_A1B2000 new file mode 120000 index 00000000..041ab211 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2000 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2000 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2010 b/ifs-test/tests/t255/ifsdata/SO4_A1B2010 new file mode 120000 index 00000000..d3c95ce3 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2010 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2010 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2020 b/ifs-test/tests/t255/ifsdata/SO4_A1B2020 new file mode 120000 index 00000000..65c1a7e4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2020 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2020 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2030 b/ifs-test/tests/t255/ifsdata/SO4_A1B2030 new file mode 120000 index 00000000..4a8032e3 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2030 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2030 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2040 b/ifs-test/tests/t255/ifsdata/SO4_A1B2040 new file mode 120000 index 00000000..15109f3c --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2040 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2040 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2050 b/ifs-test/tests/t255/ifsdata/SO4_A1B2050 new file mode 120000 index 00000000..9c300ce1 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2050 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2050 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2060 b/ifs-test/tests/t255/ifsdata/SO4_A1B2060 new file mode 120000 index 00000000..cd03cdab --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2060 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2060 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2070 b/ifs-test/tests/t255/ifsdata/SO4_A1B2070 new file mode 120000 index 00000000..0bb9e6c4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2070 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2070 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2080 b/ifs-test/tests/t255/ifsdata/SO4_A1B2080 new file mode 120000 index 00000000..57435d7d --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2080 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2080 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2090 b/ifs-test/tests/t255/ifsdata/SO4_A1B2090 new file mode 120000 index 00000000..14426887 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2090 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2090 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_A1B2100 b/ifs-test/tests/t255/ifsdata/SO4_A1B2100 new file mode 120000 index 00000000..6df63338 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_A1B2100 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_A1B2100 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1920 b/ifs-test/tests/t255/ifsdata/SO4_OBS1920 new file mode 120000 index 00000000..bb20b1ce --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1920 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1920 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1930 b/ifs-test/tests/t255/ifsdata/SO4_OBS1930 new file mode 120000 index 00000000..6ac3f4cb --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1930 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1930 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1940 b/ifs-test/tests/t255/ifsdata/SO4_OBS1940 new file mode 120000 index 00000000..7086e65f --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1940 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1940 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1950 b/ifs-test/tests/t255/ifsdata/SO4_OBS1950 new file mode 120000 index 00000000..48413184 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1950 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1950 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1960 b/ifs-test/tests/t255/ifsdata/SO4_OBS1960 new file mode 120000 index 00000000..66be33ee --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1960 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1960 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1970 b/ifs-test/tests/t255/ifsdata/SO4_OBS1970 new file mode 120000 index 00000000..2f9d2f32 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1970 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1970 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1980 b/ifs-test/tests/t255/ifsdata/SO4_OBS1980 new file mode 120000 index 00000000..9eca8471 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1980 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1980 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/SO4_OBS1990 b/ifs-test/tests/t255/ifsdata/SO4_OBS1990 new file mode 120000 index 00000000..e17e2801 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/SO4_OBS1990 @@ -0,0 +1 @@ +../../t21/ifsdata/SO4_OBS1990 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc b/ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc new file mode 120000 index 00000000..57324fee --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_cams_climatology_43R3a.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_cams_climatology_43R3a.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc new file mode 120000 index 00000000..f749f58c --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_43R3.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_43R3.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc new file mode 120000 index 00000000..4c4f8712 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_45R2.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_45R2.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc new file mode 120000 index 00000000..067beaec --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_46R1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc new file mode 120000 index 00000000..0b101029 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_46R1_with_NI_AM.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc new file mode 120000 index 00000000..64ac0d9e --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_48R1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc new file mode 120000 index 00000000..c3ea60cb --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_48R1_v2.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc new file mode 120000 index 00000000..3a1cbee6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/aerosol_ifs_rrtm_tegen.nc @@ -0,0 +1 @@ +../../t21/ifsdata/aerosol_ifs_rrtm_tegen.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc b/ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc new file mode 120000 index 00000000..05b351c3 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/fu_ice_scattering_rrtm.nc @@ -0,0 +1 @@ +../../t21/ifsdata/fu_ice_scattering_rrtm.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc new file mode 120000 index 00000000..a51a8ba6 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_46r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/greenhouse_gas_climatology_46r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc new file mode 120000 index 00000000..6e150f99 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/greenhouse_gas_climatology_48r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/greenhouse_gas_climatology_48r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc b/ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc new file mode 120000 index 00000000..de9db8a9 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/greenhouse_gas_timeseries_CMIP6_SSP370_CFC11equiv_47r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/mcica_gamma.nc b/ifs-test/tests/t255/ifsdata/mcica_gamma.nc new file mode 120000 index 00000000..6867db30 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/mcica_gamma.nc @@ -0,0 +1 @@ +../../t21/ifsdata/mcica_gamma.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/rtable_2021 b/ifs-test/tests/t255/ifsdata/rtable_2021 new file mode 120000 index 00000000..824e2a18 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/rtable_2021 @@ -0,0 +1 @@ +../../t21/ifsdata/rtable_2021 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/rtablel_2095 b/ifs-test/tests/t255/ifsdata/rtablel_2095 new file mode 120000 index 00000000..a3115a9c --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/rtablel_2095 @@ -0,0 +1 @@ +../../t21/ifsdata/rtablel_2095 \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc b/ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc new file mode 120000 index 00000000..821344c4 --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/socrates_droplet_scattering_rrtm.nc @@ -0,0 +1 @@ +../../t21/ifsdata/socrates_droplet_scattering_rrtm.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc b/ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc new file mode 120000 index 00000000..d3a39f3b --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/total_solar_irradiance_CMIP6_47r1.nc @@ -0,0 +1 @@ +../../t21/ifsdata/total_solar_irradiance_CMIP6_47r1.nc \ No newline at end of file diff --git a/ifs-test/tests/t255/ifsdata/vtable_L19 b/ifs-test/tests/t255/ifsdata/vtable_L19 new file mode 120000 index 00000000..24f440bf --- /dev/null +++ b/ifs-test/tests/t255/ifsdata/vtable_L19 @@ -0,0 +1 @@ +../../t21/ifsdata/vtable_L19 \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMCLham7INIT b/ifs-test/tests/t255/inidata/ICMCLham7INIT new file mode 120000 index 00000000..02c4da95 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMCLham7INIT @@ -0,0 +1 @@ +PLS_ICMCLham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO new file mode 120000 index 00000000..243008f1 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMCLham7INIT_COMPO @@ -0,0 +1 @@ +PLS_ICMCLham7INIT_COMPO \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMGGham7INIT b/ifs-test/tests/t255/inidata/ICMGGham7INIT new file mode 120000 index 00000000..e4324968 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMGGham7INIT @@ -0,0 +1 @@ +PLS_ICMGGham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMGGham7INIUA b/ifs-test/tests/t255/inidata/ICMGGham7INIUA new file mode 120000 index 00000000..9b80ed00 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMGGham7INIUA @@ -0,0 +1 @@ +PLS_ICMGGham7INIUA \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/ICMSHham7INIT b/ifs-test/tests/t255/inidata/ICMSHham7INIT new file mode 120000 index 00000000..f4dfa8f6 --- /dev/null +++ b/ifs-test/tests/t255/inidata/ICMSHham7INIT @@ -0,0 +1 @@ +PLS_ICMSHham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT new file mode 120000 index 00000000..87b49ff4 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMCLham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO new file mode 120000 index 00000000..f8b579b1 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMCLham7INIT_COMPO @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMCL-INIT-COMPO-2023070100-2023080100 \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT new file mode 120000 index 00000000..2605cea6 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIT @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/emissions/ICMGGham7INIT_2023070100_with_correct_emissions \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA new file mode 120000 index 00000000..2c9f8be5 --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMGGham7INIUA @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMGGham7INIUA \ No newline at end of file diff --git a/ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT b/ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT new file mode 120000 index 00000000..bae56e9e --- /dev/null +++ b/ifs-test/tests/t255/inidata/PLS_ICMSHham7INIT @@ -0,0 +1 @@ +/hpcperm/nm6/oifs48r1-data/datahub/ham7/2023070100/ICMSHham7INIT \ No newline at end of file diff --git a/ifs-test/tests/t255/test_compo_fc_m7/README.md b/ifs-test/tests/t255/test_compo_fc_m7/README.md new file mode 100644 index 00000000..f590620a --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/README.md @@ -0,0 +1,6 @@ +title: test_compo_fc + +# Description + +Forecast test including prognostic composition (aerosols+chemistry) as +used by CAMS. diff --git a/ifs-test/tests/t255/test_compo_fc_m7/params b/ifs-test/tests/t255/test_compo_fc_m7/params new file mode 100644 index 00000000..e3e4ada6 --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/params @@ -0,0 +1,2 @@ +NPROC=256 +NTHREAD=1 diff --git a/ifs-test/tests/t255/test_compo_fc_m7/postprocessing b/ifs-test/tests/t255/test_compo_fc_m7/postprocessing new file mode 100644 index 00000000..40f80871 --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/postprocessing @@ -0,0 +1,4 @@ +echo "No sanity checks implemented" + +./ifs-check-tracers +./ifs-check-bitid diff --git a/ifs-test/tests/t255/test_compo_fc_m7/setup b/ifs-test/tests/t255/test_compo_fc_m7/setup new file mode 100644 index 00000000..7a12efa1 --- /dev/null +++ b/ifs-test/tests/t255/test_compo_fc_m7/setup @@ -0,0 +1,208 @@ +################################################################################ +# Setup file for m7 tests in openifs/ac +# +# Created Feb-2024 Ramiro Checa-Garcia (KNMI) +# +# Updates: +# 01-03-2024 Ramiro Checa-Garcia (KNMI) +# + +# Source common environment variables +. ../common/env_vars + +# Pre-empt some common namelist settings. +# NAMARG: +CNMEXP="'ham7'" + +# NAEPHY: +LEO3CH=".TRUE." +NAEPHY_EXTRA="LO3CH_HLO=.TRUE.," + +# NAMDPHY: +NVEXTR="7" +NCEXTR="137" + +# NAMRIP +CSTOP=${CSTOP:-"'t48'"} # CSTOP: define num. timesteps +TSTEP=${TSTEP:-"1800.000000"} # TSTEP: define time-step in seconds + +# NAMCT0: +NFRPOS=3 +# NAMCT0_EXTRA="NSPPR=1," # uncomment for per-level norms + +# Include common namelists +. ../common/namelists + +cp ../common/fort.4-oac-adapted fort.4 + +#NOTYET # Note: In this setup we include some details by blocks to have a +#NOTYET # more structured and easier to read setup file. For the final +#NOTYET # namelist please check the generated fort.4 after running the experiment. +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET &NAMGFL +#NOTYET !NGHG=2, +#NOTYET !YLRCH4_NL%CNAME='kCH4', +#NOTYET !YLRCH4_NL%IGRBCODE=210071, +#NOTYET !YLRCH4_NL%LGP=.TRUE.,YLRCH4_NL%LTRAJIO=.FALSE., +#NOTYET !YGHG_NL(1)%CNAME='CO2_GHG', +#NOTYET !YGHG_NL(1)%IGRBCODE=210061, +#NOTYET !YGHG_NL(1)%LADV5=true, +#NOTYET !YGHG_NL(1)%LASSIM=true, +#NOTYET !YGHG_NL(1)%LMASSFIX=true, +#NOTYET !YGHG_NL(1)%LNEGFIX=.FALSE., +#NOTYET !YGHG_NL(1)%LQM=false, +#NOTYET !YGHG_NL(1)%LQM3D=true, +#NOTYET !YGHG_NL(1)%BETAMFBC=2, +#NOTYET !YGHG_NL(2)%CNAME='CH4_GHG', +#NOTYET !YGHG_NL(2)%IGRBCODE=210062, +#NOTYET !YGHG_NL(2)%LADV5=true, +#NOTYET !YGHG_NL(2)%LASSIM=true, +#NOTYET !YGHG_NL(2)%LMASSFIX=true, +#NOTYET !YGHG_NL(2)%LNEGFIX=.FALSE., +#NOTYET !YGHG_NL(2)%LQM=false, +#NOTYET !YGHG_NL(2)%LQM3D=true, +#NOTYET !YGHG_NL(2)%BETAMFBC=2, +#NOTYET EOF +#NOTYET +#NOTYET # Include NAMGLF for aerosols (m7) +#NOTYET . ../common/namelist_m7_aero +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET LAERAOT=false, +#NOTYET LAERLISI=false, +#NOTYET EOF +#NOTYET +#NOTYET # === Include NAMGLF for NAERO_WVL_DIAG +#NOTYET # Please comment/uncomment the appropiate line +#NOTYET # +#NOTYET #. ../common/namelist_aer_aerowvldiag # aerwvl used in test_compo_fc +#NOTYET . ../common/namelist_m7_aerowvldiag # aerwvl used in openifs/ac/m7 +#NOTYET +#NOTYET +#NOTYET # === Include chem NAMGLF and YEXT_NL (but only to describe species/outputs) +#NOTYET # Please comment/uncomment the appropiate line +#NOTYET # +#NOTYET #. ../common/namelist_aer_chem # original test_compo_fc settings +#NOTYET . ../common/namelist_m7_chem # chem used in openifs/ac +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET LAERCHEM=true +#NOTYET YQ_NL%LGP=true, +#NOTYET YQ_NL%LSP=false, +#NOTYET YL_NL%LGP=true, +#NOTYET YI_NL%LGP=true, +#NOTYET YA_NL%LGP=true, +#NOTYET YO3_NL%LGP=true, +#NOTYET YQ_NL%LGPINGP=true, +#NOTYET / +#NOTYET &NAERAD +#NOTYET CRTABLEDIR='./ifsdata/rtables/', +#NOTYET LECOMPGRID=false, +#NOTYET RMUZUV=0.01, +#NOTYET NUVTIM=72, +#NOTYET NRADUV=1, +#NOTYET NUV=24, +#NOTYET LUVPROC=false, +#NOTYET LUVAERP=true, +#NOTYET KMODTS=2, +#NOTYET NRPROMA=0, +#NOTYET LO3_CHEM_UV=true, +#NOTYET NAERMACC=0, +#NOTYET NAEROOPT=2, +#NOTYET NCLOUDACT=0, +#NOTYET / +#NOTYET &NAMFPC +#NOTYET CFPFMT="MODEL", +#NOTYET NFP3DFS=2, +#NOTYET NFP3DFP=2, +#NOTYET MFP3DFS(:)=210203,212255 +#NOTYET MFP3DFP(:)=210011,217003 +#NOTYET NFP2DF=1, +#NOTYET MFP2DF(:)=152, +#NOTYET NFPPHY=8, +#NOTYET MFPPHY(:)=210072,210073,210074,210208,210052,214002,210207,215089, +#NOTYET NRFP3S(:)=-99, +#NOTYET RFP3P=100000.,85000.,70000.,50000., +#NOTYET / +#NOTYET &NAEAER +#NOTYET EOF +#NOTYET +#NOTYET # === Include NAEAER description (YAERO_DESC) => possible not for m7 +#NOTYET # Please comment/uncomment the appropiate line +#NOTYET . ../common/namelist_aer_yaerodesc # original test_compo_fc description +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET LAERVOL=false, +#NOTYET NDRYDEPVEL_DYN=2, +#NOTYET LAERDUSTSOURCE=true, +#NOTYET LAERDUSTSIZEVAR=true, +#NOTYET LAERDUST_NEWBIN=false, +#NOTYET RAERDUST_REBOUND=0.1, +#NOTYET LAERNGAT=true, +#NOTYET NAERSCAV=3, +#NOTYET LAERGTOP=true, +#NOTYET LAERHYGRO=true, +#NOTYET LAERSEDIM=true, +#NOTYET LAERSEDIMSS=true, +#NOTYET LAERDRYDP=false, +#NOTYET LAERSURF=true, +#NOTYET NSSALT=1, +#NOTYET NDDUST=3, +#NOTYET NSO4SCHEME=1, +#NOTYET LSEASALT_RH80=true, +#NOTYET LAERRRTM=true, +#NOTYET / +#NOTYET &NAMCOMPO +#NOTYET LCHEM_DIA=false, +#NOTYET LCHEM_DDFLX=true, +#NOTYET LCOMPO_DDFLX_DIR=true, +#NOTYET LCHEM_TROPO=true, +#NOTYET LCOMPO_DCDD=true, +#NOTYET LAERNITRATE=false, +#NOTYET LAEREQSAM4CLIM=false, +#NOTYET LAERSOA=false, +#NOTYET LAERSOA_COUPLED=false, +#NOTYET KGHG_CHEMTEND_CH4=0, +#NOTYET LAERNUCL=true, +#NOTYET AERO_SCHEME="hamm7", +#NOTYET / +#NOTYET &NAMCHEM +#NOTYET CHEM_SCHEME="tm5", +#NOTYET LCHEM_DIAC=false, +#NOTYET LCHEM_LIGHT=true, +#NOTYET KCHEM_WETDEP=2, +#NOTYET KCHEM_DRYDEP=3, +#NOTYET LCHEM_0NOX=false, +#NOTYET KCHEM_NOXADV=0, +#NOTYET LCHEM_ANAO3=false, +#NOTYET KCHEM_SOLVE=2, +#NOTYET LCHEM_REVCHEM=false, +#NOTYET LCHEM_BASCOE_JON=false, +#NOTYET LCHEM_BASCOE_HETCHEM=true, +#NOTYET LCHEM_EXTENDJNO2=true, +#NOTYET LCHEM_JOUT=false, +#NOTYET LCHEM_AEROI=false, +#NOTYET LCHEM_O3RAD=true, +#NOTYET LCHEM_CSHAPE=.false., +#NOTYET LCHEM_WDFR=.true., +#NOTYET / +#NOTYET +#NOTYET &NAMMCC +#NOTYET LMCCEC=true, +#NOTYET LMCCIEC=false, +#NOTYET LMCC_COMPO=true, +#NOTYET / +#NOTYET EOF +#NOTYET +#NOTYET # === Include compo emissions namelist (moved to end of file) +#NOTYET # Please comment/ uncomment the appropiate line +#NOTYET # +#NOTYET #. ../common/namelist_aer_compoemis # original test_compo_fc emissions +#NOTYET +#NOTYET . ../common/namelist_m7_compoemis # emissions used in openifs/ac +#NOTYET +#NOTYET cat >> fort.4 << EOF +#NOTYET &NAMM7CTL +#NOTYET / +#NOTYET EOF diff --git a/oifs-config.edit_me.sh b/oifs-config.edit_me.sh index 34493d30..7fb83ac6 100644 --- a/oifs-config.edit_me.sh +++ b/oifs-config.edit_me.sh @@ -24,7 +24,10 @@ export OIFS_HOST="local" export OIFS_PLATFORM="local" -#--- set principal OIFS variables ------------------------------ +#--- if OIFS_DEBUGGER is set, oifs-run can use it to activate debugger --------- +export OIFS_DEBUGGER="DDT" + +#--- set principal OIFS variables ---------------------------------------------- export OIFS_CYCLE=48r1 export OIFS_CLIMATE="climate.v020" diff --git a/oifs-config.nld5163.sh b/oifs-config.nld5163.sh new file mode 100644 index 00000000..fd72ec0b --- /dev/null +++ b/oifs-config.nld5163.sh @@ -0,0 +1,102 @@ +# +# +# oifs-config.edit_me.sh +# +# +# This script sets the environment for OpenIFS 48r1 +# +# +# Read this script using the command: +# +# source ./oifs-config.edit_me.sh +# +# +#--- set machine specific settings ----------------------------- + +export OIFS_HOST="ecmwf" +export OIFS_PLATFORM="hpc2020" + +#--- if OIFS_DEBUGGER is set, oifs-run can use it to activate debugger --------- +export OIFS_DEBUGGER="DDT" + +#--- set principal OIFS variables ------------------------------ +# +# CUSTOMIZED FOR USER NLD5163 +# +# CODE ----> stored in $PERM/openifs/oifs_code/branch_name/openifs-48r1 +# DATA ----> stored in $PERM/openifs/oifs_data/CYCLE/ +# EXPS ----> stored in $PERM/openifs/oifs_exps/CYCLE/ +# +# This file is therefore adapted to this particular workflow +# +# +# +# + +branch_path="$(pwd)" # We run this script in its directoryr +old=$IFS +IFS=$IFS"/" # We will split path in char "/". IFS variable is bash stuff. +array_path=() # Initialize array to empty +for i in $branch_path; do # We fill array with elements + array_path+=($i) +done +IFS=$old + +branch_name=${array_path[4]} # In my current setting branch_name is in position 3 (from 0) +echo +echo "Selecting the branch as: "$branch_name +export OIFS_CYCLE=48r1 + +#---Base code assumes openifs-48r1 and openifs-expt are installed +#---in $HOME. Either these can be changed by the user------------ + +export OIFS_HOME="${PERM}/openifs/oifs_code/"$branch_name"/openifs-48r1" + +#---It is recommended that the openifs-expt and oifs_data dir +#---exist in a location designed for permanent storage----------- +export OIFS_EXPT="${PERM}/openifs/oifs_exps"/${OIFS_CYCLE} +export OIFS_DATA_DIR="${HPCPERM}/openifs/oifs_data/"${OIFS_CYCLE} + +#---Set the path for the arch directory. Depending on system,i.e., +#---all libs are installed on the sytem, this is not required, +#---so set to an empty string OIFS_ARCH="" +#export OIFS_ARCH="./arch/ecmwf/hpc2020/gnu/" +export OIFS_ARCH="./arch/ecmwf/hpc2020/" + +#---Path to the executable for 3d global model. This is the +#---default path for the exe, produced by openifs-test.sh. +#---DP means double precision. To run single precision change +#---DP to SP +export OIFS_EXEC="${OIFS_HOME}/build/bin/ifsMASTER.DP" + +#---Default assumed paths, only change if you know what you are doing +export OIFS_TEST="${OIFS_HOME}/scripts/build_test" +export OIFS_RUN_SCRIPT="${OIFS_HOME}/scripts/exp_3d" +export OIFS_LOGFILE="${OIFS_HOME}/oifs_test_log.txt" + +alias oenv="env -0 | sort -z | tr '\0' '\n' | grep -a OIFS_" + +echo -e "\nOpenIFS environment variables are:" +echo "------------------------------------------------------" +env -0 | sort -z | tr '\0' '\n' | grep -a OIFS_ +echo + +#---Path to the executable for the SCM. This is the +#---default path for the exe, produced by openifs-test.sh. +#---DP means double precision. To run single precision change +#---DP to SP +export SCM_EXEC="${OIFS_HOME}/build/bin/MASTER_scm.DP" + +#---Default assumed paths, only change if you know what you are doing +export SCM_TEST="${OIFS_HOME}/scripts/scm" +export SCM_RUNDIR="${OIFS_EXPT}/scm_openifs/48r1/scm-projects/ref48r1" +export SCM_PROJDIR="${OIFS_EXPT}/scm_openifs/48r1/scm-projects" +export SCM_VERSIONDIR="${OIFS_EXPT}/scm_openifs/48r1" +export SCM_LOGFILE="${SCM_RUNDIR}/scm_run_log.txt" + +alias scm_env="env -0 | sort -z | tr '\0' '\n' | grep -a SCM_" + +echo -e "\nSCM environment variables are:" +echo "------------------------------------------------------" +env -0 | sort -z | tr '\0' '\n' | grep -a SCM_ +echo diff --git a/scripts/build_test/openifs-test.sh b/scripts/build_test/openifs-test.sh index 6356ed4d..5d9eb90b 100755 --- a/scripts/build_test/openifs-test.sh +++ b/scripts/build_test/openifs-test.sh @@ -239,7 +239,7 @@ fi if [[ "$PLATFORM" == "hpc2020" ]] ; then IGT_BUILD_LAUNCHER="${IGT_BUILD_LAUNCHER-srun -c ${NUM_THREADS} --mem=60GB --time=60}" - IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER-salloc -n 8 --mem=20GB --time=120}" + IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER-salloc -N 2 --qos=np}" else IGT_BUILD_LAUNCHER="${IGT_BUILD_LAUNCHER:-}" IGT_TEST_LAUNCHER="${IGT_TEST_LAUNCHER:-}" diff --git a/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job b/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job old mode 100644 new mode 100755 index d2ae6e2a..0481e873 --- a/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job +++ b/scripts/exp_3d/run-oifs.ecmwf-hpc2020.job @@ -96,6 +96,7 @@ env | grep -i slurm ####export MBX_SIZE=128000000 # Make sure process stack limit is increased +export OMP_STACKSIZE=128M ulimit -s unlimited ./oifs-run