@@ -877,7 +877,7 @@ RC IZXRAT::iz_CkfIZXFER() // input checks
877877 }
878878
879879 if (!iz_CanHaveAFCat ())
880- ignore (IZXRAT_AFCAT , when);
880+ ignore (IZXRAT_AFCATI , when);
881881
882882 // horizontal opening
883883 // stairangle defaults
@@ -1048,16 +1048,13 @@ x }
10481048// -------------------------------------------------------------------
10491049void IZXRAT::iz_SetupAfMtrs ()
10501050{
1051- // Air flow category
1052- if (!iz_CanHaveAFCat ())
1053- iz_afCat = C_AFCAT_NONE;
1054- else if (!IsSet (IZXRAT_AFCAT))
1055- iz_afCat = iz_AfCatDefault (); // default category (may return -1)
1051+ // Air flow categories (set iz_afMtrCat1 and iz_afMtrCat2)
1052+ iz_AfMtrCats ();
10561053
10571054 // AFMTR ptrs: NULL if no meter specified -> no air flow accounting
10581055 // one pointer for positive flows, one for negative
10591056 iz_pAfMtr1 = iz_pAfMtr2 = NULL ; // insurance
1060- if (iz_afCat != C_AFCAT_NONE)
1057+ if (iz_afMtrCat1 != C_AFCAT_NONE)
10611058 { // set up ptrs to AFMTR(s)
10621059 const ZNR* zp;
10631060 if (iz_zi1 > 0 )
@@ -1081,41 +1078,56 @@ void IZXRAT::iz_SetupAfMtrs()
10811078
10821079} // IZXRAT::iz_SetupAfMtrs
10831080// -----------------------------------------------------------------------------
1084- BOOL IZXRAT::iz_IsIZUZ () const // true iff interzone connected to unconditioned
1081+ int IZXRAT::iz_IsCZ ( // detect conditioned / unconditioned adjacent zones
1082+ int iZn) const // 1: check inside zone, else checkout outside
1083+ // returns -1 (does not exist), 0=unconditioned, 1=conditioned
10851084{
1086- const ZNR* zp = ZrB.GetAtSafe (iz_zi2);
1087- return zp && zp->zn_IsUZ ();
1085+ int zi = iZn==1 ? iz_zi1 : iz_zi2;
1086+ const ZNR* zp = ZrB.GetAtSafe ( zi);
1087+ return !zp ? -1 : !zp->zn_IsUZ ();
10881088
1089- } // IZXRAT::iz_IsIZUZ
1089+ } // IZXRAT::iz_IsCZ
10901090// -----------------------------------------------------------------------------
1091- AFCAT IZXRAT::iz_AfCatDefault () const
1091+ void IZXRAT::iz_AfMtrCats () // finalize runtime air flow categories
1092+ // Tricky: interzone flow UZ/CZ categories differ depending on side of vent
10921093{
1093- AFCAT afCat;
1094+ iz_afMtrCat1 = iz_afMtrCat2 = - 1 ; // flag as unset
10941095 if (!iz_CanHaveAFCat ())
1095- afCat = C_AFCAT_NONE; // not trackable
1096+ iz_afMtrCat1 = C_AFCAT_NONE; // not trackable
1097+ else if (IsSet (IZXRAT_AFCATI))
1098+ iz_afMtrCat1 = iz_afCatI; // use user input (not checked for consistency with IZXRAT type)
10961099 else if (iz_IsSysAir ())
1097- afCat = C_AFCAT_HVAC;
1100+ iz_afMtrCat1 = C_AFCAT_HVAC;
10981101 else if (iz_IsDuctLk ())
1099- afCat = C_AFCAT_DUCTLK;
1102+ iz_afMtrCat1 = C_AFCAT_DUCTLK;
11001103 else if (iz_IsHERV ())
1101- afCat = C_AFCAT_FANEX;
1104+ iz_afMtrCat1 = C_AFCAT_FANEX;
11021105 else
11031106 { const static int afCats[3 ][3 ] =
1104- { { C_AFCAT_FANEX, C_AFCAT_VNTEX, C_AFCAT_INFEX },
1107+ { { C_AFCAT_FANEX, C_AFCAT_VNTEX, C_AFCAT_INFEX },
11051108 { C_AFCAT_FANUZ, C_AFCAT_VNTUZ, C_AFCAT_INFUZ },
11061109 { C_AFCAT_FANCZ, C_AFCAT_VNTCZ, C_AFCAT_INFCZ }
11071110 };
1111+
11081112 // fan / vent / infil
11091113 // Note: vent guess is approx, explicit izAFCat input may be necessary
11101114 int izMode = iz_IsFixedFlow () ? 0 : iz_MightBeNatVent () ? 1 : 2 ;
1111- // exterior / uncond zone / cond zone
1112- int izLoc = iz_IsExterior () ? 0 : iz_IsIZUZ () ? 1 : 2 ;
1113- afCat = afCats[izLoc][izMode];
1115+ if (iz_IsExterior ())
1116+ iz_afMtrCat1 = afCats[0 ][izMode];
1117+ else
1118+ { // interzone: set category per *other* side
1119+ // iz_IsCZ() returns -1 (no zone, not expected), 0 (uncond), 1 (cond)
1120+ int iCZ1 = iz_IsCZ (1 ); // inside
1121+ int iCZ2 = iz_IsCZ (2 ); // outside
1122+ iz_afMtrCat1 = afCats[iCZ2 + 1 ][izMode];
1123+ iz_afMtrCat2 = afCats[iCZ1 + 1 ][izMode];
1124+ }
11141125 }
11151126
1116- return afCat;
1127+ if (iz_afMtrCat2 < 0 )
1128+ iz_afMtrCat2 = iz_afMtrCat1;
11171129
1118- } // IZXRAT::iz_AfcatDefault
1130+ } // IZXRAT::iz_AfMtrCats
11191131// -----------------------------------------------------------------------------
11201132RC IZXRAT::iz_SetupNonAirNet () // interzone transfer one-time initialization
11211133
@@ -1565,12 +1577,12 @@ RC IZXRAT::iz_EndSubhr() // end-of-subhour vent calcs
15651577 += (1 .f - fVent )*iz_ad[0 ].ad_mdotB + fVent * iz_ad[1 ].ad_mdotB ;
15661578 if (iz_doingAfMtr && iz_amfNom != 0 .f )
15671579 { if (iz_pAfMtr1)
1568- iz_pAfMtr1->amt_AccumCat (iz_afCat , iz_amfNom);
1580+ iz_pAfMtr1->amt_AccumCat (iz_afMtrCat1 , iz_amfNom);
15691581 if (iz_pAfMtr2)
15701582 { // flow is opposite direction from z2 POV
15711583 // HERV: iz_pAfMtr2 points to exhaust source zone (may be z1)
15721584 // HERV same for vent / no vent (use iz_ad[ 0] w/o fVent)
1573- iz_pAfMtr2->amt_AccumCat (iz_afCat ,
1585+ iz_pAfMtr2->amt_AccumCat (iz_afMtrCat2 ,
15741586 iz_IsHERV () ? -iz_ad[0 ].ad_mdotX : -iz_amfNom);
15751587 }
15761588 }
0 commit comments