@@ -41,6 +41,8 @@ struct Functions {
4141 template <typename S> using uview_2d = typename ekat::template Unmanaged<view_2d<S> >;
4242 template <typename S> using uview_2dl = typename ekat::template Unmanaged<view_2dl<S> >;
4343 template <typename S> using uview_2d_strided = typename ekat::template Unmanaged<view_2d_strided<S> >;
44+ template <typename S> using uview_2dh = typename ekat::template Unmanaged<view_2dl<S>>::HostMirror;
45+ template <typename S> using uview_1dh = typename ekat::template Unmanaged<view_1d<S>>::HostMirror;
4446
4547 // ---------------------------------------------------------------------------
4648 // Structs
@@ -89,18 +91,35 @@ struct Functions {
8991 view_1d<const Scalar> landfrac; // land area fraction
9092
9193 // unmanaged LayoutLeft views for fortran bridging
92- uview_2dl<Real> f_z_mid;
93- uview_2dl<Real> f_p_mid;
94- uview_2dl<Real> f_p_del;
95- uview_2dl<Real> f_T_mid;
96- uview_2dl<Real> f_qv;
97- uview_2dl<Real> f_uwind;
98- uview_2dl<Real> f_vwind;
99- uview_2dl<Real> f_omega;
100- uview_2dl<Real> f_cldfrac;
101-
102- uview_2dl<Real> f_z_int;
103- uview_2dl<Real> f_p_int;
94+ uview_2dl<Real> f_z_mid;
95+ uview_2dl<Real> f_p_mid;
96+ uview_2dl<Real> f_p_del;
97+ uview_2dl<Real> f_T_mid;
98+ uview_2dl<Real> f_qv;
99+ uview_2dl<Real> f_uwind;
100+ uview_2dl<Real> f_vwind;
101+ uview_2dl<Real> f_omega;
102+ uview_2dl<Real> f_cldfrac;
103+ uview_2dl<Real> f_z_int;
104+ uview_2dl<Real> f_p_int;
105+
106+ // host mirror versions of ZM interface variables
107+ uview_2dh<Real> h_z_mid;
108+ uview_2dh<Real> h_p_mid;
109+ uview_2dh<Real> h_p_del;
110+ uview_2dh<Real> h_T_mid;
111+ uview_2dh<Real> h_qv;
112+ uview_2dh<Real> h_uwind;
113+ uview_2dh<Real> h_vwind;
114+ uview_2dh<Real> h_omega;
115+ uview_2dh<Real> h_cldfrac;
116+ uview_2dh<Real> h_z_int;
117+ uview_2dh<Real> h_p_int;
118+
119+ uview_1dh<Scalar> h_phis;
120+ uview_1dh<Scalar> h_pblh;
121+ uview_1dh<Scalar> h_tpert;
122+ uview_1dh<Scalar> h_landfrac;
104123
105124 // -------------------------------------------------------------------------
106125 // transpose method for fortran bridging
@@ -125,6 +144,23 @@ struct Functions {
125144 f_p_int (i,j) = p_int (i,j/Spack::n)[j%Spack::n];
126145 }
127146 }
147+ // ----------------------------------------------------------------------
148+ // copy to host mirrors
149+ Kokkos::deep_copy (h_z_mid, f_z_mid);
150+ Kokkos::deep_copy (h_p_mid, f_p_mid);
151+ Kokkos::deep_copy (h_p_del, f_p_del);
152+ Kokkos::deep_copy (h_T_mid, f_T_mid);
153+ Kokkos::deep_copy (h_qv, f_qv);
154+ Kokkos::deep_copy (h_uwind, f_uwind);
155+ Kokkos::deep_copy (h_vwind, f_vwind);
156+ Kokkos::deep_copy (h_omega, f_omega);
157+ Kokkos::deep_copy (h_cldfrac, f_cldfrac);
158+ Kokkos::deep_copy (h_z_int, f_z_int);
159+ Kokkos::deep_copy (h_p_int, f_p_int);
160+ Kokkos::deep_copy (h_phis, phis);
161+ Kokkos::deep_copy (h_pblh, pblh);
162+ Kokkos::deep_copy (h_tpert, tpert);
163+ Kokkos::deep_copy (h_landfrac, landfrac);
128164 }
129165 }
130166 // -------------------------------------------------------------------------
@@ -164,11 +200,26 @@ struct Functions {
164200 uview_2dl<Real> f_tend_v;
165201 uview_2dl<Real> f_rain_prod;
166202 uview_2dl<Real> f_snow_prod;
167-
168203 uview_2dl<Real> f_prec_flux;
169204 uview_2dl<Real> f_snow_flux;
170205 uview_2dl<Real> f_mass_flux;
171206
207+ // host mirror versions of ZM interface variables
208+ uview_2dh<Real> h_tend_s;
209+ uview_2dh<Real> h_tend_qv;
210+ uview_2dh<Real> h_tend_u;
211+ uview_2dh<Real> h_tend_v;
212+ uview_2dh<Real> h_rain_prod;
213+ uview_2dh<Real> h_snow_prod;
214+ uview_2dh<Real> h_prec_flux;
215+ uview_2dh<Real> h_snow_flux;
216+ uview_2dh<Real> h_mass_flux;
217+
218+ uview_1dh<Scalar> h_prec;
219+ uview_1dh<Scalar> h_snow;
220+ uview_1dh<Scalar> h_cape;
221+ uview_1dh<Int> h_activity;
222+
172223 // -------------------------------------------------------------------------
173224 // transpose method for fortran bridging
174225 template <ekat::TransposeDirection::Enum D>
@@ -192,10 +243,39 @@ struct Functions {
192243 f_mass_flux (i,j) = mass_flux (i,j/Spack::n)[j%Spack::n];
193244 }
194245 }
195- // sync_to_host here?
246+ // ----------------------------------------------------------------------
247+ // copy to host mirror
248+ Kokkos::deep_copy (h_tend_s, f_tend_s);
249+ Kokkos::deep_copy (h_tend_qv, f_tend_qv);
250+ Kokkos::deep_copy (h_tend_u, f_tend_u);
251+ Kokkos::deep_copy (h_tend_v, f_tend_v);
252+ Kokkos::deep_copy (h_rain_prod,f_rain_prod);
253+ Kokkos::deep_copy (h_snow_prod,f_snow_prod);
254+ Kokkos::deep_copy (h_prec_flux,f_prec_flux);
255+ Kokkos::deep_copy (h_snow_flux,f_snow_flux);
256+ Kokkos::deep_copy (h_mass_flux,f_mass_flux);
257+ Kokkos::deep_copy (h_prec, prec);
258+ Kokkos::deep_copy (h_snow, snow);
259+ Kokkos::deep_copy (h_cape, cape);
260+ Kokkos::deep_copy (h_activity, activity);
196261 }
197262 if (D == ekat::TransposeDirection::f2c) {
198- // sync_to_device?
263+ // ----------------------------------------------------------------------
264+ // copy to host mirror
265+ Kokkos::deep_copy (f_tend_s, h_tend_s);
266+ Kokkos::deep_copy (f_tend_qv, h_tend_qv);
267+ Kokkos::deep_copy (f_tend_u, h_tend_u);
268+ Kokkos::deep_copy (f_tend_v, h_tend_v);
269+ Kokkos::deep_copy (f_rain_prod,h_rain_prod);
270+ Kokkos::deep_copy (f_snow_prod,h_snow_prod);
271+ Kokkos::deep_copy (f_prec_flux,h_prec_flux);
272+ Kokkos::deep_copy (f_snow_flux,h_snow_flux);
273+ Kokkos::deep_copy (f_mass_flux,h_mass_flux);
274+ Kokkos::deep_copy (prec, h_prec);
275+ Kokkos::deep_copy (snow, h_snow);
276+ Kokkos::deep_copy (cape, h_cape);
277+ Kokkos::deep_copy (activity, h_activity);
278+ // ----------------------------------------------------------------------
199279 for (int i=0 ; i<ncol_in; ++i) {
200280 // mid-point level variables
201281 for (int j=0 ; j<pver_in; ++j) {
0 commit comments