*IF DEF,FLUXPROC FPHEAT1.2
C ******************************COPYRIGHT****************************** FPHEAT1.3
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. FPHEAT1.4
C FPHEAT1.5
C Use, duplication or disclosure of this code is subject to the FPHEAT1.6
C restrictions as set forth in the contract. FPHEAT1.7
C FPHEAT1.8
C Meteorological Office FPHEAT1.9
C London Road FPHEAT1.10
C BRACKNELL FPHEAT1.11
C Berkshire UK FPHEAT1.12
C RG12 2SZ FPHEAT1.13
C FPHEAT1.14
C If no contract has been raised with this copy of the code, the use, FPHEAT1.15
C duplication or disclosure of it is strictly prohibited. Permission FPHEAT1.16
C to do so must first be obtained in writing from the Head of Numerical FPHEAT1.17
C Modelling at the above address. FPHEAT1.18
C ******************************COPYRIGHT****************************** FPHEAT1.19
C FPHEAT1.20
C Programming standard: Unified Model Documentation Paper No 3 FPHEAT1.21
C Version No 1 15/1/90 FPHEAT1.22
C History: FPHEAT1.23
C version date change FPHEAT1.24
C 4.5 03/09/98 New code FPHEAT1.25
C FPHEAT1.26
! Author: M. J. Bell FPHEAT1.27
!---------------------------------------------------------------------- FPHEAT1.28
! contains routines: heat FPHEAT1.29
! FPHEAT1.30
! Purpose: Flux processing routine. FPHEAT1.31
! To produce a pp file containing: FPHEAT1.32
! Net Penetraing Solar Radiation (SOL) FPHEAT1.33
! Net non Penetraing Heat (HTN) FPHEAT1.34
! for the times required. FPHEAT1.35
!---------------------------------------------------------------------- FPHEAT1.36
subroutine heat( 1,12FPHEAT1.37
*CALL AFIELDS
FPHEAT1.38
*CALL ARGPPX
FPHEAT1.39
# icode ) FPHEAT1.40
FPHEAT1.41
implicit none FPHEAT1.42
FPHEAT1.43
! declaration of argument list FPHEAT1.44
FPHEAT1.45
! array dimensions, lsms, interpolation coeffs etc. : all intent IN FPHEAT1.46
*CALL CFIELDS
FPHEAT1.47
FPHEAT1.48
integer icode ! IN/OUT error code ; > 0 => fatal error detected FPHEAT1.49
FPHEAT1.50
! declaration of parameters FPHEAT1.51
*CALL CSUBMODL
FPHEAT1.52
*CALL CPPXREF
FPHEAT1.53
*CALL PPXLOOK
FPHEAT1.54
*CALL CFDCODES
FPHEAT1.55
*CALL PLOOKUPS
FPHEAT1.56
FPHEAT1.57
real lhevap ! latent heat of evaporation FPHEAT1.58
parameter ( lhevap = 2.25E6) FPHEAT1.59
FPHEAT1.60
! declaration of globals used FPHEAT1.61
*CALL CUNITNOS
FPHEAT1.62
*CALL C_MDI
FPHEAT1.63
*CALL CMESS
FPHEAT1.64
*CALL CVALOFF
FPHEAT1.65
*CALL CDEBUG
FPHEAT1.66
FPHEAT1.67
! declaration of local arrays FPHEAT1.68
integer Int_Head_SW1(Len_IntHd) ! integer part of lookup table FPHEAT1.69
integer Int_Head_SW(Len_IntHd) ! integer part of lookup table FPHEAT1.70
integer Int_Head_LW(Len_IntHd) ! integer part of lookup table FPHEAT1.71
integer Int_Head_EVAP(Len_IntHd) ! integer part of lookup table FPHEAT1.72
integer Int_Head_SH(Len_IntHd) ! integer part of lookup table FPHEAT1.73
real Real_Head_SW1(Len_RealHd) ! real part of lookup table FPHEAT1.74
real Real_Head_SW(Len_RealHd) ! real part of lookup table FPHEAT1.75
real Real_Head_LW(Len_RealHd) ! real part of lookup table FPHEAT1.76
real Real_Head_EVAP(Len_RealHd) ! real part of lookup table FPHEAT1.77
real Real_Head_SH(Len_RealHd) ! real part of lookup table FPHEAT1.78
real SW_radiation_band1(ncols, nrowst)! short wave flux (band 1) FPHEAT1.79
real SW_radiation(ncols, nrowst) ! short wave flux FPHEAT1.80
real LW_radiation(ncols, nrowst) ! long_wave_radiation FPHEAT1.81
real evaporation(ncols, nrowst) ! evaporation FPHEAT1.82
real sensible_heat(ncols, nrowst) ! sensible heat FPHEAT1.83
real latent_heat(ncols,nrowst) ! latent heat FPHEAT1.84
real non_pen_heat(ncols,nrowst) ! net non-penetrating heat FPHEAT1.85
real fieldint(ncols,nrowst) ! intermediate field FPHEAT1.86
! declaration of local scalars FPHEAT1.87
FPHEAT1.88
integer ivt ! loop index over validity times FPHEAT1.89
integer IVTOffHr ! offset of validity time from reference FPHEAT1.90
integer IOutUnit ! output unit FPHEAT1.91
FPHEAT1.92
logical ldebug ! T => output debugging info (set in 0.) FPHEAT1.93
logical l_leads ! T => using minleadsfrac FPHEAT1.94
! F => using minicefrac FPHEAT1.95
FPHEAT1.96
character * 256 cmessage ! error message FPHEAT1.97
FPHEAT1.98
! declaration of externals FPHEAT1.99
external read_leads_flds, write_one_field, FPHEAT1.100
# ScalarMult,FieldSub,FieldAdd FPHEAT1.101
FPHEAT1.102
!---------------------------------------------------------------------- FPHEAT1.103
! 0. Preliminaries FPHEAT1.104
!---------------------------------------------------------------------- FPHEAT1.105
CSub = 'heat' ! subroutine name for error messages FPHEAT1.106
FPHEAT1.107
ldebug = l_heat_dbg ! set by debug input control file FPHEAT1.108
FPHEAT1.109
!---------------------------------------------------------------------- FPHEAT1.110
! 1. start loop over validity times FPHEAT1.111
!---------------------------------------------------------------------- FPHEAT1.112
do ivt = 1, NoValidTimes FPHEAT1.113
FPHEAT1.114
IVTOffHr = IValidOffHr(ivt) FPHEAT1.115
IOutUnit = IOutUnitOff(ivt) + UnitHeatOut FPHEAT1.116
FPHEAT1.117
!---------------------------------------------------------------------- FPHEAT1.118
! 2. Read in net down short wave flux over open sea (band 1) FPHEAT1.119
!---------------------------------------------------------------------- FPHEAT1.120
l_leads = .true. ! set to use minleadsfrac FPHEAT1.121
call read_leads_flds
(StCSW1,StCAICE, FPHEAT1.122
# IVTOffHr, ldebug, FPHEAT1.123
# l_leads,Int_Head_SW1, FPHEAT1.124
# Real_Head_SW1, ncols, nrowst, FPHEAT1.125
# SW_radiation_band1, FPHEAT1.126
*CALL ARGPPX
FPHEAT1.127
# icode) FPHEAT1.128
FPHEAT1.129
if ( icode .gt. 0 ) then FPHEAT1.130
write(UnErr,*)CErr,CSub, FPHEAT1.131
# ' step 2. unable to read SW Radiation Flux (band 1)' FPHEAT1.132
icode = 1001 FPHEAT1.133
go to 9999 FPHEAT1.134
end if FPHEAT1.135
FPHEAT1.136
! 2.2 Write out solar radiation FPHEAT1.137
call write_one_field
( FPHEAT1.138
*CALL AFIELDS
FPHEAT1.139
# OutStCSOL, FFSOL, PPSOL, IVTOffHr, FPHEAT1.140
# Int_Head_SW1, Real_Head_SW1, IOutUnit, FPHEAT1.141
# ldebug, ITGrid, nrowst, FPHEAT1.142
# SW_radiation_band1, icode) FPHEAT1.143
if ( icode .gt. 0 ) then FPHEAT1.144
write(UnErr,*)CErr,CSub, FPHEAT1.145
# ' step 2. unable to write penetrating ' FPHEAT1.146
# ,'solar radiation (SOL)' FPHEAT1.147
icode = 1101 FPHEAT1.148
go to 9999 FPHEAT1.149
end if FPHEAT1.150
FPHEAT1.151
!---------------------------------------------------------------------- FPHEAT1.152
! 3. Read in fields to calculate net non penetrating heat FPHEAT1.153
!---------------------------------------------------------------------- FPHEAT1.154
! 3.1 Read net down short wave readiation FPHEAT1.155
call read_leads_flds
(StCSW,StCAICE, FPHEAT1.156
# IVTOffHr, ldebug, FPHEAT1.157
# l_leads,Int_Head_SW, FPHEAT1.158
# Real_Head_SW, ncols, nrowst, FPHEAT1.159
# SW_radiation, FPHEAT1.160
*CALL ARGPPX
FPHEAT1.161
# icode) FPHEAT1.162
FPHEAT1.163
if ( icode .gt. 0 ) then FPHEAT1.164
write(UnErr,*)CErr,CSub, FPHEAT1.165
# ' step 3. unable to read SW Radiation Flux' FPHEAT1.166
icode = 1002 FPHEAT1.167
go to 9999 FPHEAT1.168
end if FPHEAT1.169
! 3.2 Use Field Sub to work out first component of HTN FPHEAT1.170
call FieldSub
(ncols, nrowst, rmdi, FPHEAT1.171
# SW_radiation, SW_radiation_band1, FPHEAT1.172
# fieldint, FPHEAT1.173
# icode, cmessage) FPHEAT1.174
! 3.3 Read net down long wave flux FPHEAT1.175
call read_leads_flds
(StCLongWave,StCAICE, FPHEAT1.176
# IVTOffHr, ldebug, FPHEAT1.177
# l_leads,Int_Head_LW, FPHEAT1.178
# Real_Head_LW, ncols, nrowst, FPHEAT1.179
# LW_radiation, FPHEAT1.180
*CALL ARGPPX
FPHEAT1.181
# icode) FPHEAT1.182
FPHEAT1.183
if ( icode .gt. 0 ) then FPHEAT1.184
write(UnErr,*)CErr,CSub, FPHEAT1.185
# ' step 3. unable to read LW Radiation Flux' FPHEAT1.186
icode = 1003 FPHEAT1.187
go to 9999 FPHEAT1.188
end if FPHEAT1.189
FPHEAT1.190
! 3.4 Use FieldAdd to do HTN = fieldint + LW_radiation FPHEAT1.191
call FieldAdd
(ncols, nrowst, rmdi, FPHEAT1.192
# fieldint, LW_radiation, FPHEAT1.193
# non_pen_heat, FPHEAT1.194
# icode, cmessage) FPHEAT1.195
FPHEAT1.196
! 3.5 Read evaporation from sea FPHEAT1.197
call read_leads_flds
(StCEvaporation,StCAICE, FPHEAT1.198
# IVTOffHr, ldebug, FPHEAT1.199
# l_leads,Int_Head_EVAP, FPHEAT1.200
# Real_Head_EVAP, ncols, nrowst, FPHEAT1.201
# evaporation, FPHEAT1.202
*CALL ARGPPX
FPHEAT1.203
# icode) FPHEAT1.204
FPHEAT1.205
if ( icode .gt. 0 ) then FPHEAT1.206
write(UnErr,*)CErr,CSub, FPHEAT1.207
# ' step 3. unable to read evaporation from sea' FPHEAT1.208
icode = 1004 FPHEAT1.209
go to 9999 FPHEAT1.210
end if FPHEAT1.211
FPHEAT1.212
! 3.6 Use ScalarMult and FieldSub to work out latent heat FPHEAT1.213
! and subtract it from HTN FPHEAT1.214
call ScalarMult
(ncols, nrowst, rmdi, FPHEAT1.215
# lhevap, evaporation, FPHEAT1.216
# latent_heat, FPHEAT1.217
# icode, cmessage) FPHEAT1.218
call FieldSub
(ncols, nrowst, rmdi, FPHEAT1.219
# non_pen_heat, latent_heat, FPHEAT1.220
# fieldint, FPHEAT1.221
# icode, cmessage) FPHEAT1.222
FPHEAT1.223
! 3.7 Read Sensible Heat Flux FPHEAT1.224
call read_leads_flds
(StCSensibleHeat,StCAICE, FPHEAT1.225
# IVTOffHr, ldebug, FPHEAT1.226
# l_leads,Int_Head_SH, FPHEAT1.227
# Real_Head_SH, ncols, nrowst, FPHEAT1.228
# sensible_heat, FPHEAT1.229
*CALL ARGPPX
FPHEAT1.230
# icode) FPHEAT1.231
FPHEAT1.232
if ( icode .gt. 0 ) then FPHEAT1.233
write(UnErr,*)CErr,CSub, FPHEAT1.234
# ' step 3. unable to read sensible heat flux' FPHEAT1.235
icode = 1005 FPHEAT1.236
go to 9999 FPHEAT1.237
end if FPHEAT1.238
FPHEAT1.239
! 3.8 Use FieldSub to calculate final HTN FPHEAT1.240
call FieldSub
(ncols, nrowst, rmdi, FPHEAT1.241
# fieldint, sensible_heat, FPHEAT1.242
# non_pen_heat, FPHEAT1.243
# icode, cmessage) FPHEAT1.244
FPHEAT1.245
! 3.9 Write out net non penetrating heat FPHEAT1.246
call write_one_field
( FPHEAT1.247
*CALL AFIELDS
FPHEAT1.248
# OutStCHTN, FFHTN, PPHTN, IVTOffHr, FPHEAT1.249
# Int_Head_SH, Real_Head_SH, IOutUnit, FPHEAT1.250
# ldebug, ITGrid, nrowst, FPHEAT1.251
# non_pen_heat, icode) FPHEAT1.252
if ( icode .gt. 0 ) then FPHEAT1.253
write(UnErr,*)CErr,CSub, FPHEAT1.254
# ' step 3. unable to write net non penetrating heat' FPHEAT1.255
icode = 1102 FPHEAT1.256
go to 9999 FPHEAT1.257
end if FPHEAT1.258
FPHEAT1.259
!---------------------------------------------------------------------- FPHEAT1.260
! 4. end loop over validity times FPHEAT1.261
!---------------------------------------------------------------------- FPHEAT1.262
enddo ! ivt FPHEAT1.263
FPHEAT1.264
9999 continue FPHEAT1.265
return FPHEAT1.266
end FPHEAT1.267
!---------------------------------------------------------------------- FPHEAT1.268
*ENDIF FPHEAT1.269