*IF DEF,CAMDUMP PRINTCAM.2
C ******************************COPYRIGHT****************************** PRINTCAM.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. PRINTCAM.4
C PRINTCAM.5
C Use, duplication or disclosure of this code is subject to the PRINTCAM.6
C restrictions as set forth in the contract. PRINTCAM.7
C PRINTCAM.8
C Meteorological Office PRINTCAM.9
C London Road PRINTCAM.10
C BRACKNELL PRINTCAM.11
C Berkshire UK PRINTCAM.12
C RG12 2SZ PRINTCAM.13
C PRINTCAM.14
C If no contract has been raised with this copy of the code, the use, PRINTCAM.15
C duplication or disclosure of it is strictly prohibited. Permission PRINTCAM.16
C to do so must first be obtained in writing from the Head of Numerical PRINTCAM.17
C Modelling at the above address. PRINTCAM.18
C ******************************COPYRIGHT****************************** PRINTCAM.19
C PRINTCAM.20
CLL SUBROUTINE PRINTCAM-------------------------------------------- PRINTCAM.21
CLL PRINTCAM.22
CLL Purpose: Prints out pp header to unit 7 for use with camelot PRINTCAM.23
CLL PP field database in Climate Research Division. PRINTCAM.24
CLL PRINTCAM.25
CLL Written by: A. Brady (based on code by SFB Tett.) PRINTCAM.26
CLL PRINTCAM.27
CLL Model Modification history: PRINTCAM.28
CLL version Date PRINTCAM.29
CLL 4.3 20/03/97 Original deck introduced. Subroutines copied from PRINTCAM.30
CLL CAMDUMP1(4.2). A Brady. PRINTCAM.31
CLL PRINTCAM.32
CLL ----------------------------------------------------------------- PRINTCAM.33
SUBROUTINE PRINTCAM(ihdr,rhdr,nint,nreal,k,nftout,err,cmessage) 1,2PRINTCAM.34
PRINTCAM.35
IMPLICIT NONE PRINTCAM.36
PRINTCAM.37
INTEGER PRINTCAM.38
& nreal ! IN no of real words PRINTCAM.39
& ,nint ! IN no of integer words PRINTCAM.40
& ,ihdr(nint) ! IN integer part of header PRINTCAM.41
& ,k ! Position of record in file PRINTCAM.42
& ,nftout ! Output file unit no PRINTCAM.43
INTEGER err ! error code PRINTCAM.44
CHARACTER*40 CMESSAGE ! error message PRINTCAM.45
PRINTCAM.46
REAL PRINTCAM.47
& RHDR(NREAL) !IN real header PRINTCAM.48
PRINTCAM.49
external julday PRINTCAM.50
integer julday PRINTCAM.51
PRINTCAM.52
C*---------------------------------------------------------------------- PRINTCAM.53
C*L Local variables:--------------------------------------------------- PRINTCAM.54
PRINTCAM.55
integer lrec ! the record length PRINTCAM.56
integer ibb ! code for the type of calendar PRINTCAM.57
real PRINTCAM.58
& stime, ! the start time in "julian" days PRINTCAM.59
& etime, ! the end time in "julian" days PRINTCAM.60
& ltime, ! the processing period. PRINTCAM.61
& z ! the vertical co-ordinate PRINTCAM.62
PRINTCAM.63
C*---------------------------------------------------------------------- PRINTCAM.64
PRINTCAM.65
CL 1. Print out integer and real header. PRINTCAM.66
Cl The words that we need from the header are as follows: PRINTCAM.67
CL LBYR integer 1 \ PRINTCAM.68
CL LBMON integer 2 \ PRINTCAM.69
CL LBDAT integer 3 - forms stime (julian days) PRINTCAM.70
CL LBHR integer 4 / PRINTCAM.71
CL LBMIN integer 5 / PRINTCAM.72
PRINTCAM.73
CL LBYRD integer 7 \ PRINTCAM.74
CL LBMOND integer 8 \ PRINTCAM.75
CL LBDATD integer 9 - forms etime (julian days) PRINTCAM.76
CL LBHRD integer 10 / PRINTCAM.77
CL LBMIND integer 1 / PRINTCAM.78
PRINTCAM.79
CL lBTim integer 13 PRINTCAM.80
CL LBLREC lbrow*lbnpt+lbext (integer 20) PRINTCAM.81
CL lbcode integer 16 PRINTCAM.82
PRINTCAM.83
CL lbhem integer 17 PRINTCAM.84
CL LBROW integer 18 PRINTCAM.85
CL LBNPT integer 19 PRINTCAM.86
PRINTCAM.87
CL LBFC integer 23 PRINTCAM.88
CL LBCFC integer 24 PRINTCAM.89
CL LBPROC integer 25 PRINTCAM.90
PRINTCAM.91
CL LBVC integer 26 PRINTCAM.92
CL LBRVC integer 27 PRINTCAM.93
PRINTCAM.94
CL LBLEV integer 33 PRINTCAM.95
PRINTCAM.96
CL lbsrce integer 38 PRINTCAM.97
CL LBUSER(4) -- stash integer 42 PRINTCAM.98
CL LBUSER(5) -- pseudolevel integer 43 PRINTCAM.99
PRINTCAM.100
CL brsvd(1) -- bulev real 46 PRINTCAM.101
CL brsvd(2) -- bhlev real 47 PRINTCAM.102
PRINTCAM.103
CL bdataum real 50 PRINTCAM.104
CL bacc real 51 PRINTCAM.105
PRINTCAM.106
CL BLEV real 52 PRINTCAM.107
CL BRLEV real 53 PRINTCAM.108
CL BHLEV real 54 PRINTCAM.109
CL BHRLEV real 55 PRINTCAM.110
PRINTCAM.111
CL bplat real 56 PRINTCAM.112
CL bplon real 57 PRINTCAM.113
PRINTCAM.114
CL BGOR real 58 PRINTCAM.115
Cl BZY real 59 PRINTCAM.116
CL BDY real 60 PRINTCAM.117
CL BZX real 61 PRINTCAM.118
CL BDX real 62 PRINTCAM.119
PRINTCAM.120
CL BMDI real 64 PRINTCAM.121
err=0 ! no errors (yet) PRINTCAM.122
lrec=ihdr(18)*ihdr(19) PRINTCAM.123
if (ihdr(20).gt.0) then PRINTCAM.124
lrec=lrec+ihdr(20) PRINTCAM.125
endif PRINTCAM.126
PRINTCAM.127
C ============================================================ PRINTCAM.128
C compute derived functions PRINTCAM.129
C ============================================================ PRINTCAM.130
ibb=mod(ihdr(13)/10,10) PRINTCAM.131
PRINTCAM.132
if (mod(ihdr(13),10).eq.1) then ! use julian calendar PRINTCAM.133
stime=julday
(ihdr(1),ihdr(2),ihdr(3),err,cmessage)*1.0 PRINTCAM.134
if (err.ne.0) return ! got an error so return to calling rout PRINTCAM.135
etime=julday
(ihdr(7),ihdr(8),ihdr(9),err,cmessage)*1.0 PRINTCAM.136
if (err.ne.0) return ! got an error so return to calling rout PRINTCAM.137
else ! use model 360 day calendar PRINTCAM.138
stime=(ihdr(1)*12.0+(ihdr(2)-1))*30.0+(ihdr(3)-1) PRINTCAM.139
etime=(ihdr(7)*12.0+(ihdr(8)-1))*30.0+(ihdr(9)-1) PRINTCAM.140
endif PRINTCAM.141
stime=stime+(ihdr(4)+ihdr(5)/60.0)/24.0 ! fractional day PRINTCAM.142
etime=etime+(ihdr(10)+ihdr(11)/60.0)/24.0 ! fractional day PRINTCAM.143
if (ibb.eq.2.or.ibb.eq.3) then PRINTCAM.144
ltime=etime-stime PRINTCAM.145
else PRINTCAM.146
ltime=0 PRINTCAM.147
endif PRINTCAM.148
PRINTCAM.149
CLL ============================================================ PRINTCAM.150
CLL Calculate the physical vertical coordinate PRINTCAM.151
CLL ============================================================ PRINTCAM.152
if (ihdr(26).eq.9) then PRINTCAM.153
z=rhdr(54)/1e5+rhdr(52) PRINTCAM.154
else PRINTCAM.155
z=rhdr(52) PRINTCAM.156
endif PRINTCAM.157
PRINTCAM.158
write(nftout,1000) PRINTCAM.159
& k,ihdr(45), ! record pos, model_code PRINTCAM.160
& stime,ltime,etime,z, ! s,l,e times, vert coord PRINTCAM.161
& ihdr(13),lrec,ihdr(16), ! lbtim,lblrec,lcode PRINTCAM.162
& ihdr(17),ihdr(18),ihdr(19), ! lbhem,lbrow,lbnpt PRINTCAM.163
& ihdr(23),ihdr(24),ihdr(25), ! lbfc,lbcfc,lbproc PRINTCAM.164
& ihdr(26),ihdr(27), ! lbvc,lbrvc PRINTCAM.165
& ihdr(33), ! lblev PRINTCAM.166
& ihdr(38),ihdr(42),ihdr(43), ! lbsrce,stash, pseudolevel PRINTCAM.167
& rhdr(46),rhdr(47), ! brsvd(1-2) (bulev,bhlev) PRINTCAM.168
& rhdr(50),rhdr(51), ! bdatum,bacc PRINTCAM.169
& rhdr(52),rhdr(53),rhdr(54),rhdr(55), ! blev,brlev,bhlev,bhrlev PRINTCAM.170
& rhdr(56),rhdr(57),rhdr(58), ! bplat,bplon bgor PRINTCAM.171
& rhdr(59),rhdr(60),rhdr(61),rhdr(62), ! bzy,bdy,bzx,bdx PRINTCAM.172
& rhdr(64) ! bmks PRINTCAM.173
PRINTCAM.174
1000 format(i10,1(":",i10),4(":",e20.13),15(":",i10),16(":",e13.6)) PRINTCAM.175
PRINTCAM.176
RETURN PRINTCAM.177
END PRINTCAM.178
PRINTCAM.179
integer function julday(year,month,day,err,cmessage) 2PRINTCAM.180
implicit none PRINTCAM.181
CLL PRINTCAM.182
CLL Purpose: computes julian day for a given year, month and day PRINTCAM.183
CLL Uses same algorithm as that shown In Numerical Recipes for Fortran PRINTCAM.184
PRINTCAM.185
CLL ============================================================ PRINTCAM.186
CLL Input arguments PRINTCAM.187
CLL PRINTCAM.188
integer year ! year PRINTCAM.189
integer month ! month PRINTCAM.190
integer day ! day of month PRINTCAM.191
integer err ! error code PRINTCAM.192
character*40 cmessage ! error message PRINTCAM.193
CLL ============================================================ PRINTCAM.194
CLL Local values PRINTCAM.195
CLL ============================================================ PRINTCAM.196
integer lyear ! local year PRINTCAM.197
integer ja ! scratch variable PRINTCAM.198
integer jyear,jmonth ! julain year and month PRINTCAM.199
integer igreg ! what day was the gregorian calendar ad PRINTCAM.200
parameter (igreg=15+31*(10+12*1582)) ! 15/10/1592 PRINTCAM.201
if (year.eq.0) then PRINTCAM.202
cmessage='There is no year 0' PRINTCAM.203
err=1 PRINTCAM.204
return PRINTCAM.205
endif PRINTCAM.206
if (year.lt.0) then PRINTCAM.207
lyear=year+1 PRINTCAM.208
else PRINTCAM.209
lyear=year PRINTCAM.210
endif PRINTCAM.211
if (month.gt.2) then PRINTCAM.212
jyear=lyear PRINTCAM.213
jmonth=month+1 PRINTCAM.214
else PRINTCAM.215
jyear=year-1 PRINTCAM.216
jmonth=month+13 PRINTCAM.217
endif PRINTCAM.218
julday=int(365.25*jyear)+int(30.6001*jmonth)+day+172995 PRINTCAM.219
if (day+31*(month+12*lyear).ge.igreg) then ! use gregorian calenda PRINTCAM.220
ja=int(0.01*jyear) PRINTCAM.221
julday=julday+2-ja+int(0.25*ja) PRINTCAM.222
endif PRINTCAM.223
return PRINTCAM.224
end PRINTCAM.225
*ENDIF PRINTCAM.226