620 int nbnd = k_dist.get_nband();
621 int ngpt = k_dist.get_ngpt();
622 int ngas = gas_concs.get_num_gases();
625 auto& flux_up = fluxes.flux_up;
626 auto& flux_dn = fluxes.flux_dn;
627 auto& flux_dn_dir = fluxes.flux_dn_dir;
628 auto& bnd_flux_up = fluxes.bnd_flux_up;
629 auto& bnd_flux_dn = fluxes.bnd_flux_dn;
630 auto& bnd_flux_dn_dir = fluxes.bnd_flux_dn_dir;
631 auto& clnclrsky_flux_up = clnclrsky_fluxes.flux_up;
632 auto& clnclrsky_flux_dn = clnclrsky_fluxes.flux_dn;
633 auto& clnclrsky_flux_dn_dir = clnclrsky_fluxes.flux_dn_dir;
634 auto& clrsky_flux_up = clrsky_fluxes.flux_up;
635 auto& clrsky_flux_dn = clrsky_fluxes.flux_dn;
636 auto& clrsky_flux_dn_dir = clrsky_fluxes.flux_dn_dir;
637 auto& clnsky_flux_up = clnsky_fluxes.flux_up;
638 auto& clnsky_flux_dn = clnsky_fluxes.flux_dn;
639 auto& clnsky_flux_dn_dir = clnsky_fluxes.flux_dn_dir;
642 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
643 KOKKOS_LAMBDA (
int icol,
int ilev)
645 flux_up (icol,ilev) = 0;
646 flux_dn (icol,ilev) = 0;
647 flux_dn_dir(icol,ilev) = 0;
648 clnclrsky_flux_up (icol,ilev) = 0;
649 clnclrsky_flux_dn (icol,ilev) = 0;
650 clnclrsky_flux_dn_dir(icol,ilev) = 0;
651 clrsky_flux_up (icol,ilev) = 0;
652 clrsky_flux_dn (icol,ilev) = 0;
653 clrsky_flux_dn_dir(icol,ilev) = 0;
654 clnsky_flux_up (icol,ilev) = 0;
655 clnsky_flux_dn (icol,ilev) = 0;
656 clnsky_flux_dn_dir(icol,ilev) = 0;
658 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {ncol, nlay+1, nbnd}),
659 KOKKOS_LAMBDA (
int icol,
int ilev,
int ibnd)
661 bnd_flux_up (icol,ilev,ibnd) = 0;
662 bnd_flux_dn (icol,ilev,ibnd) = 0;
663 bnd_flux_dn_dir(icol,ilev,ibnd) = 0;
667 int1d_k dayIndices(
"dayIndices", ncol);
668 Kokkos::deep_copy(dayIndices, -1);
672 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
int& nday_inner)
674 for (
int icol = 0; icol < ncol; ++icol) {
676 dayIndices(nday_inner++) = icol;
679 }, Kokkos::Sum<int>(nday));
689 Kokkos::parallel_for(nday, KOKKOS_LAMBDA(
int iday)
691 mu0_day(iday) = mu0(dayIndices(iday));
695 real2d_k p_lay_day(
"p_lay_day", nday, nlay);
696 real2d_k t_lay_day(
"t_lay_day", nday, nlay);
697 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
698 KOKKOS_LAMBDA (
int iday,
int ilay)
700 p_lay_day(iday,ilay) = p_lay(dayIndices(iday),ilay);
701 t_lay_day(iday,ilay) = t_lay(dayIndices(iday),ilay);
703 real2d_k p_lev_day(
"p_lev_day", nday, nlay+1);
704 real2d_k t_lev_day(
"t_lev_day", nday, nlay+1);
705 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
706 KOKKOS_LAMBDA (
int iday,
int ilay)
708 p_lev_day(iday,ilay) = p_lev(dayIndices(iday),ilay);
709 t_lev_day(iday,ilay) = t_lev(dayIndices(iday),ilay);
713 auto gas_names = gas_concs.get_gas_names();
715 gas_concs_day.init(gas_names, nday, nlay);
716 for (
int igas = 0; igas < ngas; igas++) {
717 real2d_k vmr_day(
"vmr_day", nday, nlay);
719 gas_concs.get_vmr(gas_names[igas], vmr);
720 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
721 KOKKOS_LAMBDA (
int iday,
int ilay)
723 vmr_day(iday,ilay) = vmr(dayIndices(iday),ilay);
725 gas_concs_day.set_vmr(gas_names[igas], vmr_day);
730 aerosol_day.init(k_dist.get_band_lims_wavenumber());
731 aerosol_day.alloc_2str(nday, nlay);
732 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, nbnd}),
733 KOKKOS_LAMBDA (
int iday,
int ilay,
int ibnd)
735 aerosol_day.tau(iday,ilay,ibnd) = aerosol.tau(dayIndices(iday),ilay,ibnd);
736 aerosol_day.ssa(iday,ilay,ibnd) = aerosol.ssa(dayIndices(iday),ilay,ibnd);
737 aerosol_day.g (iday,ilay,ibnd) = aerosol.g (dayIndices(iday),ilay,ibnd);
743 clouds_day.init(k_dist.get_band_lims_wavenumber(), k_dist.get_band_lims_gpoint());
744 clouds_day.alloc_2str(nday, nlay);
745 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, ngpt}),
746 KOKKOS_LAMBDA (
int iday,
int ilay,
int igpt)
748 clouds_day.tau(iday,ilay,igpt) = clouds.tau(dayIndices(iday),ilay,igpt);
749 clouds_day.ssa(iday,ilay,igpt) = clouds.ssa(dayIndices(iday),ilay,igpt);
750 clouds_day.g (iday,ilay,igpt) = clouds.g (dayIndices(iday),ilay,igpt);
756 real2d_k sfc_alb_dir_T(
"sfc_alb_dir", nbnd, nday);
757 real2d_k sfc_alb_dif_T(
"sfc_alb_dif", nbnd, nday);
758 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nbnd, nday}),
759 KOKKOS_LAMBDA (
int ibnd,
int icol)
761 sfc_alb_dir_T(ibnd,icol) = sfc_alb_dir(dayIndices(icol),ibnd);
762 sfc_alb_dif_T(ibnd,icol) = sfc_alb_dif(dayIndices(icol),ibnd);
766 real2d_k flux_up_day(
"flux_up_day", nday, nlay+1);
767 real2d_k flux_dn_day(
"flux_dn_day", nday, nlay+1);
768 real2d_k flux_dn_dir_day(
"flux_dn_dir_day", nday, nlay+1);
769 real3d_k bnd_flux_up_day(
"bnd_flux_up_day", nday, nlay+1, nbnd);
770 real3d_k bnd_flux_dn_day(
"bnd_flux_dn_day", nday, nlay+1, nbnd);
771 real3d_k bnd_flux_dn_dir_day(
"bnd_flux_dn_dir_day", nday, nlay+1, nbnd);
773 fluxes_day.flux_up = flux_up_day;
774 fluxes_day.flux_dn = flux_dn_day;
775 fluxes_day.flux_dn_dir = flux_dn_dir_day;
776 fluxes_day.bnd_flux_up = bnd_flux_up_day;
777 fluxes_day.bnd_flux_dn = bnd_flux_dn_day;
778 fluxes_day.bnd_flux_dn_dir = bnd_flux_dn_dir_day;
782 optics.alloc_2str(nday, nlay, k_dist);
785 if (extra_clnsky_diag) {
787 optics_no_aerosols.alloc_2str(nday, nlay, k_dist);
791 real2d_k t_lay_limited(
"t_lay_limited", nday, nlay);
796 real2d_k toa_flux(
"toa_flux", nday, ngpt);
797 real3d_k col_gas(
"col_gas", ncol, nlay, k_dist.get_ngas()+1);
798 bool top_at_1 =
false;
799 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
bool& val)
801 val |= p_lay(0, 0) < p_lay(0, nlay-1);
802 }, Kokkos::LOr<bool>(top_at_1));
804 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
805 t_lay_limited, gas_concs_day, col_gas, optics, toa_flux);
806 if (extra_clnsky_diag) {
807 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
808 t_lay_limited, gas_concs_day, col_gas, optics_no_aerosols, toa_flux);
812 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, ngpt}),
813 KOKKOS_LAMBDA (
int iday,
int igpt)
815 toa_flux(iday,igpt) = tsi_scaling * toa_flux(iday,igpt);
818 if (extra_clnclrsky_diag) {
820 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
822 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
823 KOKKOS_LAMBDA (
int iday,
int ilev)
825 int icol = dayIndices(iday);
826 clnclrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
827 clnclrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
828 clnclrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
833 aerosol_day.delta_scale();
834 aerosol_day.increment(optics);
837 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
840 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
841 KOKKOS_LAMBDA (
int iday,
int ilev)
843 int icol = dayIndices(iday);
844 clrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
845 clrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
846 clrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
852 clouds_day.delta_scale();
853 clouds_day.increment(optics);
856 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
859 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
860 KOKKOS_LAMBDA (
int iday,
int ilev)
862 int icol = dayIndices(iday);
863 flux_up (icol,ilev) = flux_up_day (iday,ilev);
864 flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
865 flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
867 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay+1, nbnd}),
868 KOKKOS_LAMBDA (
int iday,
int ilev,
int ibnd)
870 int icol = dayIndices(iday);
871 bnd_flux_up (icol,ilev,ibnd) = bnd_flux_up_day (iday,ilev,ibnd);
872 bnd_flux_dn (icol,ilev,ibnd) = bnd_flux_dn_day (iday,ilev,ibnd);
873 bnd_flux_dn_dir(icol,ilev,ibnd) = bnd_flux_dn_dir_day(iday,ilev,ibnd);
876 if (extra_clnsky_diag) {
878 clouds_day.increment(optics_no_aerosols);
880 rte_sw(optics_no_aerosols, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
882 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
883 KOKKOS_LAMBDA (
int iday,
int ilev)
885 int icol = dayIndices(iday);
886 clnsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
887 clnsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
888 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