588 int nbnd = k_dist.get_nband();
589 int ngpt = k_dist.get_ngpt();
590 int ngas = gas_concs.get_num_gases();
593 auto& flux_up = fluxes.flux_up;
594 auto& flux_dn = fluxes.flux_dn;
595 auto& flux_dn_dir = fluxes.flux_dn_dir;
596 auto& bnd_flux_up = fluxes.bnd_flux_up;
597 auto& bnd_flux_dn = fluxes.bnd_flux_dn;
598 auto& bnd_flux_dn_dir = fluxes.bnd_flux_dn_dir;
599 auto& clnclrsky_flux_up = clnclrsky_fluxes.flux_up;
600 auto& clnclrsky_flux_dn = clnclrsky_fluxes.flux_dn;
601 auto& clnclrsky_flux_dn_dir = clnclrsky_fluxes.flux_dn_dir;
602 auto& clrsky_flux_up = clrsky_fluxes.flux_up;
603 auto& clrsky_flux_dn = clrsky_fluxes.flux_dn;
604 auto& clrsky_flux_dn_dir = clrsky_fluxes.flux_dn_dir;
605 auto& clnsky_flux_up = clnsky_fluxes.flux_up;
606 auto& clnsky_flux_dn = clnsky_fluxes.flux_dn;
607 auto& clnsky_flux_dn_dir = clnsky_fluxes.flux_dn_dir;
610 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
611 KOKKOS_LAMBDA (
int icol,
int ilev)
613 flux_up (icol,ilev) = 0;
614 flux_dn (icol,ilev) = 0;
615 flux_dn_dir(icol,ilev) = 0;
616 clrsky_flux_up (icol,ilev) = 0;
617 clrsky_flux_dn (icol,ilev) = 0;
618 clrsky_flux_dn_dir(icol,ilev) = 0;
620 if (extra_clnclrsky_diag) {
621 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
622 KOKKOS_LAMBDA (
int icol,
int ilev)
624 clnclrsky_flux_up (icol,ilev) = 0;
625 clnclrsky_flux_dn (icol,ilev) = 0;
626 clnclrsky_flux_dn_dir(icol,ilev) = 0;
629 if (extra_clnsky_diag) {
630 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
631 KOKKOS_LAMBDA (
int icol,
int ilev)
633 clnsky_flux_up (icol,ilev) = 0;
634 clnsky_flux_dn (icol,ilev) = 0;
635 clnsky_flux_dn_dir(icol,ilev) = 0;
638 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {ncol, nlay+1, nbnd}),
639 KOKKOS_LAMBDA (
int icol,
int ilev,
int ibnd)
641 bnd_flux_up (icol,ilev,ibnd) = 0;
642 bnd_flux_dn (icol,ilev,ibnd) = 0;
643 bnd_flux_dn_dir(icol,ilev,ibnd) = 0;
647 int1d_k dayIndices(
"dayIndices", ncol);
648 Kokkos::deep_copy(dayIndices, -1);
652 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
int& nday_inner)
654 for (
int icol = 0; icol < ncol; ++icol) {
656 dayIndices(nday_inner++) = icol;
659 }, Kokkos::Sum<int>(nday));
669 Kokkos::parallel_for(nday, KOKKOS_LAMBDA(
int iday)
671 mu0_day(iday) = mu0(dayIndices(iday));
675 real2d_k p_lay_day(
"p_lay_day", nday, nlay);
676 real2d_k t_lay_day(
"t_lay_day", nday, nlay);
677 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
678 KOKKOS_LAMBDA (
int iday,
int ilay)
680 p_lay_day(iday,ilay) = p_lay(dayIndices(iday),ilay);
681 t_lay_day(iday,ilay) = t_lay(dayIndices(iday),ilay);
683 real2d_k p_lev_day(
"p_lev_day", nday, nlay+1);
684 real2d_k t_lev_day(
"t_lev_day", nday, nlay+1);
685 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
686 KOKKOS_LAMBDA (
int iday,
int ilay)
688 p_lev_day(iday,ilay) = p_lev(dayIndices(iday),ilay);
689 t_lev_day(iday,ilay) = t_lev(dayIndices(iday),ilay);
693 auto gas_names = gas_concs.get_gas_names();
695 gas_concs_day.init(gas_names, nday, nlay);
696 for (
int igas = 0; igas < ngas; igas++) {
697 real2d_k vmr_day(
"vmr_day", nday, nlay);
699 gas_concs.get_vmr(gas_names[igas], vmr);
700 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
701 KOKKOS_LAMBDA (
int iday,
int ilay)
703 vmr_day(iday,ilay) = vmr(dayIndices(iday),ilay);
705 gas_concs_day.set_vmr(gas_names[igas], vmr_day);
710 aerosol_day.init(k_dist.get_band_lims_wavenumber());
711 aerosol_day.alloc_2str(nday, nlay);
712 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, nbnd}),
713 KOKKOS_LAMBDA (
int iday,
int ilay,
int ibnd)
715 aerosol_day.tau(iday,ilay,ibnd) = aerosol.tau(dayIndices(iday),ilay,ibnd);
716 aerosol_day.ssa(iday,ilay,ibnd) = aerosol.ssa(dayIndices(iday),ilay,ibnd);
717 aerosol_day.g (iday,ilay,ibnd) = aerosol.g (dayIndices(iday),ilay,ibnd);
723 clouds_day.init(k_dist.get_band_lims_wavenumber(), k_dist.get_band_lims_gpoint());
724 clouds_day.alloc_2str(nday, nlay);
725 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, ngpt}),
726 KOKKOS_LAMBDA (
int iday,
int ilay,
int igpt)
728 clouds_day.tau(iday,ilay,igpt) = clouds.tau(dayIndices(iday),ilay,igpt);
729 clouds_day.ssa(iday,ilay,igpt) = clouds.ssa(dayIndices(iday),ilay,igpt);
730 clouds_day.g (iday,ilay,igpt) = clouds.g (dayIndices(iday),ilay,igpt);
736 real2d_k sfc_alb_dir_T(
"sfc_alb_dir", nbnd, nday);
737 real2d_k sfc_alb_dif_T(
"sfc_alb_dif", nbnd, nday);
738 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nbnd, nday}),
739 KOKKOS_LAMBDA (
int ibnd,
int icol)
741 sfc_alb_dir_T(ibnd,icol) = sfc_alb_dir(dayIndices(icol),ibnd);
742 sfc_alb_dif_T(ibnd,icol) = sfc_alb_dif(dayIndices(icol),ibnd);
746 real2d_k flux_up_day(
"flux_up_day", nday, nlay+1);
747 real2d_k flux_dn_day(
"flux_dn_day", nday, nlay+1);
748 real2d_k flux_dn_dir_day(
"flux_dn_dir_day", nday, nlay+1);
749 real3d_k bnd_flux_up_day(
"bnd_flux_up_day", nday, nlay+1, nbnd);
750 real3d_k bnd_flux_dn_day(
"bnd_flux_dn_day", nday, nlay+1, nbnd);
751 real3d_k bnd_flux_dn_dir_day(
"bnd_flux_dn_dir_day", nday, nlay+1, nbnd);
753 fluxes_day.flux_up = flux_up_day;
754 fluxes_day.flux_dn = flux_dn_day;
755 fluxes_day.flux_dn_dir = flux_dn_dir_day;
756 fluxes_day.bnd_flux_up = bnd_flux_up_day;
757 fluxes_day.bnd_flux_dn = bnd_flux_dn_day;
758 fluxes_day.bnd_flux_dn_dir = bnd_flux_dn_dir_day;
762 optics.alloc_2str(nday, nlay, k_dist);
765 if (extra_clnsky_diag) {
767 optics_no_aerosols.alloc_2str(nday, nlay, k_dist);
771 real2d_k t_lay_limited(
"t_lay_limited", nday, nlay);
776 real2d_k toa_flux(
"toa_flux", nday, ngpt);
777 real3d_k col_gas(
"col_gas", ncol, nlay, k_dist.get_ngas()+1);
778 bool top_at_1 =
false;
779 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
bool& val)
781 val |= p_lay(0, 0) < p_lay(0, nlay-1);
782 }, Kokkos::LOr<bool>(top_at_1));
784 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
785 t_lay_limited, gas_concs_day, col_gas, optics, toa_flux);
786 if (extra_clnsky_diag) {
787 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
788 t_lay_limited, gas_concs_day, col_gas, optics_no_aerosols, toa_flux);
792 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, ngpt}),
793 KOKKOS_LAMBDA (
int iday,
int igpt)
795 toa_flux(iday,igpt) = tsi_scaling * toa_flux(iday,igpt);
798 if (extra_clnclrsky_diag) {
800 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
802 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
803 KOKKOS_LAMBDA (
int iday,
int ilev)
805 int icol = dayIndices(iday);
806 clnclrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
807 clnclrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
808 clnclrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
813 aerosol_day.delta_scale();
814 aerosol_day.increment(optics);
817 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
820 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
821 KOKKOS_LAMBDA (
int iday,
int ilev)
823 int icol = dayIndices(iday);
824 clrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
825 clrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
826 clrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
832 clouds_day.delta_scale();
833 clouds_day.increment(optics);
836 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
839 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
840 KOKKOS_LAMBDA (
int iday,
int ilev)
842 int icol = dayIndices(iday);
843 flux_up (icol,ilev) = flux_up_day (iday,ilev);
844 flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
845 flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
847 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay+1, nbnd}),
848 KOKKOS_LAMBDA (
int iday,
int ilev,
int ibnd)
850 int icol = dayIndices(iday);
851 bnd_flux_up (icol,ilev,ibnd) = bnd_flux_up_day (iday,ilev,ibnd);
852 bnd_flux_dn (icol,ilev,ibnd) = bnd_flux_dn_day (iday,ilev,ibnd);
853 bnd_flux_dn_dir(icol,ilev,ibnd) = bnd_flux_dn_dir_day(iday,ilev,ibnd);
856 if (extra_clnsky_diag) {
858 clouds_day.increment(optics_no_aerosols);
860 rte_sw(optics_no_aerosols, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
862 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
863 KOKKOS_LAMBDA (
int iday,
int ilev)
865 int icol = dayIndices(iday);
866 clnsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
867 clnsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
868 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