-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBS_OPNIT.FOR
157 lines (128 loc) · 5.49 KB
/
BS_OPNIT.FOR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
C=======================================================================
C BS_OPNIT, Subroutine
C-----------------------------------------------------------------------
C Generates output file for daily plant nitrogen variables
C This routine is used for Sugarbeet.
C-----------------------------------------------------------------------
C REVISION HISTORY
C 01/01/1990 Written
C 09/21/1998 CHP Split off from OPDAY.FOR file
C 05/11/1999 GH Incorporated in CROPGRO
C 12/18/2001 WDB Revised for modular CERES
C 08/20/2002 GH Modified for Y2K
C-----------------------------------------------------------------------
C Called by: BS_CERES
C Calls: None
!=======================================================================
SUBROUTINE BS_OPNIT(CONTROL, ISWITCH,
& YRPLT, MDATE, NLAYR, SENESCE,
& WTNCAN,WTNSD,WTNVEG,PCNGRN,PCNVEG,
& WTNUP,WTNLF,WTNST,PCNL,PCNST,PCNRT)
!-----------------------------------------------------------------------
USE ModuleDefs
IMPLICIT NONE
SAVE
INTEGER DAS, DYNAMIC, MDATE, NOUTDN, YRSIM
CHARACTER*1 IDETG, IDETN, RNMODE
CHARACTER*6, PARAMETER :: ERRKEY = 'BS_OPN'
CHARACTER*12 OUTPN
INTEGER DAP, DOY, ERRNUM, FROP, L, NLAYR, RUN
INTEGER TIMDIF, YEAR, YRDOY, YRPLT
REAL PCNL
REAL WTNCAN,WTNSD,WTNVEG,PCNGRN,PCNVEG
REAL WTNUP,WTNLF,WTNST,PCNST,PCNRT
REAL CUMSENSURFN, CUMSENSOILN !cumul. senes. N soil and surface
LOGICAL FEXIST, FIRST
! The variable "CONTROL" is of type "ControlType".
TYPE (ControlType) CONTROL
! The variable "ISWITCH" is of type "SwitchType".
TYPE (SwitchType) ISWITCH
TYPE (ResidueType) SENESCE
IDETG = ISWITCH % IDETG
IDETN = ISWITCH % IDETN
IF (IDETG == 'N' .OR. IDETN == 'N') RETURN
DAS = CONTROL % DAS
DYNAMIC = CONTROL % DYNAMIC
FROP = CONTROL % FROP
RUN = CONTROL % RUN
RNMODE = CONTROL % RNMODE
YRDOY = CONTROL % YRDOY
YRSIM = CONTROL % YRSIM
!-----------------------------------------------------------------------
IF(DYNAMIC.EQ.RUNINIT) THEN
OUTPN = 'PlantN.OUT'
CALL GETLUN('OUTPN', NOUTDN)
ENDIF
!***********************************************************************
! Seasonal initialization - run once per season
!***********************************************************************
IF (DYNAMIC .EQ. SEASINIT) THEN
! Initialize daily plant nitrogen output file
INQUIRE (FILE = OUTPN, EXIST = FEXIST)
IF (FEXIST) THEN
OPEN (UNIT = NOUTDN, FILE = OUTPN, STATUS = 'OLD',
& IOSTAT = ERRNUM, POSITION = 'APPEND')
FIRST = .FALSE.
ELSE
OPEN (UNIT = NOUTDN, FILE = OUTPN, STATUS = 'NEW',
& IOSTAT = ERRNUM)
WRITE(NOUTDN,'("*PLANT N OUTPUT FILE")')
FIRST = .TRUE.
ENDIF
CALL HEADER(SEASINIT, NOUTDN, RUN)
WRITE (NOUTDN,230)
230 FORMAT('@YEAR DOY DAS DAP',
& ' CNAD GNAD VNAD GN%D VN%D NUPC',
& ' LNAD SNAD LN%D SN%D RN%D SNN0C SNN1C')
!cumul. senes. N soil and surface
CUMSENSURFN = 0.0
CUMSENSOILN = 0.0
ENDIF
!***********************************************************************
!***********************************************************************
! DAILY OUTPUT
!***********************************************************************
IF (DYNAMIC .EQ. OUTPUT) THEN
! Calculate cumulative N senesenced
CUMSENSURFN = CUMSENSURFN + SENESCE % ResE(0,1)
DO L = 1, NLAYR
CUMSENSOILN = CUMSENSOILN + SENESCE % ResE(L,1)
ENDDO
!-----------------------------------------------------------------
! CHECK FOR OUTPUT FREQUENCY
!-----------------------------------------------------------------
IF (YRDOY .GE. YRPLT .AND. YRPLT .GT. 0)
& THEN
DAP = MAX(0, TIMDIF(YRPLT, YRDOY))
! DAS = MAX(0, TIMDIF(YRSIM, YRDOY))
IF ((MOD(DAS,FROP) .EQ. 0) !Daily output every FROP days,
& .OR. (YRDOY .EQ. YRPLT) !on planting date, and
& .OR. (YRDOY .EQ. MDATE)) THEN !at harvest maturity
CALL YR_DOY(YRDOY, YEAR, DOY)
! Print
WRITE (NOUTDN,300) YEAR, DOY, DAS, DAP,
& (WTNCAN*10.0), (WTNSD*10.0), (WTNVEG*10.0),
& PCNGRN, PCNVEG, (WTNUP*10.0),
& (WTNLF*10.0), (WTNST*10.0), PCNL, PCNST, PCNRT,
& CUMSENSURFN, CUMSENSOILN
300 FORMAT (1X,I4,1X,I3.3,2(1X,I5),3(1X,F6.1),2(1X,F6.2),
& 4(1X,F6.1),2(1X,F6.2), 2F8.2)
ENDIF
ENDIF
ENDIF
!***********************************************************************
!***********************************************************************
! SEASEND
!***********************************************************************
IF (DYNAMIC .EQ. SEASEND) THEN
!-----------------------------------------------------------------------
CLOSE (NOUTDN)
!***********************************************************************
!***********************************************************************
! END OF DYNAMIC IF CONSTRUCT
!***********************************************************************
ENDIF
!***********************************************************************
RETURN
END SUBROUTINE BS_OPNIT
!=======================================================================