ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_NOAHMP_Fields.H
Go to the documentation of this file.
1 #ifndef ERF_NOAHMP_FIELDS_H
2 #define ERF_NOAHMP_FIELDS_H
3 
4 // ===========================================================================
5 // ERF <-> Noah-MP coupling contract: what crosses the boundary. Mechanical (1:1)
6 // fields live in the NOAHMP_*_FIELDS registries below, expanded via emitter macros
7 // to generate enum entries, names, and host<->NoahmpIO copies from one source.
8 // To add one: append an X(...) row (enum order is an invariant -- do not reorder).
9 // See dev/spec-noahmp-api.md and dev/spec-noahmp-reorg.md.
10 // ===========================================================================
11 
12 // ---------------------------------------------------------------------------
13 // Field registries. X(comp) -> LsmData (no NoahmpIO member, kept by name);
14 // X(comp, member) -> boundary field with its NoahmpIO array.
15 // ---------------------------------------------------------------------------
16 
17 // ERF-internal state fields (LsmData_NOAHMP), fixed 2D. The 3D soil profile
18 // (SMOIS/SH2O/TSLB) is appended at RUNTIME after NumVars -- see soil_data_idx.
19 #define NOAHMP_LSMDATA_FIELDS(X) \
20  /* radiation coupling */ \
21  X(t_sfc) X(sfc_emis) \
22  X(sfc_alb_dir_vis) X(sfc_alb_dir_nir) \
23  X(sfc_alb_dif_vis) X(sfc_alb_dif_nir) \
24  X(cos_zenith_angle) X(sw_flux_dn) \
25  X(sw_flux_dn_dir_vis) X(sw_flux_dn_dir_nir) \
26  X(sw_flux_dn_dif_vis) X(sw_flux_dn_dif_nir) \
27  X(lw_flux_dn) \
28  /* land return-term diagnostics */ \
29  X(grdflx) X(fira) X(sav) X(sag) X(albedo) \
30  X(sfcrunoff) X(udrunoff) X(smstav) X(smstot) \
31  /* native Noah-MP 2-m bundle */ \
32  X(noahmp_temperature_2m_vegetated) \
33  X(noahmp_temperature_2m_bare) \
34  X(noahmp_water_vapor_mixing_ratio_2m_vegetated) \
35  X(noahmp_water_vapor_mixing_ratio_2m_bare) \
36  X(noahmp_vegetation_fraction)
37 
38 // Forcing ERF -> Noah-MP, mechanical 1:1 copies: X( ERF comp, NoahmpIO member ).
39 // 3D members use the k/j transpose MEMBER(i,1,j); 2D use MEMBER(i,j).
40 #define NOAHMP_INPUT_3D_FIELDS(X) \
41  /* ERF comp NoahmpIO member */ \
42  X( u_phy, U_PHY ) \
43  X( v_phy, V_PHY ) \
44  X( t_phy, T_PHY ) \
45  X( qv_curr, QV_CURR ) \
46  X( p8w, P8W )
47 
48 #define NOAHMP_INPUT_2D_FIELDS(X) \
49  /* ERF comp NoahmpIO member */ \
50  X( swdown, SWDOWN ) \
51  X( glw, GLW ) \
52  X( coszen, COSZEN )
53 
54 // Results Noah-MP -> ERF, mechanical 1:1 copies: X( ERF comp, NoahmpIO member ).
55 // Split HEAD/TAIL so the enum can interleave the banded albedos; copy loop uses both.
56 #define NOAHMP_OUTPUT_2D_FIELDS_HEAD(X) \
57  /* ERF comp NoahmpIO member */ \
58  X( hfx, HFX ) \
59  X( lh, LH ) \
60  X( tau_ew, TAU_EW ) \
61  X( tau_ns, TAU_NS ) \
62  X( tsk, TSK ) \
63  X( emiss, EMISS )
64 
65 #define NOAHMP_OUTPUT_2D_FIELDS_TAIL(X) \
66  /* ERF comp NoahmpIO member */ \
67  X( o_grdflx, GRDFLX ) \
68  X( o_fira, FIRAXY ) \
69  X( o_sav, SAVXY ) \
70  X( o_sag, SAGXY ) \
71  X( o_albedo, ALBEDO ) \
72  X( o_sfcrunoff, SFCRUNOFF ) \
73  X( o_udrunoff, UDRUNOFF ) \
74  X( o_noahmp_t2m_veg, T2MVXY ) \
75  X( o_noahmp_t2m_bare, T2MBXY ) \
76  X( o_noahmp_q2m_veg, Q2MVXY ) \
77  X( o_noahmp_q2m_bare, Q2MBXY ) \
78  X( o_noahmp_fveg, FVEGXY )
79 
80 #define NOAHMP_OUTPUT_2D_FIELDS(X) NOAHMP_OUTPUT_2D_FIELDS_HEAD(X) \
81  NOAHMP_OUTPUT_2D_FIELDS_TAIL(X)
82 
83 // Noah-MP result -> ERF, mechanical 1:1: X( ERF Array4 alias, LsmData comp, Output
84 // comp ). Banded albedos are listed but read explicitly; SMSTAV/SMSTOT are not listed.
85 #define NOAHMP_RESULT_FIELDS(X) \
86  /* ERF Array4 alias LsmData comp Output comp */ \
87  X( TSK, t_sfc, tsk ) \
88  X( EMISS, sfc_emis, emiss ) \
89  X( ALBSFCDIR_VIS, sfc_alb_dir_vis, albsfcdir_vis ) \
90  X( ALBSFCDIR_NIR, sfc_alb_dir_nir, albsfcdir_nir ) \
91  X( ALBSFCDIF_VIS, sfc_alb_dif_vis, albsfcdif_vis ) \
92  X( ALBSFCDIF_NIR, sfc_alb_dif_nir, albsfcdif_nir ) \
93  X( GRDFLX_o, grdflx, o_grdflx ) \
94  X( FIRA_o, fira, o_fira ) \
95  X( SAV_o, sav, o_sav ) \
96  X( SAG_o, sag, o_sag ) \
97  X( ALBEDO_o, albedo, o_albedo ) \
98  X( SFCRUNOFF_o, sfcrunoff, o_sfcrunoff ) \
99  X( UDRUNOFF_o, udrunoff, o_udrunoff ) \
100  X( T2MVXY_o, noahmp_temperature_2m_vegetated, o_noahmp_t2m_veg ) \
101  X( T2MBXY_o, noahmp_temperature_2m_bare, o_noahmp_t2m_bare) \
102  X( Q2MVXY_o, noahmp_water_vapor_mixing_ratio_2m_vegetated, o_noahmp_q2m_veg ) \
103  X( Q2MBXY_o, noahmp_water_vapor_mixing_ratio_2m_bare, o_noahmp_q2m_bare) \
104  X( FVEGXY_o, noahmp_vegetation_fraction, o_noahmp_fveg )
105 
106 // ---------------------------------------------------------------------------
107 // Reusable field emitters -- the per-row action applied when a registry is
108 // expanded, e.g. NOAHMP_LSMDATA_FIELDS(NOAHMP_QUOTE) -> "t_sfc", "sfc_emis", ...
109 #define NOAHMP_ENUM(comp) comp, // (comp) -> enum entry
110 #define NOAHMP_QUOTE(comp) #comp, // (comp) -> "comp" literal
111 #define NOAHMP_COMP(comp, member) comp, // (comp, member) -> enum entry
112 
113 // ---------------------------------------------------------------------------
114 // Enums generated from the registries (plus fixed entries); order is preserved.
115 // ---------------------------------------------------------------------------
116 
117 namespace LsmData_NOAHMP {
118  enum {
120  NumVars
121  // Soil profile (SMOIS/SH2O/TSLB) appended at RUNTIME after NumVars as three
122  // contiguous groups of m_nsoil layers. See NOAHMP::soil_data_idx.
123  };
124 }
125 
126 namespace LsmFlux_NOAHMP {
127  enum {
128  // 2D SurfaceLayer flux vars
129  t_flux = 0,
133  NumVars
134  };
135 }
136 
137 // Fixed index per typed surface-precip source slot (field order of
138 // SurfacePrecipAccumulationSources), keying the snapshots and interval deltas.
139 namespace NoahmpPrecipSlot {
140  enum {
141  total = 0, // total non-convective precip (if the scheme exposes one)
142  rain, // explicit rain (schemes without a total slot)
143  snow, // snow (+ice)
144  graupel, // graupel
145  hail, // folded into MP_GRAUP (coupled MP_HAIL set to 0)
146  NumSlots
147  };
148 }
149 
150 namespace NoahmpInputComp {
151  enum {
154  // computed precip staging (explicit, not table-driven)
155  rainbl, // accumulated precip over the interval [mm]
156  sr_in, // frozen fraction [-]
157  mp_rainnc, // total non-convective precip this interval [mm]
158  mp_snow, // snow (+ice) subset of mp_rainnc [mm]
159  mp_graup, // graupel subset of mp_rainnc [mm]
160  NumComps
161  };
162 }
163 
164 namespace NoahmpOutputComp {
165  enum {
167  // banded albedos (explicit: read at band 1=VIS / 2=NIR)
173  // sentinels: not computed by this core -> emitted as lsm_undefined
176  NumComps
177  // Per-layer soil outputs appended at RUNTIME after NumComps; the output
178  // buffer is sized NumComps + 3*nsoil to match.
179  };
180 }
181 
182 #endif /* ERF_NOAHMP_FIELDS_H */
#define NOAHMP_LSMDATA_FIELDS(X)
Definition: ERF_NOAHMP_Fields.H:19
#define NOAHMP_COMP(comp, member)
Definition: ERF_NOAHMP_Fields.H:111
#define NOAHMP_ENUM(comp)
Definition: ERF_NOAHMP_Fields.H:109
#define NOAHMP_INPUT_2D_FIELDS(X)
Definition: ERF_NOAHMP_Fields.H:48
#define NOAHMP_OUTPUT_2D_FIELDS_HEAD(X)
Definition: ERF_NOAHMP_Fields.H:56
#define NOAHMP_INPUT_3D_FIELDS(X)
Definition: ERF_NOAHMP_Fields.H:40
#define NOAHMP_OUTPUT_2D_FIELDS_TAIL(X)
Definition: ERF_NOAHMP_Fields.H:65
Definition: ERF_NOAHMP_Fields.H:117
@ NumVars
Definition: ERF_NOAHMP_Fields.H:120
Definition: ERF_NOAHMP_Fields.H:126
@ t_flux
Definition: ERF_NOAHMP_Fields.H:129
@ tau13
Definition: ERF_NOAHMP_Fields.H:131
@ q_flux
Definition: ERF_NOAHMP_Fields.H:130
@ NumVars
Definition: ERF_NOAHMP_Fields.H:133
@ tau23
Definition: ERF_NOAHMP_Fields.H:132
Definition: ERF_NOAHMP_Fields.H:150
@ sr_in
Definition: ERF_NOAHMP_Fields.H:156
@ rainbl
Definition: ERF_NOAHMP_Fields.H:155
@ mp_graup
Definition: ERF_NOAHMP_Fields.H:159
@ mp_rainnc
Definition: ERF_NOAHMP_Fields.H:157
@ NumComps
Definition: ERF_NOAHMP_Fields.H:160
@ mp_snow
Definition: ERF_NOAHMP_Fields.H:158
Definition: ERF_NOAHMP_Fields.H:164
@ o_smstot
Definition: ERF_NOAHMP_Fields.H:175
@ o_smstav
Definition: ERF_NOAHMP_Fields.H:174
@ albsfcdir_vis
Definition: ERF_NOAHMP_Fields.H:168
@ albsfcdif_nir
Definition: ERF_NOAHMP_Fields.H:171
@ albsfcdif_vis
Definition: ERF_NOAHMP_Fields.H:170
@ albsfcdir_nir
Definition: ERF_NOAHMP_Fields.H:169
Definition: ERF_NOAHMP_Fields.H:139
@ graupel
Definition: ERF_NOAHMP_Fields.H:144
@ rain
Definition: ERF_NOAHMP_Fields.H:142
@ total
Definition: ERF_NOAHMP_Fields.H:141
@ hail
Definition: ERF_NOAHMP_Fields.H:145
@ snow
Definition: ERF_NOAHMP_Fields.H:143
@ NumSlots
Definition: ERF_NOAHMP_Fields.H:146