615 int nbnd = k_dist.get_nband();
616 int ngpt = k_dist.get_ngpt();
617 int ngas = gas_concs.get_num_gases();
620 auto& flux_up = fluxes.flux_up;
621 auto& flux_dn = fluxes.flux_dn;
622 auto& flux_dn_dir = fluxes.flux_dn_dir;
623 auto& bnd_flux_up = fluxes.bnd_flux_up;
624 auto& bnd_flux_dn = fluxes.bnd_flux_dn;
625 auto& bnd_flux_dn_dir = fluxes.bnd_flux_dn_dir;
626 auto& clnclrsky_flux_up = clnclrsky_fluxes.flux_up;
627 auto& clnclrsky_flux_dn = clnclrsky_fluxes.flux_dn;
628 auto& clnclrsky_flux_dn_dir = clnclrsky_fluxes.flux_dn_dir;
629 auto& clrsky_flux_up = clrsky_fluxes.flux_up;
630 auto& clrsky_flux_dn = clrsky_fluxes.flux_dn;
631 auto& clrsky_flux_dn_dir = clrsky_fluxes.flux_dn_dir;
632 auto& clnsky_flux_up = clnsky_fluxes.flux_up;
633 auto& clnsky_flux_dn = clnsky_fluxes.flux_dn;
634 auto& clnsky_flux_dn_dir = clnsky_fluxes.flux_dn_dir;
637 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
638 KOKKOS_LAMBDA (
int icol,
int ilev)
640 flux_up (icol,ilev) = 0;
641 flux_dn (icol,ilev) = 0;
642 flux_dn_dir(icol,ilev) = 0;
643 clrsky_flux_up (icol,ilev) = 0;
644 clrsky_flux_dn (icol,ilev) = 0;
645 clrsky_flux_dn_dir(icol,ilev) = 0;
647 if (extra_clnclrsky_diag) {
648 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
649 KOKKOS_LAMBDA (
int icol,
int ilev)
651 clnclrsky_flux_up (icol,ilev) = 0;
652 clnclrsky_flux_dn (icol,ilev) = 0;
653 clnclrsky_flux_dn_dir(icol,ilev) = 0;
656 if (extra_clnsky_diag) {
657 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {ncol, nlay+1}),
658 KOKKOS_LAMBDA (
int icol,
int ilev)
660 clnsky_flux_up (icol,ilev) = 0;
661 clnsky_flux_dn (icol,ilev) = 0;
662 clnsky_flux_dn_dir(icol,ilev) = 0;
665 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {ncol, nlay+1, nbnd}),
666 KOKKOS_LAMBDA (
int icol,
int ilev,
int ibnd)
668 bnd_flux_up (icol,ilev,ibnd) = 0;
669 bnd_flux_dn (icol,ilev,ibnd) = 0;
670 bnd_flux_dn_dir(icol,ilev,ibnd) = 0;
674 int1d_k dayIndices(
"dayIndices", ncol);
675 Kokkos::deep_copy(dayIndices, -1);
679 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
int& nday_inner)
681 for (
int icol = 0; icol < ncol; ++icol) {
683 dayIndices(nday_inner++) = icol;
686 }, Kokkos::Sum<int>(nday));
696 Kokkos::parallel_for(nday, KOKKOS_LAMBDA(
int iday)
698 mu0_day(iday) = mu0(dayIndices(iday));
702 real2d_k p_lay_day(
"p_lay_day", nday, nlay);
703 real2d_k t_lay_day(
"t_lay_day", nday, nlay);
704 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
705 KOKKOS_LAMBDA (
int iday,
int ilay)
707 p_lay_day(iday,ilay) = p_lay(dayIndices(iday),ilay);
708 t_lay_day(iday,ilay) = t_lay(dayIndices(iday),ilay);
710 real2d_k p_lev_day(
"p_lev_day", nday, nlay+1);
711 real2d_k t_lev_day(
"t_lev_day", nday, nlay+1);
712 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
713 KOKKOS_LAMBDA (
int iday,
int ilay)
715 p_lev_day(iday,ilay) = p_lev(dayIndices(iday),ilay);
716 t_lev_day(iday,ilay) = t_lev(dayIndices(iday),ilay);
720 auto gas_names = gas_concs.get_gas_names();
722 gas_concs_day.init(gas_names, nday, nlay);
723 for (
int igas = 0; igas < ngas; igas++) {
724 real2d_k vmr_day(
"vmr_day", nday, nlay);
726 gas_concs.get_vmr(gas_names[igas], vmr);
727 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay}),
728 KOKKOS_LAMBDA (
int iday,
int ilay)
730 vmr_day(iday,ilay) = vmr(dayIndices(iday),ilay);
732 gas_concs_day.set_vmr(gas_names[igas], vmr_day);
737 aerosol_day.init(k_dist.get_band_lims_wavenumber());
738 aerosol_day.alloc_2str(nday, nlay);
739 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, nbnd}),
740 KOKKOS_LAMBDA (
int iday,
int ilay,
int ibnd)
742 aerosol_day.tau(iday,ilay,ibnd) = aerosol.tau(dayIndices(iday),ilay,ibnd);
743 aerosol_day.ssa(iday,ilay,ibnd) = aerosol.ssa(dayIndices(iday),ilay,ibnd);
744 aerosol_day.g (iday,ilay,ibnd) = aerosol.g (dayIndices(iday),ilay,ibnd);
750 clouds_day.init(k_dist.get_band_lims_wavenumber(), k_dist.get_band_lims_gpoint());
751 clouds_day.alloc_2str(nday, nlay);
752 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay, ngpt}),
753 KOKKOS_LAMBDA (
int iday,
int ilay,
int igpt)
755 clouds_day.tau(iday,ilay,igpt) = clouds.tau(dayIndices(iday),ilay,igpt);
756 clouds_day.ssa(iday,ilay,igpt) = clouds.ssa(dayIndices(iday),ilay,igpt);
757 clouds_day.g (iday,ilay,igpt) = clouds.g (dayIndices(iday),ilay,igpt);
763 real2d_k sfc_alb_dir_T(
"sfc_alb_dir", nbnd, nday);
764 real2d_k sfc_alb_dif_T(
"sfc_alb_dif", nbnd, nday);
765 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nbnd, nday}),
766 KOKKOS_LAMBDA (
int ibnd,
int icol)
768 sfc_alb_dir_T(ibnd,icol) = sfc_alb_dir(dayIndices(icol),ibnd);
769 sfc_alb_dif_T(ibnd,icol) = sfc_alb_dif(dayIndices(icol),ibnd);
773 real2d_k flux_up_day(
"flux_up_day", nday, nlay+1);
774 real2d_k flux_dn_day(
"flux_dn_day", nday, nlay+1);
775 real2d_k flux_dn_dir_day(
"flux_dn_dir_day", nday, nlay+1);
776 real3d_k bnd_flux_up_day(
"bnd_flux_up_day", nday, nlay+1, nbnd);
777 real3d_k bnd_flux_dn_day(
"bnd_flux_dn_day", nday, nlay+1, nbnd);
778 real3d_k bnd_flux_dn_dir_day(
"bnd_flux_dn_dir_day", nday, nlay+1, nbnd);
780 fluxes_day.flux_up = flux_up_day;
781 fluxes_day.flux_dn = flux_dn_day;
782 fluxes_day.flux_dn_dir = flux_dn_dir_day;
783 fluxes_day.bnd_flux_up = bnd_flux_up_day;
784 fluxes_day.bnd_flux_dn = bnd_flux_dn_day;
785 fluxes_day.bnd_flux_dn_dir = bnd_flux_dn_dir_day;
789 optics.alloc_2str(nday, nlay, k_dist);
792 if (extra_clnsky_diag) {
794 optics_no_aerosols.alloc_2str(nday, nlay, k_dist);
798 real2d_k t_lay_limited(
"t_lay_limited", nday, nlay);
803 real2d_k toa_flux(
"toa_flux", nday, ngpt);
804 real3d_k col_gas(
"col_gas", ncol, nlay, k_dist.get_ngas()+1);
805 bool top_at_1 =
false;
806 Kokkos::parallel_reduce(1, KOKKOS_LAMBDA(
int,
bool& val)
808 val |= p_lay(0, 0) < p_lay(0, nlay-1);
809 }, Kokkos::LOr<bool>(top_at_1));
811 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
812 t_lay_limited, gas_concs_day, col_gas, optics, toa_flux);
813 if (extra_clnsky_diag) {
814 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
815 t_lay_limited, gas_concs_day, col_gas, optics_no_aerosols, toa_flux);
819 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, ngpt}),
820 KOKKOS_LAMBDA (
int iday,
int igpt)
822 toa_flux(iday,igpt) = tsi_scaling * toa_flux(iday,igpt);
825 if (extra_clnclrsky_diag) {
827 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
829 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
830 KOKKOS_LAMBDA (
int iday,
int ilev)
832 int icol = dayIndices(iday);
833 clnclrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
834 clnclrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
835 clnclrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
840 aerosol_day.delta_scale();
841 aerosol_day.increment(optics);
844 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
847 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
848 KOKKOS_LAMBDA (
int iday,
int ilev)
850 int icol = dayIndices(iday);
851 clrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
852 clrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
853 clrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
859 clouds_day.delta_scale();
860 clouds_day.increment(optics);
863 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
866 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
867 KOKKOS_LAMBDA (
int iday,
int ilev)
869 int icol = dayIndices(iday);
870 flux_up (icol,ilev) = flux_up_day (iday,ilev);
871 flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
872 flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
874 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<3>>({0, 0, 0}, {nday, nlay+1, nbnd}),
875 KOKKOS_LAMBDA (
int iday,
int ilev,
int ibnd)
877 int icol = dayIndices(iday);
878 bnd_flux_up (icol,ilev,ibnd) = bnd_flux_up_day (iday,ilev,ibnd);
879 bnd_flux_dn (icol,ilev,ibnd) = bnd_flux_dn_day (iday,ilev,ibnd);
880 bnd_flux_dn_dir(icol,ilev,ibnd) = bnd_flux_dn_dir_day(iday,ilev,ibnd);
883 if (extra_clnsky_diag) {
885 clouds_day.increment(optics_no_aerosols);
887 rte_sw(optics_no_aerosols, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
889 Kokkos::parallel_for(Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0, 0}, {nday, nlay+1}),
890 KOKKOS_LAMBDA (
int iday,
int ilev)
892 int icol = dayIndices(iday);
893 clnsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
894 clnsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
895 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:31