Skip to content

Commit

Permalink
Remove most of the f90 bridges
Browse files Browse the repository at this point in the history
  • Loading branch information
jgfouca committed Nov 4, 2024
1 parent 5e46e33 commit 58b70ac
Show file tree
Hide file tree
Showing 14 changed files with 101 additions and 1,643 deletions.
671 changes: 20 additions & 651 deletions components/eamxx/src/physics/p3/p3_functions_f90.cpp

Large diffs are not rendered by default.

144 changes: 47 additions & 97 deletions components/eamxx/src/physics/p3/p3_functions_f90.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,34 @@
#include <utility>
#include <memory> // for shared_ptr

//
// Bridge functions to call fortran version of p3 functions from C++
//

namespace scream {
namespace p3 {

//
///////////////////////////////////////////////////////////////////////////////

struct P3InitAFortranData
{
// Must use Host as device, f90 code might not be able to use Device memory
using P3F = Functions<Real, HostDevice>;
using P3C = typename P3F::P3C;

using view_ice_table = typename P3F::KT::template lview<Real[P3C::densize][P3C::rimsize][P3C::isize][P3C::ice_table_size]>;
using view_collect_table = typename P3F::KT::template lview<Real[P3C::densize][P3C::rimsize][P3C::isize][P3C::rcollsize][P3C::collect_table_size]>;

// Need to be LayoutLeft to be fortran compatible
view_ice_table ice_table_vals;
view_collect_table collect_table_vals;

P3InitAFortranData() :
ice_table_vals("P3InitAFortranData::ice_table_vals"),
collect_table_vals("P3InitAFortranData::collect_table_vals")
{}
};

///////////////////////////////////////////////////////////////////////////////

// Singleton for holding the same global data that are maintained in
// micro_p3, but for use in C++. This data is necessary to complete
// the "bridge" when calling C++ from micro_p3.
//
// micro_p3, but for use in C++.
struct P3GlobalForFortran
{
using P3F = Functions<Real, DefaultDevice>;
Expand Down Expand Up @@ -64,26 +80,10 @@ struct P3GlobalForFortran

///////////////////////////////////////////////////////////////////////////////

struct P3InitAFortranData
{
// Must use Host as device, f90 code might not be able to use Device memory
using P3F = Functions<Real, HostDevice>;
using P3C = typename P3F::P3C;

using view_ice_table = typename P3F::KT::template lview<Real[P3C::densize][P3C::rimsize][P3C::isize][P3C::ice_table_size]>;
using view_collect_table = typename P3F::KT::template lview<Real[P3C::densize][P3C::rimsize][P3C::isize][P3C::rcollsize][P3C::collect_table_size]>;

// Need to be LayoutLeft to be fortran compatible
view_ice_table ice_table_vals;
view_collect_table collect_table_vals;

P3InitAFortranData() :
ice_table_vals("P3InitAFortranData::ice_table_vals"),
collect_table_vals("P3InitAFortranData::collect_table_vals")
{}
};

///////////////////////////////////////////////////////////////////////////////
/**
* Structs for holding data related to specific P3 calls; these are used for
* the BFB unit tests.
*/

struct LookupIceData
{
Expand Down Expand Up @@ -882,98 +882,50 @@ struct PreventLiqSupersaturationData {
PTD_RW_SCALARS_ONLY(2, qi2qv_sublim_tend, qr2qv_evap_tend);
};

// Glue functions to call fortran from from C++ with the Data struct
void p3_init_a(P3InitAFortranData& d);
void find_lookuptable_indices_1a(LookupIceData& d);
void find_lookuptable_indices_1b(LookupIceDataB& d);
void access_lookup_table(AccessLookupTableData& d);
void access_lookup_table_coll(AccessLookupTableCollData& d);
void back_to_cell_average(BackToCellAverageData& d);
void cloud_water_conservation(CloudWaterConservationData& d);
void rain_water_conservation(RainWaterConservationData& d);
void ice_water_conservation(IceWaterConservationData& d);
void calc_rime_density(CalcRimeDensityData& d);
void cldliq_immersion_freezing(CldliqImmersionFreezingData& d);
void rain_immersion_freezing(RainImmersionFreezingData& d);
void droplet_self_collection(DropletSelfCollectionData& d);
void cloud_rain_accretion(CloudRainAccretionData& d);
void cloud_water_autoconversion(CloudWaterAutoconversionData& d);
void rain_self_collection(RainSelfCollectionData& d);
void impose_max_total_ni(ImposeMaxTotalNiData& d);
void ice_melting(IceMeltingData& d);
Real subgrid_variance_scaling(SubgridVarianceScalingData& d);
void get_cloud_dsd2(GetCloudDsd2Data& d);
void get_rain_dsd2(GetRainDsd2Data& d);
void calc_first_order_upwind_step(CalcUpwindData& d);
void generalized_sedimentation(GenSedData& d);
void cloud_sedimentation(CloudSedData& d);
void ice_sedimentation(IceSedData& d);
void rain_sedimentation(RainSedData& d);
void calc_bulk_rho_rime(CalcBulkRhoRimeData& d);
void homogeneous_freezing(HomogeneousFreezingData& d);
void compute_rain_fall_velocity(ComputeRainFallVelocityData& d);
void get_time_space_phys_variables(GetTimeSpacePhysVarsData& d);
void update_prognostic_ice(P3UpdatePrognosticIceData& d);
void evaporate_rain(EvapRainData& d);
void update_prognostic_liquid(P3UpdatePrognosticLiqData& d);
void ice_deposition_sublimation(IceDepositionSublimationData& d);
void ice_cldliq_collection(IceCldliqCollectionData& d);
void ice_rain_collection(IceRainCollectionData& d);
void ice_self_collection(IceSelfCollectionData& d);
void ice_relaxation_timescale(IceRelaxationData& d);
void calc_liq_relaxation_timescale(CalcLiqRelaxationData& d);
void ice_nucleation(IceNucleationData& d);
void ice_cldliq_wet_growth(IceWetGrowthData& d);
void check_values(CheckValuesData& d);
void calculate_incloud_mixingratios(IncloudMixingData& d);
void p3_main_part1(P3MainPart1Data& d);
void p3_main_part2(P3MainPart2Data& d);
void p3_main_part3(P3MainPart3Data& d);
void p3_main(P3MainData& d);

void ice_supersat_conservation(IceSupersatConservationData& d);
void nc_conservation(NcConservationData& d);
void nr_conservation(NrConservationData& d);
void ni_conservation(NiConservationData& d);
void prevent_liq_supersaturation(PreventLiqSupersaturationData& d);
extern "C" { // _f function decls

void calc_first_order_upwind_step_f(

/**
* Convenience functions for calling p3 routines from the host with scalar data.
* These function will pack your data, sync it to device, call the p3 function,
* then sync back to host and unpack. These are used by the BFB unit tests.
*/

void calc_first_order_upwind_step_host(
Int kts, Int kte, Int kdir, Int kbot, Int k_qxtop, Real dt_sub, Real* rho,
Real* inv_rho, Real* inv_dz, Int num_arrays, Real** fluxes, Real** vs, Real** qnx);

void generalized_sedimentation_f(Int kts, Int kte, Int kdir, Int k_qxtop, Int *k_qxbot, Int kbot, Real Co_max,
void generalized_sedimentation_host(Int kts, Int kte, Int kdir, Int k_qxtop, Int *k_qxbot, Int kbot, Real Co_max,
Real* dt_left, Real* prt_accum, Real* inv_dz, Real* inv_rho, Real* rho,
Int num_arrays, Real** vs, Real** fluxes, Real** qnx);

void cloud_sedimentation_f(
void cloud_sedimentation_host(
Int kts, Int kte, Int ktop, Int kbot, Int kdir,
Real* qc_incld, Real* rho, Real* inv_rho, Real* cld_frac_l, Real* acn, Real* inv_dz,
Real dt, Real inv_dt, bool do_predict_nc,
Real* qc, Real* nc, Real* nc_incld, Real* mu_c, Real* lamc, Real* precip_liq_surf, Real* qc_tend, Real* nc_tend);

void ice_sedimentation_f(
void ice_sedimentation_host(
Int kts, Int kte, Int ktop, Int kbot, Int kdir,
Real* rho, Real* inv_rho, Real* rhofaci, Real* cld_frac_i, Real* inv_dz,
Real dt, Real inv_dt,
Real* qi, Real* qi_incld, Real* ni, Real* qm, Real* qm_incld, Real* bm, Real* bm_incld,
Real* ni_incld, Real* precip_ice_surf, Real* qi_tend, Real* ni_tend);

void rain_sedimentation_f(
void rain_sedimentation_host(
Int kts, Int kte, Int ktop, Int kbot, Int kdir,
Real* qr_incld, Real* rho, Real* inv_rho, Real* rhofacr, Real* cld_frac_r, Real* inv_dz,
Real dt, Real inv_dt,
Real* qr, Real* nr, Real* nr_incld, Real* mu_r, Real* lamr, Real* precip_liq_surf, Real* precip_liq_flux, Real* qr_tend, Real* nr_tend);

void homogeneous_freezing_f(
void homogeneous_freezing_host(
Int kts, Int kte, Int ktop, Int kbot, Int kdir,
Real* T_atm, Real* inv_exner,
Real* qc, Real* nc, Real* qr, Real* nr, Real* qi, Real* ni, Real* qm, Real* bm, Real* th_atm);

void check_values_f(Real* Qv, Real* temp, Int kstart, Int kend,
Int timestepcount, bool force_abort, Int source_ind, Real* col_loc);
void check_values_host(Real* Qv, Real* temp, Int kstart, Int kend,
Int timestepcount, bool force_abort, Int source_ind, Real* col_loc);

void p3_main_part1_f(
void p3_main_part1_host(
Int kts, Int kte, Int kbot, Int ktop, Int kdir,
bool do_predict_nc, bool do_prescribed_CCN,
Real dt,
Expand All @@ -984,7 +936,7 @@ void p3_main_part1_f(
Real* qm_incld, Real* nc_incld, Real* nr_incld, Real* ni_incld, Real* bm_incld,
bool* is_nucleat_possible, bool* is_hydromet_present);

void p3_main_part2_f(
void p3_main_part2_host(
Int kts, Int kte, Int kbot, Int ktop, Int kdir, bool do_predict_nc, bool do_prescribed_CCN, Real dt, Real inv_dt,
Real* pres, Real* dpres, Real* dz, Real* nc_nuceat_tend, Real* inv_exner, Real* exner, Real* inv_cld_frac_l, Real* inv_cld_frac_i, Real* inv_cld_frac_r, Real* ni_activated, Real* inv_qc_relvar, Real* cld_frac_i, Real* cld_frac_l, Real* cld_frac_r, Real* qv_prev, Real* t_prev,
Real* T_atm, Real* rho, Real* inv_rho, Real* qv_sat_l, Real* qv_sat_i, Real* qv_supersat_i, Real* rhofacr, Real* rhofaci, Real* acn, Real* qv, Real* th_atm, Real* qc, Real* nc, Real* qr, Real* nr, Real* qi, Real* ni,
Expand All @@ -993,14 +945,14 @@ void p3_main_part2_f(
Real* nevapr, Real* qr_evap_tend, Real* vap_liq_exchange, Real* vap_ice_exchange, Real* liq_ice_exchange, Real* pratot,
Real* prctot, bool* is_hydromet_present);

void p3_main_part3_f(
void p3_main_part3_host(
Int kts, Int kte, Int kbot, Int ktop, Int kdir,
Real* inv_exner, Real* cld_frac_l, Real* cld_frac_r, Real* cld_frac_i,
Real* rho, Real* inv_rho, Real* rhofaci, Real* qv, Real* th_atm, Real* qc, Real* nc, Real* qr, Real* nr, Real* qi, Real* ni, Real* qm, Real* bm,
Real* mu_c, Real* nu, Real* lamc, Real* mu_r, Real* lamr, Real* vap_liq_exchange,
Real* ze_rain, Real* ze_ice, Real* diag_vm_qi, Real* diag_eff_radius_qi, Real* diag_diam_qi, Real* rho_qi, Real* diag_equiv_reflectivity, Real* diag_eff_radius_qc, Real* diag_eff_radius_qr);

Int p3_main_f(
Int p3_main_host(
Real* qc, Real* nc, Real* qr, Real* nr, Real* th_atm, Real* qv, Real dt,
Real* qi, Real* qm, Real* ni, Real* bm, Real* pres, Real* dz,
Real* nc_nuceat_tend, Real* nccn_prescribed, Real* ni_activated, Real* inv_qc_relvar, Int it, Real* precip_liq_surf,
Expand All @@ -1009,8 +961,6 @@ Int p3_main_f(
Real* qv2qi_depos_tend, Real* precip_liq_flux, Real* precip_ice_flux, Real* cld_frac_r, Real* cld_frac_l, Real* cld_frac_i,
Real* liq_ice_exchange, Real* vap_liq_exchange, Real* vap_ice_exchange, Real* qv_prev, Real* t_prev);

} // end _f function decls

} // namespace p3
} // namespace scream

Expand Down
Loading

0 comments on commit 58b70ac

Please sign in to comment.