Skip to content

Commit 9f134fd

Browse files
authored
Merge branch 'bartgol/eamxx/data-interpolation-support-p3d-from-ps' (PR #2919)
Support using a source pressure profile reconstructed from ps and hyam/hybm.
2 parents 2799609 + 35fe743 commit 9f134fd

File tree

8 files changed

+152
-67
lines changed

8 files changed

+152
-67
lines changed

components/eamxx/src/share/grid/abstract_grid.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ AbstractGrid::get_geometry_data (const std::string& name) const {
294294
}
295295

296296
Field
297-
AbstractGrid::create_geometry_data (const FieldIdentifier& fid)
297+
AbstractGrid::create_geometry_data (const FieldIdentifier& fid, const int pack_size)
298298
{
299299
const auto& name = fid.name();
300300

@@ -307,6 +307,7 @@ AbstractGrid::create_geometry_data (const FieldIdentifier& fid)
307307

308308
// Create field and the read only copy as well
309309
auto& f = m_geo_fields[name] = Field(fid);
310+
f.get_header().get_alloc_properties().request_allocation(pack_size);
310311
f.allocate_view();
311312
return f;
312313
}

components/eamxx/src/share/grid/abstract_grid.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,12 @@ class AbstractGrid : public ekat::enable_shared_from_this<AbstractGrid>
136136
Field get_geometry_data (const std::string& name) const;
137137

138138
// Create geometry data, throws if already existing. Returns writable field
139-
Field create_geometry_data (const FieldIdentifier& fid);
139+
Field create_geometry_data (const FieldIdentifier& fid, const int pack_size = 1);
140140
Field create_geometry_data (const std::string& name, const FieldLayout& layout,
141141
const ekat::units::Units& units = ekat::units::Units::invalid(),
142-
const DataType data_type = DataType::RealType) {
143-
return create_geometry_data(FieldIdentifier(name,layout,units,this->name(),data_type));
142+
const DataType data_type = DataType::RealType,
143+
const int pack_size = 1) {
144+
return create_geometry_data(FieldIdentifier(name,layout,units,this->name(),data_type),pack_size);
144145
}
145146

146147
// Sets pre-existing field as geometry data.

components/eamxx/src/share/io/scream_scorpio_interface.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,19 +1204,6 @@ void read_var (const std::string &filename, const std::string &varname, T* buf,
12041204
" - time len: " + std::to_string(f.time_dim->length));
12051205
err = PIOc_setframe(f.ncid,var.ncid,frame);
12061206
check_scorpio_noerr (err,f.name,"variable",varname,"read_var","setframe");
1207-
} else if (time_index>=0) {
1208-
// This is a bit of a hacky usage. We want to read a time index of a var,
1209-
// but the time dim is NOT unlimited in the input file. Apparently, SCORPIO
1210-
// supports this, and some E3SM input files are indeed like this, so we
1211-
// need to support it here too, hacky as it may be.
1212-
frame = time_index;
1213-
1214-
EKAT_REQUIRE_MSG (frame<var.dims[0]->length,
1215-
"Error! First dim index out of bounds.\n"
1216-
" - filename : " + filename + "\n"
1217-
" - varname : " + varname + "\n"
1218-
" - first dim idx: " + std::to_string(time_index) + "\n"
1219-
" - first dim len: " + std::to_string(var.dims[0]->length) + "\n");
12201207
}
12211208

12221209
std::string pioc_func;

components/eamxx/src/share/tests/data_interpolation_setup.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,12 @@ TEST_CASE ("data_interpolation_setup")
5656
scorpio::define_var(fname+suffix,"s3d_i",{"ncol",ilev}, "real", true);
5757
scorpio::define_var(fname+suffix,"v3d_i",{"ncol","dim2",ilev}, "real", true);
5858

59-
// We keep p1d and p3d NOT time-dep
59+
// We keep p1d, p2d, p3d, hyam, and hybm as NOT time-dep
6060
scorpio::define_var(fname+suffix,"p1d", {"lev"},"real", false);
61+
scorpio::define_var(fname+suffix,"p2d", {"ncol"},"real", false);
6162
scorpio::define_var(fname+suffix,"p3d", {"ncol","lev"},"real", false);
63+
scorpio::define_var(fname+suffix,"hyam", {"lev"},"real", false);
64+
scorpio::define_var(fname+suffix,"hybm", {"lev"},"real", false);
6265

6366
scorpio::enddef(fname+suffix);
6467
}
@@ -81,14 +84,22 @@ TEST_CASE ("data_interpolation_setup")
8184
// - two to be used for linear-hystory interp
8285
util::TimeStamp time = get_first_slice_time ();
8386

84-
// We keep p1d and p3d NOT time-dep, so we write outside the loop
85-
auto p1d = base_fields.back();
87+
// We keep pressures fields NOT time-dep, so we write outside the loop. Also write hyam/hybm here
88+
auto p1d = base_fields[6];
8689
auto p3d = base_fields[2].alias("p3d");
90+
auto p2d = base_fields[0].alias("p2d");
91+
auto hybm = p1d.alias("hybm");
92+
auto hyam = hybm.clone("hyam");
8793
p1d.sync_to_host();
94+
p2d.sync_to_host();
8895
p3d.sync_to_host();
96+
hyam.deep_copy(0); hyam.sync_to_host();
8997
for (const std::string& fname : files) {
9098
scorpio::write_var(fname+suffix,p1d.name(),p1d.get_internal_view_data<Real,Host>());
99+
scorpio::write_var(fname+suffix,p2d.name(),p2d.get_internal_view_data<Real,Host>());
91100
scorpio::write_var(fname+suffix,p3d.name(),p3d.get_internal_view_data<Real,Host>());
101+
scorpio::write_var(fname+suffix,hybm.name(),hybm.get_internal_view_data<Real,Host>());
102+
scorpio::write_var(fname+suffix,hyam.name(),hyam.get_internal_view_data<Real,Host>());
92103
}
93104

94105
int nfields = fields.size() - 1; // Don't handle p1d, since it's done above

components/eamxx/src/share/tests/data_interpolation_tests.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ namespace scream {
1414
// evaluation may be different (in finite prec) from the one in the class.
1515
constexpr auto tol = std::numeric_limits<Real>::epsilon()*10;
1616

17+
// NOTE: due to how we build p3d, it is true that p3d is the tensor product of
18+
// p1d and p2d. Since hybm=p1d and hyam=0, the P2D case is the same as
19+
// the P3D one, once the 3d pressure has been reconstructed
20+
constexpr auto NOP = DataInterpolation::None;
1721
constexpr auto P1D = DataInterpolation::Static1D;
22+
constexpr auto P2D = DataInterpolation::Dynamic3DRef;
1823
constexpr auto P3D = DataInterpolation::Dynamic3D;
1924

2025
using strvec_t = std::vector<std::string>;
@@ -73,7 +78,9 @@ void run_tests (const std::shared_ptr<const AbstractGrid>& grid,
7378
f.deep_copy(1);
7479
}
7580

76-
std::string data_pname = vr_type==P1D ? "p1d" : "p3d"; // if vr_type==None, it's not used anyways
81+
std::string data_pname = // if vr_type==None, it's not used anyways
82+
vr_type==P1D ? "p1d" :
83+
(vr_type==P3D ? "p3d" : "p2d");
7784
auto model_pmid = base[2].clone("pmid");
7885
auto model_pint = base[4].clone("pint");
7986
if (vr_type==P1D) {
@@ -95,7 +102,7 @@ void run_tests (const std::shared_ptr<const AbstractGrid>& grid,
95102
}
96103

97104
std::vector<Field> expected_vcoarse, base_vcoarse, ones_vcoarse;
98-
if (vr_type==P1D or vr_type==P3D) {
105+
if (vr_type!=NOP) {
99106
// If we do remap, there is some P0 extrapolation,
100107
// for which we need to know the data at the top/bot
101108
// NOTE: the data has NO ilev coord in this case
@@ -158,6 +165,7 @@ void run_tests (const std::shared_ptr<const AbstractGrid>& grid,
158165
const auto& layout = fields[i].get_header().get_identifier().get_layout();
159166
bool midpoints = layout.has_tag(LEV);
160167
bool interfaces = layout.has_tag(ILEV);
168+
bool has_levels = midpoints or interfaces;
161169

162170
// Compute expected field, possibly clipping the top/bot value, if vr_type!=None
163171
// Since we run with 2x the number of levels as in the data, we get ONE level
@@ -167,7 +175,7 @@ void run_tests (const std::shared_ptr<const AbstractGrid>& grid,
167175
// of midpoints and interfaces on the data grid.
168176
expected[i].update(base[i],1,0);
169177
expected[i].update(ones[i],delta,1.0);
170-
if ( (vr_type==P1D or vr_type==P3D) and (midpoints or interfaces)) {
178+
if ( vr_type!=NOP and has_levels) {
171179
auto vlen = midpoints ? nlevs : nlevs+1;
172180
auto scalar = not layout.is_vector_layout();
173181

@@ -202,6 +210,10 @@ void run_tests (const std::shared_ptr<const AbstractGrid>& grid,
202210
diff[i].update(fields[i],1,1);
203211
diff[i].update(expected[i],-1,1);
204212
diff[i].scale(1.0 / frobenius_norm<Real>(expected[i]));
213+
if (frobenius_norm<Real>(diff[i])>=tol) {
214+
print_field_hyperslab(expected[i]);
215+
print_field_hyperslab(fields[i]);
216+
}
205217
REQUIRE (frobenius_norm<Real>(diff[i])<tol);
206218
}
207219
}
@@ -265,6 +277,11 @@ TEST_CASE ("interpolation")
265277
run_tests (vfine_grid,files_no_ilev,t_beg,timeline,P1D);
266278
root_print(comm," timeline=PERIODIC, horiz_remap=NO, vert_remap=p1d ......... PASS\n");
267279
}
280+
SECTION ("p2d-vert") {
281+
root_print(comm," timeline=PERIODIC, horiz_remap=NO, vert_remap=p2d .........\n");
282+
run_tests (vfine_grid,files_no_ilev,t_beg,timeline,P2D);
283+
root_print(comm," timeline=PERIODIC, horiz_remap=NO, vert_remap=p2d ......... PASS\n");
284+
}
268285
SECTION ("p3d-vert") {
269286
root_print(comm," timeline=PERIODIC, horiz_remap=NO, vert_remap=p3d .........\n");
270287
run_tests (vfine_grid,files_no_ilev,t_beg,timeline,P3D);
@@ -283,6 +300,11 @@ TEST_CASE ("interpolation")
283300
run_tests (hvfine_grid,files_no_ilev,t_beg,timeline,P1D);
284301
root_print(comm," timeline=PERIODIC, horiz_remap=YES, vert_remap=p1d ......... PASS\n");
285302
}
303+
SECTION ("p2d-vert") {
304+
root_print(comm," timeline=PERIODIC, horiz_remap=YES, vert_remap=p2d .........\n");
305+
run_tests (hvfine_grid,files_no_ilev,t_beg,timeline,P2D);
306+
root_print(comm," timeline=PERIODIC, horiz_remap=YES, vert_remap=p2d ......... PASS\n");
307+
}
286308
SECTION ("p3d-vert") {
287309
root_print(comm," timeline=PERIODIC, horiz_remap=YES, vert_remap=p3d .........\n");
288310
run_tests (hvfine_grid,files_no_ilev,t_beg,timeline,P3D);
@@ -309,6 +331,11 @@ TEST_CASE ("interpolation")
309331
run_tests (vfine_grid,files_no_ilev,t_beg,timeline,P1D);
310332
root_print(comm," timeline=LINEAR, horiz_remap=NO, vert_remap=p1d ......... PASS\n");
311333
}
334+
SECTION ("p2d-vert") {
335+
root_print(comm," timeline=LINEAR, horiz_remap=NO, vert_remap=p2d .........\n");
336+
run_tests (vfine_grid,files_no_ilev,t_beg,timeline,P2D);
337+
root_print(comm," timeline=LINEAR, horiz_remap=NO, vert_remap=p2d ......... PASS\n");
338+
}
312339
SECTION ("p3d-vert") {
313340
root_print(comm," timeline=LINEAR, horiz_remap=NO, vert_remap=p3d .........\n");
314341
run_tests (vfine_grid,files_no_ilev,t_beg,timeline,P3D);
@@ -327,6 +354,11 @@ TEST_CASE ("interpolation")
327354
run_tests (hvfine_grid,files_no_ilev,t_beg,timeline,P1D);
328355
root_print(comm," timeline=LINEAR, horiz_remap=YES, vert_remap=p1d ......... PASS\n");
329356
}
357+
SECTION ("p2d-vert") {
358+
root_print(comm," timeline=LINEAR, horiz_remap=YES, vert_remap=p2d .........\n");
359+
run_tests (hvfine_grid,files_no_ilev,t_beg,timeline,P2D);
360+
root_print(comm," timeline=LINEAR, horiz_remap=YES, vert_remap=p2d ......... PASS\n");
361+
}
330362
SECTION ("p3d-vert") {
331363
root_print(comm," timeline=LINEAR, horiz_remap=YES, vert_remap=p3d .........\n");
332364
run_tests (hvfine_grid,files_no_ilev,t_beg,timeline,P3D);

components/eamxx/src/share/tests/data_interpolation_tests.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ create_fields (const std::shared_ptr<const AbstractGrid>& grid,
5858
int nlevs = grid->get_num_vertical_levels();
5959

6060
// Create fields
61-
6261
auto layout_s2d = grid->get_2d_scalar_layout();
6362
auto layout_v2d = grid->get_2d_vector_layout(ncmps);
6463
auto layout_s3d_m = grid->get_3d_scalar_layout(true);

components/eamxx/src/share/util/eamxx_data_interpolation.cpp

Lines changed: 90 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "share/io/scream_scorpio_interface.hpp"
77
#include "share/io/scream_io_utils.hpp"
88
#include "share/util/scream_universal_constants.hpp"
9+
#include "physics/share/physics_constants.hpp"
910

1011
#include <filesystem>
1112
#include <fstream>
@@ -59,17 +60,55 @@ void DataInterpolation::run (const util::TimeStamp& ts)
5960
out.deep_copy(beg);
6061
out.update(end,alpha,1-alpha);
6162
}
62-
// For Dynamic3D profile we also need to compute the source pressure profile
63+
64+
// For Dynamic3D/Dynamic3D profile we also need to compute the source pressure profile
6365
// NOTE: this can't be done in the loop above, since src_p is not a "remapped"
6466
// field in the vertical remapper (also, we need to use ad different ptr)
6567
if (m_vr_type==Dynamic3D) {
6668
// The pressure field is THE LAST registered in the horiz remappers
6769
const auto p_beg = m_horiz_remapper_beg->get_tgt_field(m_nfields);
6870
const auto p_end = m_horiz_remapper_end->get_tgt_field(m_nfields);
6971

70-
auto p = m_vremap->get_source_pressure(true); // mid or int doesn't matter
72+
auto p = m_helper_pressure_fields["src_p"];
7173
p.deep_copy(p_beg);
7274
p.update(p_end,alpha,1-alpha);
75+
} else if (m_vr_type==Dynamic3DRef) {
76+
// The surface pressure field is THE LAST registered in the horiz remappers
77+
const auto ps_beg = m_horiz_remapper_beg->get_tgt_field(m_nfields);
78+
const auto ps_end = m_horiz_remapper_end->get_tgt_field(m_nfields);
79+
80+
auto p = m_helper_pressure_fields["src_p"];
81+
auto ps = m_helper_pressure_fields["p_data"];
82+
ps.deep_copy(ps_beg);
83+
ps.update(ps_end,alpha,1-alpha);
84+
85+
// Reconstruct reference p from ps, hyam, and hybm
86+
using KT = KokkosTypes<DefaultDevice>;
87+
using ExeSpace = typename KT::ExeSpace;
88+
using MemberType = typename KT::MemberType;
89+
using ESU = ekat::ExeSpaceUtils<ExeSpace>;
90+
using C = scream::physics::Constants<Real>;
91+
using PT = ekat::Pack<Real,SCREAM_PACK_SIZE>;
92+
93+
auto ps_v = ps.get_view<const Real*>();
94+
auto p_v = p.get_view<PT**>();
95+
auto hyam = m_vert_remapper->get_src_grid()->get_geometry_data("hyam").get_view<const PT*>();
96+
auto hybm = m_vert_remapper->get_src_grid()->get_geometry_data("hybm").get_view<const PT*>();
97+
98+
constexpr auto P0 = C::P0;
99+
100+
const int ncols = ps_v.extent(0);
101+
const int num_vert_packs = p_v.extent(1);
102+
const auto policy = ESU::get_default_team_policy(ncols, num_vert_packs);
103+
104+
Kokkos::parallel_for("spa_compute_p_src_loop", policy,
105+
KOKKOS_LAMBDA (const MemberType& team) {
106+
const int icol = team.league_rank();
107+
Kokkos::parallel_for(Kokkos::TeamVectorRange(team,num_vert_packs),
108+
[&](const int k) {
109+
p_v(icol,k) = ps_v(icol) * hybm(k) + P0 * hyam(k);
110+
});
111+
});
73112
}
74113

75114
m_vert_remapper->remap_fwd();
@@ -94,7 +133,7 @@ update_end_fields ()
94133
fields.push_back(m_horiz_remapper_end->get_src_field(i));
95134
}
96135

97-
if (m_vr_type==Dynamic3D) {
136+
if (m_vr_type==Dynamic3D or m_vr_type==Dynamic3DRef) {
98137
// We also need to read the src pressure profile
99138
fields.push_back(m_horiz_remapper_end->get_src_field(m_nfields));
100139
}
@@ -276,6 +315,7 @@ setup_remappers (const std::string& hremap_filename,
276315
int nlevs_data = get_input_files_dimlen ("lev");
277316
grid_after_hremap->reset_num_vertical_lev(nlevs_data);
278317

318+
std::shared_ptr<VerticalRemapper> vremap;
279319
if (hremap_filename!="") {
280320
m_horiz_remapper_beg = std::make_shared<RefiningRemapperP2P>(grid_after_hremap,hremap_filename);
281321
m_horiz_remapper_end = std::make_shared<RefiningRemapperP2P>(grid_after_hremap,hremap_filename);
@@ -306,10 +346,49 @@ setup_remappers (const std::string& hremap_filename,
306346
}
307347
};
308348

309-
m_vert_remapper = m_vremap = std::make_shared<VerticalRemapper>(grid_after_hremap,m_model_grid);
310-
m_vremap->set_extrapolation_type(s2et(extrap_type_top),VerticalRemapper::Top);
311-
m_vremap->set_extrapolation_type(s2et(extrap_type_bot),VerticalRemapper::Bot);
312-
m_vremap->set_mask_value(mask_value);
349+
auto vremap = std::make_shared<VerticalRemapper>(grid_after_hremap,m_model_grid);
350+
351+
vremap->set_extrapolation_type(s2et(extrap_type_top),VerticalRemapper::Top);
352+
vremap->set_extrapolation_type(s2et(extrap_type_bot),VerticalRemapper::Bot);
353+
vremap->set_mask_value(mask_value);
354+
355+
// Setup vertical pressure profiles (which can add 1 extra field to hremap)
356+
// This MUST be done before registering in vremap, since register_field_from_tgt
357+
// REQUIRES to have source pressure profiles set BEFORE.
358+
359+
auto p_layout = vr_type==Static1D ? grid_after_hremap->get_vertical_layout(true)
360+
: grid_after_hremap->get_3d_scalar_layout(true);
361+
auto& src_p = m_helper_pressure_fields ["src_p"];
362+
src_p = Field (FieldIdentifier("src_p",p_layout,ekat::units::Pa,grid_after_hremap->name()));
363+
src_p.get_header().get_alloc_properties().request_allocation(SCREAM_PACK_SIZE);
364+
src_p.allocate_view();
365+
if (vr_type==Dynamic3D) {
366+
// We load a full 3d profile, so p_data IS src_p
367+
m_helper_pressure_fields ["p_data"] = src_p.alias(data_pname);
368+
} else if (vr_type==Dynamic3DRef) {
369+
// We load the surface pressure, and reconstruct src_p via p=ps*hybm(k) + p0*hyam(k)
370+
auto& ps = m_helper_pressure_fields ["p_data"];
371+
ps = Field(FieldIdentifier(data_pname,grid_after_hremap->get_2d_scalar_layout(),ekat::units::Pa,grid_after_hremap->name()));
372+
ps.allocate_view();
373+
374+
// We need to reconstruct the 3d pressure from ps, hybm, and hyam.
375+
// We read and store hyam/hybm in the vremap src grid
376+
auto layout = grid_after_hremap->get_vertical_layout(true);
377+
auto nondim = ekat::units::Units::nondimensional();
378+
DataType real_t = DataType::RealType;
379+
auto hyam = grid_after_hremap->create_geometry_data("hyam",layout,nondim,real_t,SCREAM_PACK_SIZE);
380+
auto hybm = grid_after_hremap->create_geometry_data("hybm",layout,nondim,real_t,SCREAM_PACK_SIZE);
381+
AtmosphereInput hvcoord_reader (m_time_database.files.front(),grid_after_hremap,{hyam,hybm},true);
382+
hvcoord_reader.read_variables();
383+
} else if (vr_type==Static1D) {
384+
// Can load p now, since it's static
385+
AtmosphereInput src_p_reader (m_time_database.files.front(),grid_after_hremap,{src_p.alias(data_pname)},true);
386+
src_p_reader.read_variables();
387+
}
388+
vremap->set_source_pressure (m_helper_pressure_fields["src_p"],VerticalRemapper::Both);
389+
vremap->set_target_pressure (model_pmid,model_pint);
390+
391+
m_vert_remapper = vremap;
313392
} else {
314393
// If no vert remap is requested, model_grid and grid_after_hremap MUST have same nlevs
315394
int model_nlevs = m_model_grid->get_num_vertical_levels();
@@ -319,36 +398,6 @@ setup_remappers (const std::string& hremap_filename,
319398
" - input data num vert levels: " + std::to_string(nlevs_data) + "\n");
320399
m_vert_remapper = std::make_shared<IDR>(grid_after_hremap,SAT);
321400
}
322-
323-
// Setup vertical pressure profiles (which can add 1 extra field to hremap)
324-
// This MUST be done before registering in vremap, since register_field_from_tgt
325-
// REQUIRES to have source pressure profiles set BEFORE.
326-
Field data_p;
327-
if (vr_type==Dynamic3D) {
328-
// We also need to load and remap the pressure from the input files
329-
auto hr_tgt_grid = m_horiz_remapper_beg->get_tgt_grid();
330-
auto p_layout = hr_tgt_grid->get_3d_scalar_layout(true);
331-
data_p = Field (FieldIdentifier(data_pname,p_layout,ekat::units::Pa,hr_tgt_grid->name()));
332-
data_p.allocate_view();
333-
334-
m_vremap->set_source_pressure (data_p,VerticalRemapper::Both);
335-
m_vremap->set_target_pressure (model_pmid,model_pint);
336-
} else if (vr_type==Static1D) {
337-
auto hr_tgt_grid = m_horiz_remapper_beg->get_tgt_grid();
338-
auto p_layout = hr_tgt_grid->get_vertical_layout(true);
339-
data_p = Field (FieldIdentifier(data_pname,p_layout,ekat::units::Pa,hr_tgt_grid->name()));
340-
data_p.allocate_view();
341-
342-
// Use raw scorpio to read this var, since it's not decomposed. Use any file, since it's static
343-
auto filename = m_time_database.files.front();
344-
scorpio::register_file(filename,scorpio::Read);
345-
scorpio::read_var(filename,data_pname,data_p.get_internal_view_data<Real,Host>());
346-
scorpio::release_file(filename);
347-
data_p.sync_to_dev();
348-
349-
m_vremap->set_source_pressure (data_p,VerticalRemapper::Both);
350-
m_vremap->set_target_pressure (model_pmid,model_pint);
351-
}
352401
m_vr_type = vr_type;
353402

354403
// Register fields in the remappers. Vertical first, since we only have model-grid fields
@@ -365,9 +414,10 @@ setup_remappers (const std::string& hremap_filename,
365414
m_horiz_remapper_beg->register_field_from_tgt(f.clone());
366415
m_horiz_remapper_end->register_field_from_tgt(f.clone());
367416
}
368-
if (vr_type==Dynamic3D) {
369-
m_horiz_remapper_beg->register_field_from_tgt(data_p.clone());
370-
m_horiz_remapper_end->register_field_from_tgt(data_p.clone());
417+
if (vr_type==Dynamic3D or vr_type==Dynamic3DRef) {
418+
const auto& data_p = m_helper_pressure_fields["p_data"];
419+
m_horiz_remapper_beg->register_field_from_tgt(data_p.clone(data_pname));
420+
m_horiz_remapper_end->register_field_from_tgt(data_p.clone(data_pname));
371421
}
372422
m_horiz_remapper_beg->registration_ends();
373423
m_horiz_remapper_end->registration_ends();

0 commit comments

Comments
 (0)