617 int nbnd = k_dist.get_nband();
618 int ngpt = k_dist.get_ngpt();
619 int ngas = gas_concs.get_num_gases();
622 auto& flux_up = fluxes.flux_up;
623 auto& flux_dn = fluxes.flux_dn;
624 auto& flux_dn_dir = fluxes.flux_dn_dir;
625 auto& bnd_flux_up = fluxes.bnd_flux_up;
626 auto& bnd_flux_dn = fluxes.bnd_flux_dn;
627 auto& bnd_flux_dn_dir = fluxes.bnd_flux_dn_dir;
628 auto& clnclrsky_flux_up = clnclrsky_fluxes.flux_up;
629 auto& clnclrsky_flux_dn = clnclrsky_fluxes.flux_dn;
630 auto& clnclrsky_flux_dn_dir = clnclrsky_fluxes.flux_dn_dir;
631 auto& clrsky_flux_up = clrsky_fluxes.flux_up;
632 auto& clrsky_flux_dn = clrsky_fluxes.flux_dn;
633 auto& clrsky_flux_dn_dir = clrsky_fluxes.flux_dn_dir;
634 auto& clnsky_flux_up = clnsky_fluxes.flux_up;
635 auto& clnsky_flux_dn = clnsky_fluxes.flux_dn;
636 auto& clnsky_flux_dn_dir = clnsky_fluxes.flux_dn_dir;
639 parallel_for(SimpleBounds<2>(nlay+1,ncol), YAKL_LAMBDA(
int ilev,
int icol)
641 flux_up (icol,ilev) = 0;
642 flux_dn (icol,ilev) = 0;
643 flux_dn_dir(icol,ilev) = 0;
644 clnclrsky_flux_up (icol,ilev) = 0;
645 clnclrsky_flux_dn (icol,ilev) = 0;
646 clnclrsky_flux_dn_dir(icol,ilev) = 0;
647 clrsky_flux_up (icol,ilev) = 0;
648 clrsky_flux_dn (icol,ilev) = 0;
649 clrsky_flux_dn_dir(icol,ilev) = 0;
650 clnsky_flux_up (icol,ilev) = 0;
651 clnsky_flux_dn (icol,ilev) = 0;
652 clnsky_flux_dn_dir(icol,ilev) = 0;
654 parallel_for(SimpleBounds<3>(nbnd,nlay+1,ncol), YAKL_LAMBDA(
int ibnd,
int ilev,
int icol)
656 bnd_flux_up (icol,ilev,ibnd) = 0;
657 bnd_flux_dn (icol,ilev,ibnd) = 0;
658 bnd_flux_dn_dir(icol,ilev,ibnd) = 0;
662 auto dayIndices = int1d(
"dayIndices", ncol);
663 memset(dayIndices, -1);
666 auto dayIndices_h = dayIndices.createHostCopy();
667 auto mu0_h = mu0.createHostCopy();
669 for (
int icol = 1; icol <= ncol; icol++) {
670 if (mu0_h(icol) > 0) {
672 dayIndices_h(nday) = icol;
677 dayIndices_h.deep_copy_to(dayIndices);
684 auto mu0_day = real1d(
"mu0_day", nday);
685 parallel_for(SimpleBounds<1>(nday), YAKL_LAMBDA(
int iday)
687 mu0_day(iday) = mu0(dayIndices(iday));
691 auto p_lay_day = real2d(
"p_lay_day", nday, nlay);
692 auto t_lay_day = real2d(
"t_lay_day", nday, nlay);
693 parallel_for(SimpleBounds<2>(nlay,nday), YAKL_LAMBDA(
int ilay,
int iday)
695 p_lay_day(iday,ilay) = p_lay(dayIndices(iday),ilay);
696 t_lay_day(iday,ilay) = t_lay(dayIndices(iday),ilay);
698 auto p_lev_day = real2d(
"p_lev_day", nday, nlay+1);
699 auto t_lev_day = real2d(
"t_lev_day", nday, nlay+1);
700 parallel_for(SimpleBounds<2>(nlay+1,nday), YAKL_LAMBDA(
int ilev,
int iday)
702 p_lev_day(iday,ilev) = p_lev(dayIndices(iday),ilev);
703 t_lev_day(iday,ilev) = t_lev(dayIndices(iday),ilev);
707 auto gas_names = gas_concs.get_gas_names();
708 GasConcs gas_concs_day;
709 gas_concs_day.init(gas_names, nday, nlay);
710 for (
int igas = 0; igas < ngas; igas++) {
711 auto vmr_day = real2d(
"vmr_day", nday, nlay);
712 auto vmr = real2d(
"vmr" , ncol, nlay);
713 gas_concs.get_vmr(gas_names[igas], vmr);
714 parallel_for(SimpleBounds<2>(nlay,nday), YAKL_LAMBDA(
int ilay,
int iday)
716 vmr_day(iday,ilay) = vmr(dayIndices(iday),ilay);
718 gas_concs_day.set_vmr(gas_names[igas], vmr_day);
722 OpticalProps2str aerosol_day;
723 aerosol_day.init(k_dist.get_band_lims_wavenumber());
724 aerosol_day.alloc_2str(nday, nlay);
725 parallel_for(SimpleBounds<3>(nbnd,nlay,nday), YAKL_LAMBDA(
int ibnd,
int ilay,
int iday)
727 aerosol_day.tau(iday,ilay,ibnd) = aerosol.tau(dayIndices(iday),ilay,ibnd);
728 aerosol_day.ssa(iday,ilay,ibnd) = aerosol.ssa(dayIndices(iday),ilay,ibnd);
729 aerosol_day.g (iday,ilay,ibnd) = aerosol.g (dayIndices(iday),ilay,ibnd);
734 OpticalProps2str clouds_day;
735 clouds_day.init(k_dist.get_band_lims_wavenumber(), k_dist.get_band_lims_gpoint());
736 clouds_day.alloc_2str(nday, nlay);
737 parallel_for(SimpleBounds<3>(ngpt,nlay,nday), YAKL_LAMBDA(
int igpt,
int ilay,
int iday)
739 clouds_day.tau(iday,ilay,igpt) = clouds.tau(dayIndices(iday),ilay,igpt);
740 clouds_day.ssa(iday,ilay,igpt) = clouds.ssa(dayIndices(iday),ilay,igpt);
741 clouds_day.g (iday,ilay,igpt) = clouds.g (dayIndices(iday),ilay,igpt);
747 real2d sfc_alb_dir_T(
"sfc_alb_dir", nbnd, nday);
748 real2d sfc_alb_dif_T(
"sfc_alb_dif", nbnd, nday);
749 parallel_for(SimpleBounds<2>(nbnd,nday), YAKL_LAMBDA(
int ibnd,
int icol)
751 sfc_alb_dir_T(ibnd,icol) = sfc_alb_dir(dayIndices(icol),ibnd);
752 sfc_alb_dif_T(ibnd,icol) = sfc_alb_dif(dayIndices(icol),ibnd);
756 auto flux_up_day = real2d(
"flux_up_day", nday, nlay+1);
757 auto flux_dn_day = real2d(
"flux_dn_day", nday, nlay+1);
758 auto flux_dn_dir_day = real2d(
"flux_dn_dir_day", nday, nlay+1);
759 auto bnd_flux_up_day = real3d(
"bnd_flux_up_day", nday, nlay+1, nbnd);
760 auto bnd_flux_dn_day = real3d(
"bnd_flux_dn_day", nday, nlay+1, nbnd);
761 auto bnd_flux_dn_dir_day = real3d(
"bnd_flux_dn_dir_day", nday, nlay+1, nbnd);
762 FluxesByband fluxes_day;
763 fluxes_day.flux_up = flux_up_day;
764 fluxes_day.flux_dn = flux_dn_day;
765 fluxes_day.flux_dn_dir = flux_dn_dir_day;
766 fluxes_day.bnd_flux_up = bnd_flux_up_day;
767 fluxes_day.bnd_flux_dn = bnd_flux_dn_day;
768 fluxes_day.bnd_flux_dn_dir = bnd_flux_dn_dir_day;
771 OpticalProps2str optics;
772 optics.alloc_2str(nday, nlay, k_dist);
774 OpticalProps2str optics_no_aerosols;
775 if (extra_clnsky_diag) {
777 optics_no_aerosols.alloc_2str(nday, nlay, k_dist);
781 auto t_lay_limited = real2d(
"t_lay_limited", nday, nlay);
785 real2d toa_flux(
"toa_flux", nday, ngpt);
786 auto p_lay_host = p_lay.createHostCopy();
787 bool top_at_1 = p_lay_host(1, 1) < p_lay_host(1, nlay);
789 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
790 t_lay_limited, gas_concs_day, optics, toa_flux);
791 if (extra_clnsky_diag) {
792 k_dist.gas_optics(nday, nlay, top_at_1, p_lay_day, p_lev_day,
793 t_lay_limited, gas_concs_day, optics_no_aerosols, toa_flux);
797 parallel_for(SimpleBounds<2>(ngpt,nday), YAKL_LAMBDA(
int igpt,
int iday)
799 toa_flux(iday,igpt) = tsi_scaling * toa_flux(iday,igpt);
802 if (extra_clnclrsky_diag) {
804 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
806 parallel_for(SimpleBounds<2>(nlay+1,nday), YAKL_LAMBDA(
int ilev,
int iday)
808 int icol = dayIndices(iday);
809 clnclrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
810 clnclrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
811 clnclrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
816 aerosol_day.delta_scale();
817 aerosol_day.increment(optics);
820 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
823 parallel_for(SimpleBounds<2>(nlay+1,nday), YAKL_LAMBDA(
int ilev,
int iday)
825 int icol = dayIndices(iday);
826 clrsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
827 clrsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
828 clrsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
834 clouds_day.delta_scale();
835 clouds_day.increment(optics);
838 rte_sw(optics, top_at_1, mu0_day, toa_flux, sfc_alb_dir_T, sfc_alb_dif_T, fluxes_day);
841 parallel_for(SimpleBounds<2>(nlay+1,nday), YAKL_LAMBDA(
int ilev,
int iday)
843 int icol = dayIndices(iday);
844 flux_up (icol,ilev) = flux_up_day (iday,ilev);
845 flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
846 flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);
848 parallel_for(SimpleBounds<3>(nbnd,nlay+1,nday), YAKL_LAMBDA(
int ibnd,
int ilev,
int iday)
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 parallel_for(SimpleBounds<2>(nlay+1,nday), YAKL_LAMBDA(
int ilev,
int iday)
864 int icol = dayIndices(iday);
865 clnsky_flux_up (icol,ilev) = flux_up_day (iday,ilev);
866 clnsky_flux_dn (icol,ilev) = flux_dn_day (iday,ilev);
867 clnsky_flux_dn_dir(icol,ilev) = flux_dn_dir_day(iday,ilev);