626 int nbnd = k_dist.get_nband();
627 int ngpt = k_dist.get_ngpt();
628 int ngas = gas_concs.get_num_gases();
631 auto& flux_up = fluxes.flux_up;
632 auto& flux_dn = fluxes.flux_dn;
633 auto& flux_dn_dir = fluxes.flux_dn_dir;
634 auto& bnd_flux_up = fluxes.bnd_flux_up;
635 auto& bnd_flux_dn = fluxes.bnd_flux_dn;
636 auto& bnd_flux_dn_dir = fluxes.bnd_flux_dn_dir;
637 auto& clnclrsky_flux_up = clnclrsky_fluxes.flux_up;
638 auto& clnclrsky_flux_dn = clnclrsky_fluxes.flux_dn;
639 auto& clnclrsky_flux_dn_dir = clnclrsky_fluxes.flux_dn_dir;
640 auto& clrsky_flux_up = clrsky_fluxes.flux_up;
641 auto& clrsky_flux_dn = clrsky_fluxes.flux_dn;
642 auto& clrsky_flux_dn_dir = clrsky_fluxes.flux_dn_dir;
643 auto& clnsky_flux_up = clnsky_fluxes.flux_up;
644 auto& clnsky_flux_dn = clnsky_fluxes.flux_dn;
645 auto& clnsky_flux_dn_dir = clnsky_fluxes.flux_dn_dir;
648 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
649 KOKKOS_LAMBDA (
int icol,
int ilev)
651 flux_up (icol,ilev) = 0;
652 flux_dn (icol,ilev) = 0;
653 flux_dn_dir(icol,ilev) = 0;
654 clnclrsky_flux_up (icol,ilev) = 0;
655 clnclrsky_flux_dn (icol,ilev) = 0;
656 clnclrsky_flux_dn_dir(icol,ilev) = 0;
657 clrsky_flux_up (icol,ilev) = 0;
658 clrsky_flux_dn (icol,ilev) = 0;
659 clrsky_flux_dn_dir(icol,ilev) = 0;
660 clnsky_flux_up (icol,ilev) = 0;
661 clnsky_flux_dn (icol,ilev) = 0;
662 clnsky_flux_dn_dir(icol,ilev) = 0;
664 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {ncol, nlay+1, nbnd}),
665 KOKKOS_LAMBDA (
int icol,
int ilev,
int ibnd)
667 bnd_flux_up (icol,ilev,ibnd) = 0;
668 bnd_flux_dn (icol,ilev,ibnd) = 0;
669 bnd_flux_dn_dir(icol,ilev,ibnd) = 0;
673 int1d_k dayIndices(
"dayIndices", ncol);
674 Kokkos::deep_copy(dayIndices, -1);
678 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
int& nday_inner)
680 for (
int icol = 0; icol < ncol; ++icol) {
682 dayIndices(nday_inner++) = icol;
685 }, Kokkos::Sum<int>(nday));
695 Kokkos::parallel_for(nday, KOKKOS_LAMBDA(
int iday)
697 mu0_day(iday) = mu0(dayIndices(iday));
701 real2d_k p_lay_day(
"p_lay_day", nday, nlay);
702 real2d_k t_lay_day(
"t_lay_day", nday, nlay);
703 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
704 KOKKOS_LAMBDA (
int iday,
int ilay)
706 p_lay_day(iday,ilay) = p_lay(dayIndices(iday),ilay);
707 t_lay_day(iday,ilay) = t_lay(dayIndices(iday),ilay);
709 real2d_k p_lev_day(
"p_lev_day", nday, nlay+1);
710 real2d_k t_lev_day(
"t_lev_day", nday, nlay+1);
711 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
712 KOKKOS_LAMBDA (
int iday,
int ilay)
714 p_lev_day(iday,ilay) = p_lev(dayIndices(iday),ilay);
715 t_lev_day(iday,ilay) = t_lev(dayIndices(iday),ilay);
719 auto gas_names = gas_concs.get_gas_names();
721 gas_concs_day.init(gas_names, nday, nlay);
722 for (
int igas = 0; igas < ngas; igas++) {
723 real2d_k vmr_day(
"vmr_day", nday, nlay);
725 gas_concs.get_vmr(gas_names[igas], vmr);
726 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
727 KOKKOS_LAMBDA (
int iday,
int ilay)
729 vmr_day(iday,ilay) = vmr(dayIndices(iday),ilay);
731 gas_concs_day.set_vmr(gas_names[igas], vmr_day);
736 aerosol_day.init(k_dist.get_band_lims_wavenumber());
737 aerosol_day.alloc_2str(nday, nlay);
738 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, nbnd}),
739 KOKKOS_LAMBDA (
int iday,
int ilay,
int ibnd)
741 aerosol_day.tau(iday,ilay,ibnd) = aerosol.tau(dayIndices(iday),ilay,ibnd);
742 aerosol_day.ssa(iday,ilay,ibnd) = aerosol.ssa(dayIndices(iday),ilay,ibnd);
743 aerosol_day.g (iday,ilay,ibnd) = aerosol.g (dayIndices(iday),ilay,ibnd);
749 clouds_day.init(k_dist.get_band_lims_wavenumber(), k_dist.get_band_lims_gpoint());
750 clouds_day.alloc_2str(nday, nlay);
751 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, ngpt}),
752 KOKKOS_LAMBDA (
int iday,
int ilay,
int igpt)
754 clouds_day.tau(iday,ilay,igpt) = clouds.tau(dayIndices(iday),ilay,igpt);
755 clouds_day.ssa(iday,ilay,igpt) = clouds.ssa(dayIndices(iday),ilay,igpt);
756 clouds_day.g (iday,ilay,igpt) = clouds.g (dayIndices(iday),ilay,igpt);
762 real2d_k sfc_alb_dir_T(
"sfc_alb_dir", nbnd, nday);
763 real2d_k sfc_alb_dif_T(
"sfc_alb_dif", nbnd, nday);
764 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nbnd, nday}),
765 KOKKOS_LAMBDA (
int ibnd,
int icol)
767 sfc_alb_dir_T(ibnd,icol) = sfc_alb_dir(dayIndices(icol),ibnd);
768 sfc_alb_dif_T(ibnd,icol) = sfc_alb_dif(dayIndices(icol),ibnd);
772 real2d_k flux_up_day(
"flux_up_day", nday, nlay+1);
773 real2d_k flux_dn_day(
"flux_dn_day", nday, nlay+1);
774 real2d_k flux_dn_dir_day(
"flux_dn_dir_day", nday, nlay+1);
775 real3d_k bnd_flux_up_day(
"bnd_flux_up_day", nday, nlay+1, nbnd);
776 real3d_k bnd_flux_dn_day(
"bnd_flux_dn_day", nday, nlay+1, nbnd);
777 real3d_k bnd_flux_dn_dir_day(
"bnd_flux_dn_dir_day", nday, nlay+1, nbnd);
779 fluxes_day.flux_up = flux_up_day;
780 fluxes_day.flux_dn = flux_dn_day;
781 fluxes_day.flux_dn_dir = flux_dn_dir_day;
782 fluxes_day.bnd_flux_up = bnd_flux_up_day;
783 fluxes_day.bnd_flux_dn = bnd_flux_dn_day;
784 fluxes_day.bnd_flux_dn_dir = bnd_flux_dn_dir_day;
788 optics.alloc_2str(nday, nlay, k_dist);
791 if (extra_clnsky_diag) {
793 optics_no_aerosols.alloc_2str(nday, nlay, k_dist);
797 real2d_k t_lay_limited(
"t_lay_limited", nday, nlay);
802 real2d_k toa_flux(
"toa_flux", nday, ngpt);
803 real3d_k col_gas(
"col_gas", ncol, nlay, k_dist.get_ngas()+1);
804 bool top_at_1 =
false;
805 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
bool& val)
807 val |= p_lay(0, 0) < p_lay(0, nlay-1);
808 }, Kokkos::LOr<bool>(top_at_1));
810 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
811 t_lay_limited, gas_concs_day, col_gas, optics, toa_flux);
812 if (extra_clnsky_diag) {
813 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
814 t_lay_limited, gas_concs_day, col_gas, optics_no_aerosols, toa_flux);
818 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, ngpt}),
819 KOKKOS_LAMBDA (
int iday,
int igpt)
821 toa_flux(iday,igpt) = tsi_scaling * toa_flux(iday,igpt);
824 if (extra_clnclrsky_diag) {
826 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
828 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
829 KOKKOS_LAMBDA (
int iday,
int ilev)
831 int icol = dayIndices(iday);
832 clnclrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
833 clnclrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
834 clnclrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
839 aerosol_day.delta_scale();
840 aerosol_day.increment(optics);
843 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
846 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
847 KOKKOS_LAMBDA (
int iday,
int ilev)
849 int icol = dayIndices(iday);
850 clrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
851 clrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
852 clrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
858 clouds_day.delta_scale();
859 clouds_day.increment(optics);
862 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
865 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
866 KOKKOS_LAMBDA (
int iday,
int ilev)
868 int icol = dayIndices(iday);
869 flux_up (icol,ilev) = flux_up_day (iday,ilev);
870 flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
871 flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
873 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay+1, nbnd}),
874 KOKKOS_LAMBDA (
int iday,
int ilev,
int ibnd)
876 int icol = dayIndices(iday);
877 bnd_flux_up (icol,ilev,ibnd) = bnd_flux_up_day (iday,ilev,ibnd);
878 bnd_flux_dn (icol,ilev,ibnd) = bnd_flux_dn_day (iday,ilev,ibnd);
879 bnd_flux_dn_dir(icol,ilev,ibnd) = bnd_flux_dn_dir_day(iday,ilev,ibnd);
882 if (extra_clnsky_diag) {
884 clouds_day.increment(optics_no_aerosols);
886 rte_sw(optics_no_aerosols, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
888 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
889 KOKKOS_LAMBDA (
int iday,
int ilev)
891 int icol = dayIndices(iday);
892 clnsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
893 clnsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
894 clnsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
GasConcsK< RealT, layout_t, KokkosDefaultDevice > gas_concs_t
Definition: ERF_RRTMGP_Interface.H:32