@@ -179,19 +179,37 @@ SUBROUTINE NVBC(REGN,FORST,DIST,VOLEQ,DBHOB,HTTOT,MTOPP,MTOPS,
179
179
ENDIF
180
180
ENDIF
181
181
ENDIF
182
+ !First call the mrules to get the region defaults
183
+ V_EQN = VOLEQ(1 :10 )
184
+ CALL MRULES(REGN,FORST,V_EQN,DBHOB,COR,EVOD,OPT,MAXLEN,
185
+ > MINLEN,MERCHL,MINLENT,MTOPP,MTOPS,STUMP,TRIM,BTR,DBTBH,MINBFD,
186
+ > PROD)
187
+ IF (MTOPS.GT. MTOPP) MTOPS = MTOPP
188
+ !If HTTOT is not provided, try to get an estimate from HT1PRD/ MTOPP, HT2PRD/ MTOPS
189
+ IF (HTTOT.LE. 0 )THEN
190
+ IF (HT2PRD.GT. 0.AND .MTOPS.GT. 0 )THEN
191
+ CALL NVB_ESTTHT(VOLEQ,DBHOB,HT2PRD,MTOPS,HTTOT,ERRFLG,
192
+ & SPGRPCD,WDSG)
193
+ ELSEIF (HT1PRD.GT. 0.AND .MTOPP.GT. 0 )THEN
194
+ CALL NVB_ESTTHT(VOLEQ,DBHOB,HT1PRD,MTOPP,HTTOT,ERRFLG,
195
+ & SPGRPCD,WDSG)
196
+ ENDIF
197
+ ENDIF
198
+ !If HTTOT still 0 , check broken height
182
199
IF (HTTOT.LE. 0 )THEN
183
200
IF (BRKHT.LE. 0.AND .BRKHTD.LE. 0 )THEN
184
201
ERRFLG = 4
185
- RETURN
202
+ ! RETURN
186
203
ELSEIF (BRKHT.LE. 0.OR .BRKHTD.LE. 0 )THEN
187
204
ERRFLG = 9
188
- RETURN
205
+ ! RETURN
189
206
ELSEIF (BRKHT.GT. 0.AND .BRKHTD.GT. 0 )THEN
190
207
CALL NVB_ESTTHT(VOLEQ,DBHOB,BRKHT,BRKHTD,HTTOT,ERRFLG,
191
208
& SPGRPCD,WDSG)
192
209
ENDIF
193
210
ENDIF
194
-
211
+ IF (HTTOT.LE. 0 ) ERRFLG = 4
212
+ IF (ERRFLG.GT. 0 ) RETURN
195
213
IF (BRKHT.LT. 4.5 ) BRKHT = 0
196
214
IF (BRKHT.GT. 0 )THEN
197
215
CALL NVB_GetRatioCOEF(VOLEQ,Tbl5Cnt,SPCOEF,JKCOEF,a,b,SPGRPCD)
@@ -228,48 +246,44 @@ SUBROUTINE NVBC(REGN,FORST,DIST,VOLEQ,DBHOB,HTTOT,MTOPP,MTOPS,
228
246
RemBrchProp = 0
229
247
ENDIF
230
248
!IF (SPCD.LT. 300 )THEN
231
- IF (SFTHRD.EQ. 0 )THEN
232
- IF (DECAYCD.eq. 1 )THEN
233
- DenProp = 0.97
234
- DeadCF = 0.501
235
- ELSEIF (DECAYCD.EQ. 2 )THEN
236
- DenProp = 1
237
- DeadCF = 0.504
238
- ELSEIF (DECAYCD.EQ. 3 )THEN
239
- DenProp = 0.92
240
- DeadCF = 0.506
241
- ELSEIF (DECAYCD.EQ. 4 )THEN
242
- DenProp = 0.55
243
- DeadCF = 0.52
244
- ELSEIF (DECAYCD.EQ. 5 )THEN
245
- DenProp = 0.55
246
- DeadCF = 0.527
247
- ENDIF
248
- ELSE
249
- IF (DECAYCD.eq. 1 )THEN
250
- DenProp = 0.99
251
- DeadCF = 0.47
252
- ELSEIF (DECAYCD.EQ. 2 )THEN
253
- DenProp = 0.8
254
- DeadCF = 0.473
255
- ELSEIF (DECAYCD.EQ. 3 )THEN
256
- DenProp = 0.54
257
- DeadCF = 0.481
258
- ELSEIF (DECAYCD.EQ. 4 )THEN
259
- DenProp = 0.43
260
- DeadCF = 0.48
261
- ELSEIF (DECAYCD.EQ. 5 )THEN
262
- DenProp = 0.43
263
- DeadCF = 0.472
264
- ENDIF
265
- ENDIF
249
+ !Move the following code to DecayDenProp subroutine (2025 / 05 / 08 )
250
+ !IF (SFTHRD.EQ. 0 )THEN
251
+ ! IF (DECAYCD.eq. 1 )THEN
252
+ ! DenProp = 0.97
253
+ ! DeadCF = 0.501
254
+ ! ELSEIF (DECAYCD.EQ. 2 )THEN
255
+ ! DenProp = 1
256
+ ! DeadCF = 0.504
257
+ ! ELSEIF (DECAYCD.EQ. 3 )THEN
258
+ ! DenProp = 0.92
259
+ ! DeadCF = 0.506
260
+ ! ELSEIF (DECAYCD.EQ. 4 )THEN
261
+ ! DenProp = 0.55
262
+ ! DeadCF = 0.52
263
+ ! ELSEIF (DECAYCD.EQ. 5 )THEN
264
+ ! DenProp = 0.55
265
+ ! DeadCF = 0.527
266
+ ! ENDIF
267
+ !ELSE
268
+ ! IF (DECAYCD.eq. 1 )THEN
269
+ ! DenProp = 0.99
270
+ ! DeadCF = 0.47
271
+ ! ELSEIF (DECAYCD.EQ. 2 )THEN
272
+ ! DenProp = 0.8
273
+ ! DeadCF = 0.473
274
+ ! ELSEIF (DECAYCD.EQ. 3 )THEN
275
+ ! DenProp = 0.54
276
+ ! DeadCF = 0.481
277
+ ! ELSEIF (DECAYCD.EQ. 4 )THEN
278
+ ! DenProp = 0.43
279
+ ! DeadCF = 0.48
280
+ ! ELSEIF (DECAYCD.EQ. 5 )THEN
281
+ ! DenProp = 0.43
282
+ ! DeadCF = 0.472
283
+ ! ENDIF
284
+ !ENDIF
285
+ CALL DecayDenProp(SFTHRD,DECAYCD,DenProp,DeadCF)
266
286
ENDIF
267
- !First call the mrules to get the region defaults
268
- V_EQN = VOLEQ(1 :10 )
269
- CALL MRULES(REGN,FORST,V_EQN,DBHOB,COR,EVOD,OPT,MAXLEN,
270
- > MINLEN,MERCHL,MINLENT,MTOPP,MTOPS,STUMP,TRIM,BTR,DBTBH,MINBFD,
271
- > PROD)
272
- IF (MTOPS.GT. MTOPP) MTOPS = MTOPP
273
287
! (1 ) calculate total stem wood volume inside bark
274
288
CALL NVB_Vib(VOLEQ,DBHOB,HTTOT,Vtotib,ERRFLG,SPGRPCD,WDSG)
275
289
IF (ERRFLG.GT. 0 ) RETURN
@@ -313,7 +327,7 @@ SUBROUTINE NVBC(REGN,FORST,DIST,VOLEQ,DBHOB,HTTOT,MTOPP,MTOPS,
313
327
ENDIF
314
328
IF (HT1PRD.LT. STUMP) HT1PRD = STUMP
315
329
!Calculate sawtimber volume for FIA
316
- !CTYPE = B is set in noinitnvb when VOLEQ is not NSVB EQ
330
+ !CTYPE = B is set in volinitnvb when VOLEQ is not NSVB EQ
317
331
IF (CTYPE.EQ. ' I' .OR. CTYPE.EQ. ' B' )THEN
318
332
CALL CalcRatio(HTTOT,HT1PRD,RatioEQ,a,b,Rsaw2)
319
333
Vsawib2 = Vtotib* Rsaw2 - Vstumpib
@@ -606,6 +620,8 @@ SUBROUTINE NVB_HT2TOPDob(VOLEQ,DBHOB,HTTOT,Vob,TOPD,HT2,ERRFLG,
606
620
CALL NVB_Vob(VOLEQ,DBHOB,HTTOT,Vob,ERRFLG,SPGRPCD,WDSG)
607
621
ENDIF
608
622
CALL NVB_CalcHT2TOPD(Vob,a,b,HTTOT,TOPD,HT2)
623
+ !Added HT2 floor to 4.5 for merch height (2025 / 05 / 02 )
624
+ IF (HT2.LT. 5.AND .TOPD.LT. DBHOB) HT2 = 5
609
625
RETURN
610
626
END
611
627
!----------------------------------------------------------------------
@@ -856,7 +872,7 @@ SUBROUTINE CalcRatio(H,h1,equation,a,b,R)
856
872
INTEGER equation
857
873
REAL H,h1,a,b,R
858
874
R= 0
859
- IF (equation.EQ. 6.AND .(h1.GT. 0.AND .h1.LT . H))THEN
875
+ IF (equation.EQ. 6.AND .(h1.GT. 0.AND .h1.LE . H))THEN
860
876
R = (1 - (1 - h1/ H)** a)** b
861
877
ENDIF
862
878
RETURN
@@ -942,12 +958,12 @@ SUBROUTINE NVB_CalcHT2TOPD(TCUFT,a,b,HTTOT,TOPD,HT2)
942
958
hi = HTTOT
943
959
diff = 1.0
944
960
loopcnt = 0
945
- DO WHILE (ABS (diff).GT. 0.01 )
961
+ DO WHILE (ABS (diff).GT. 0.001 )
946
962
mid = (low+ hi)/ 2
947
963
X = mid/ HTTOT
948
964
diff = TOPD - ((TCUFT/ 0.005454154 / HTTOT* a* b*
949
965
+ (1 - X)** (a-1 )* (1 - (1 - X)** a)** (b-1 )))** 0.5
950
- IF (ABS (diff).LT. 0.05 ) THEN
966
+ IF (ABS (diff).LT. 0.001 ) THEN
951
967
EXIT
952
968
ENDIF
953
969
IF (diff.LT. 0.0 )THEN
@@ -958,7 +974,7 @@ SUBROUTINE NVB_CalcHT2TOPD(TCUFT,a,b,HTTOT,TOPD,HT2)
958
974
loopcnt = loopcnt + 1
959
975
IF (loopcnt.GT. 1000 ) EXIT
960
976
ENDDO
961
- HT2 = mid
977
+ HT2 = mid
962
978
RETURN
963
979
END
964
980
C ----------------------------------------------------------------------
@@ -1422,4 +1438,46 @@ SUBROUTINE GetRegnWF(REGN,FORST,SPCD,WtFac,DeadWF,PROD)
1422
1438
ENDIF
1423
1439
RETURN
1424
1440
END
1425
-
1441
+ !----------------------------------------------------------------------
1442
+ SUBROUTINE DecayDenProp(SFTHRD,DECAYCD,DenProp,DeadCF)
1443
+ IMPLICIT NONE
1444
+ INTEGER SFTHRD,DECAYCD
1445
+ REAL DenProp,DeadCF
1446
+
1447
+ IF(SFTHRD.EQ.0)THEN
1448
+ IF(DECAYCD.eq.1)THEN
1449
+ DenProp = 0.97
1450
+ DeadCF = 0.501
1451
+ ELSEIF(DECAYCD.EQ.2)THEN
1452
+ DenProp = 1
1453
+ DeadCF = 0.504
1454
+ ELSEIF(DECAYCD.EQ.3)THEN
1455
+ DenProp = 0.92
1456
+ DeadCF = 0.506
1457
+ ELSEIF(DECAYCD.EQ.4)THEN
1458
+ DenProp = 0.55
1459
+ DeadCF = 0.52
1460
+ ELSEIF(DECAYCD.EQ.5)THEN
1461
+ DenProp = 0.55
1462
+ DeadCF = 0.527
1463
+ ENDIF
1464
+ ELSE
1465
+ IF(DECAYCD.eq.1)THEN
1466
+ DenProp = 0.99
1467
+ DeadCF = 0.47
1468
+ ELSEIF(DECAYCD.EQ.2)THEN
1469
+ DenProp = 0.8
1470
+ DeadCF = 0.473
1471
+ ELSEIF(DECAYCD.EQ.3)THEN
1472
+ DenProp = 0.54
1473
+ DeadCF = 0.481
1474
+ ELSEIF(DECAYCD.EQ.4)THEN
1475
+ DenProp = 0.43
1476
+ DeadCF = 0.48
1477
+ ELSEIF(DECAYCD.EQ.5)THEN
1478
+ DenProp = 0.43
1479
+ DeadCF = 0.472
1480
+ ENDIF
1481
+ ENDIF
1482
+ RETURN
1483
+ END
0 commit comments