*IF DEF,W06_1A WTRAIN.2
! WTRAIN.3
! Description: WTRAIN.4
! This subroutine is part of the wavetrain diagnostic output code WTRAIN.5
! developed by Anne Guillaume at MeteoFrance and ECMWF. WTRAIN.6
! Introduced into the unified wave moel at UM4.1 WTRAIN.7
! WTRAIN.8
! Method: WTRAIN.9
! WTRAIN.10
! WTRAIN.11
! WTRAIN.12
! Current Code Owner: Martin Holt WTRAIN.13
! WTRAIN.14
! History: WTRAIN.15
! Version Date Comment WTRAIN.16
! ------- ---- ------- WTRAIN.17
! UM4.1 June 1996 Code introduced to UM. M Holt WTRAIN.18
! WTRAIN.19
! Code Description: WTRAIN.20
! Language: FORTRAN 77 + common extensions. WTRAIN.21
! WTRAIN.22
!- End of header WTRAIN.23
WTRAIN.24
SUBROUTINE WTRAIN(PSPEC,KBLO,KJS,KJL,KANG,KFRE,PFWIND, 1,7WTRAIN.25
% PDWIND, WTRAIN.26
% PFREQ,PFBIN,PTHETA,PRES,KDANG,PDMAX, WTRAIN.27
% PECUT,PEMINR,PEMAXR,PDTMIN,KWTMAX, WTRAIN.28
% PMISS,PSWH,PERIO,PDIR,KWTOT WTRAIN.29
% ,KFLAGWS,PMCOEF,KREOSP,KWTRA,df WTRAIN.30
% ) WTRAIN.31
C WTRAIN.32
C**** *WTRAIN* - FIND WAVE TRAINS AND COMPUTE INTEGRATED PARAMETERS. WTRAIN.33
C WTRAIN.34
C A.GUILLAUME ECMWF 02/07/92 WTRAIN.35
C A.GUILLAUME ECMWF save memory space 2/94 WTRAIN.36
C M.Holt UKMO included array DF - use in calculation of WTRAIN.37
C spectral integrated parameters (ukmo freqs) WTRAIN.38
C WTRAIN.39
C* PURPOSE. WTRAIN.40
C -------- WTRAIN.41
C WTRAIN.42
C FIND WAVE TRAINS. WTRAIN.43
C WTRAIN.44
C** INTERFACE. WTRAIN.45
C ---------- WTRAIN.46
C WTRAIN.47
C *CALL* *WTRAIN(PSPEC,KBLO,KJS,KJL,KANG,KFRE,PFWIND,PDWIND, WTRAIN.48
C PFREQ,PFBIN,PTHETA,PRES,KDANG,PDMAX,PECUT, WTRAIN.49
C PEMINR,PEMAXR,PDTMIN,KWTMAX,PSWH,PERIO,PDIR, WTRAIN.50
C KWTOT,KFLAGWS,PMCOEF,KREOSP,KWTRA,df) WTRAIN.51
C WTRAIN.52
C I/ *PSPEC* - SPECTRUM. WTRAIN.53
C I/ *KBLO* - DIMENSION OF ONE BLOCK. WTRAIN.54
C I/ *KJS* - INDEX OF FIRST POINT OF BLOCK TO USE. WTRAIN.55
C I/ *KJL* - INDEX OF LAST POINT OF BLOCK TO USE. WTRAIN.56
C I/ *KANG* - NUMBER OF DIRECTIONS. WTRAIN.57
C I/ *KFRE* - NUMBER OF FREQUENCIES. WTRAIN.58
C I/ *PFWIND* - WIND SPEED WTRAIN.59
C I/ *PDWIND* - WIND DIRECTION (IN RADIAN) WTRAIN.60
C I/ *PFREQ* - FREQUENCY MATRIX. WTRAIN.61
C I/ *PFBIN* - PFREQ(IF+1)=PFREQ(IF)*(1+PFBIN) WTRAIN.62
C I/ *PTHETA* - DIRECTION MATRIX (RADIAN) WTRAIN.63
C I/ *PRES* - INTERPOLLATION PRECISION (TYPICALLY PRES=1000.) WTRAIN.64
C I/ *KDANG* - MAX NUMBER OF DIRECTIONS IN SPREADING OF THE WT WTRAIN.65
C (TYPICALLY TO ACHIEVE 60DEG, KDANG=2 WHEN WTRAIN.66
C KANG=12) WTRAIN.67
C I/ *PDMAX* - MAX ANGULAR DISTANCE BETWEEN WIND AND WINDSEA. WTRAIN.68
C (TYPICALLY PI/3) WTRAIN.69
C I/ *PECUT* - WAVE TRAINS WITH ENERGY LESS THAN PECUT*ETOT WTRAIN.70
C ARE DISCARDED AT THE END(TYPICALLY, 0.04) WTRAIN.71
C I/ *PEMINR* - FOR MERGING WAVE TRAINS WITH CLOSE PERIODS WTRAIN.72
C (TYPICALLY 1./(1.+3.*PFBIN) ) WTRAIN.73
C I/ *PEMAXR* - FOR MERGING WAVE TRAINS WITH CLOSE PERIODS WTRAIN.74
C (TYPICALLY (1.+3.*PFBIN) ) WTRAIN.75
C I/ *PDTMIN* - FOR MERGING WAVE TRAINS WITH CLOSE DIRECTIONS WTRAIN.76
C (TYPICALLY PI/4) WTRAIN.77
C I/ *KWTMAX* - MAX NB OF WAVE TRAINS (TYPICALLY 5) WTRAIN.78
C I/ *PMISS* - MISSING VALUE, SHOULD BE NEGATIVE. WTRAIN.79
C /O *PSWH* - SWH OF WAVE TRAINS. WTRAIN.80
C /O *PERIO* - MEAN PERIOD OF WAVE TRAINS. WTRAIN.81
C /O *PDIR* - MEAN DIRECTION OF WAVE TRAINS. WTRAIN.82
C /O *KWTOT* - FINAL NB OF WAVE TRAINS WTRAIN.83
C I/ *KFLAGWS* - FLAG VALUE TO ISOLATE WINDSEA WTRAIN.84
C (DONE IF KFLAGWS.EQ.1,MUST BE SET TO 0 OTHERWISE,TO SAVE MEMORY SPACE) WTRAIN.85
C I/ *PMCOEF* - TUNING FACTOR FOR FINDING WINDSEA (0.9, 0.8..) WTRAIN.86
C I/ *KREOSP* - FLAG VALUE TO REORGANIZE WAVE TRAIN INDEX MATRIX WTRAIN.87
C DONE IF KREOSP=1 WTRAIN.88
C NOTE there are calls to wtreorg with KREOSP=1 WTRAIN.89
C hard wired in the arg list WTRAIN.90
C /O *KWTRA* - WAVE TRAIN INDEX MATRIX (ONLY USEFUL LATER IF KREOSP=1) WTRAIN.91
C I/ *df* - array of frequency intervals (ie as for UKMO) WTRAIN.92
C WTRAIN.93
C METHOD. WTRAIN.94
C ------- WTRAIN.95
C WTRAIN.96
C NONE. WTRAIN.97
C WTRAIN.98
C EXTERNALS. WTRAIN.99
C ---------- WTRAIN.100
C WTRAIN.101
C FINDPIC WTRAIN.102
C TRHOU WTRAIN.103
C VAGDIRT WTRAIN.104
C VTOTT WTRAIN.105
C WTRAIN1 WTRAIN.106
C WTRAIN2 WTRAIN.107
C WTRAIN.108
C REFERENCE. WTRAIN.109
C ---------- WTRAIN.110
C WTRAIN.111
C NONE. WTRAIN.112
C WTRAIN.113
DIMENSION PFREQ(KFRE),df(kfre),PTHETA(KANG) WTRAIN.114
DIMENSION PSPEC(KBLO,KANG,KFRE) WTRAIN.115
DIMENSION KWTRA(KJL-KJS+1,KANG,KFRE) WTRAIN.116
DIMENSION PFWIND(1),PDWIND(1),KWTOT(KBLO) WTRAIN.117
DIMENSION PSWH(KBLO,KWTMAX), WTRAIN.118
% PDIR(KBLO,KWTMAX),PERIO(KBLO,KWTMAX) WTRAIN.119
C WORKING ARRAYS : WTRAIN.120
C *ZETOF* - 1)TOTAL ENERGY 2)MIN ENERGY TO DISCARD WT WTRAIN.121
C *ZWORK* - WTRAIN.122
C WTRAIN.123
DIMENSION ZETOF(KBLO) WTRAIN.124
DIMENSION ZWORK(KJL-KJS+1,KANG,KFRE) WTRAIN.125
C WTRAIN.126
C* *PARAMETER* OF GLOBAL CONSTANTS. WTRAIN.127
C WTRAIN.128
CCC PARAMETER (G = 9.806, PI = 3.14159265358978, CIRC = 40000000., WTRAIN.129
CCC 1 ZPI = 2.*PI, RAD = PI/180., DEG = 180./PI, WTRAIN.130
CCC 2 R = CIRC/ZPI) WTRAIN.131
WTRAIN.132
*CALL C_G
WTRAIN.133
*CALL C_PI
WTRAIN.134
WTRAIN.135
C WTRAIN.136
C..FUNCION IN LINE WTRAIN.137
IDELTA(I,J)=(ISIGN(1,I-J)+ISIGN(1,J-I))/2 WTRAIN.138
XPI=2.*PI/FLOAT(KANG) WTRAIN.139
C WTRAIN.140
C --------------------------------------------------------------- WTRAIN.141
C WTRAIN.142
ZPI=2.*PI WTRAIN.143
RAD=PI_OVER_180 WTRAIN.144
DEG=RECIP_PI_OVER_180 WTRAIN.145
C* 0. INITIALIZE KWTOT. WTRAIN.146
C ----------------- WTRAIN.147
C WTRAIN.148
DO 10 J=KJS,KJL WTRAIN.149
KWTOT(J)=KWTMAX WTRAIN.150
10 CONTINUE WTRAIN.151
C WTRAIN.152
C --------------------------------------------------------------- WTRAIN.153
C WTRAIN.154
C* 1. COMPUTE TOTAL ENERGY. WTRAIN.155
C --------------------- WTRAIN.156
C WTRAIN.157
c array zetof holds the gridpoint energy scaled by pecut. this array WTRAIN.158
c is passed into regroup and used as array pemin WTRAIN.159
c WTRAIN.160
100 CONTINUE WTRAIN.161
WTRAIN.162
CALL VTOTT
(PSPEC,KBLO,KJS,KJL,KANG,KFRE,PFREQ,PFBIN,ZETOF,df) WTRAIN.163
DO 101 J=KJS,KJL WTRAIN.164
ZETOF(J)=PECUT*ZETOF(J) WTRAIN.165
101 CONTINUE WTRAIN.166
C WTRAIN.167
C --------------------------------------------------------------- WTRAIN.168
C WTRAIN.169
C* 2. FIND WAVE TRAINS. WTRAIN.170
C ---------------- WTRAIN.171
C WTRAIN.172
200 CONTINUE WTRAIN.173
CALL WTRAIN2
(PSPEC,KBLO,KJS,KJL,KANG,KFRE,PRES,KDANG, WTRAIN.174
% KWTRA,KWTMAX-1) WTRAIN.175
CAG PRINT*,'AFTER WTRAIN2' WTRAIN.176
CAG PRINT 201,KWTRA WTRAIN.177
201 FORMAT('KWTRA AFTER WTRAIN2',/,(24I2)) WTRAIN.178
C WTRAIN.179
C --------------------------------------------------------------- WTRAIN.180
C WTRAIN.181
C* 3. COMPUTE INTEGRATED PARAMETERS AND WTRAIN.182
C CLASSIFY WT.SPECTRA BY PERIOD. WTRAIN.183
C ------------------------------ WTRAIN.184
C WTRAIN.185
300 CONTINUE WTRAIN.186
DO 301 IWT=1,KWTMAX WTRAIN.187
DO 311 JFRE=1,KFRE WTRAIN.188
DO 311 JANG=1,KANG WTRAIN.189
DO 311 J=KJS,KJL WTRAIN.190
ZWORK(J-KJS+1,JANG,JFRE)= WTRAIN.191
% PSPEC(J,JANG,JFRE)*IDELTA(KWTRA(J-KJS+1,JANG,JFRE),IWT) WTRAIN.192
311 CONTINUE WTRAIN.193
CALL VINTPAR
(ZWORK,PSWH(KJS,IWT),PERIO(KJS,IWT), WTRAIN.194
% PDIR(KJS,IWT),KJL-KJS+1,1,KJL-KJS+1,KANG,KFRE, WTRAIN.195
% PFREQ,PFBIN,PTHETA,PMISS,df) WTRAIN.196
301 CONTINUE WTRAIN.197
CAG PRINT*,'BEFORE WTREORG' WTRAIN.198
CAG PRINT 312,PERIO,PSWH,PDIR WTRAIN.199
312 FORMAT('PERIO =',5F9.2,/,'PSWH =',5F9.2,/,'PDIR =',5F9.2,/) WTRAIN.200
C WTRAIN.201
CCMH note the hardwired arguments here WTRAIN.202
c WTRAIN.203
CALL WTREORG
(PERIO,PSWH,PDIR,KBLO,KJS,KJL, WTRAIN.204
% KWTMAX-1,KWTOT,PFWIND,PDWIND,0.,PMISS, WTRAIN.205
% 0,1.,1,KANG,KFRE,KWTRA) WTRAIN.206
C WTRAIN.207
CAG PRINT*,'AFTER WTREORG PERIOD' WTRAIN.208
CAG PRINT 312,PERIO,PSWH,PDIR WTRAIN.209
CAG PRINT 321,KWTRA WTRAIN.210
321 FORMAT('KWTRA AFTER WTREORG',/,(24I2)) WTRAIN.211
C WTRAIN.212
C --------------------------------------------------------------- WTRAIN.213
C WTRAIN.214
C* 4. REDUCE NB WAVE TRAINS BY MERGING CLOSE ONES. WTRAIN.215
C ------------------------------------------- WTRAIN.216
C WTRAIN.217
400 CONTINUE WTRAIN.218
ccc print*,'before calling regroup aray pfreq kfre' WTRAIN.219
ccc print*,kfre,pfreq WTRAIN.220
CALL REGROUP
(PSPEC,KWTRA,PSWH,PERIO,PDIR,KBLO,KJS,KJL, WTRAIN.221
% KANG,KFRE,KWTMAX-1,KWTOT, WTRAIN.222
% PEMINR,PEMAXR,PDTMIN,PFREQ,PFBIN,PTHETA, WTRAIN.223
% ZETOF,PMISS,df) WTRAIN.224
CAG PRINT*,'AFTER REGROUP' WTRAIN.225
CAG PRINT 312,PERIO,PSWH,PDIR WTRAIN.226
CAG PRINT 401,KWTRA WTRAIN.227
401 FORMAT('KWTRA AFTER REGROUP',/,(24I2)) WTRAIN.228
C WTRAIN.229
C --------------------------------------------------------------- WTRAIN.230
C WTRAIN.231
C* 5. COMPUTE SWH PSWH. WTRAIN.232
C ----------------- WTRAIN.233
C WTRAIN.234
500 CONTINUE WTRAIN.235
ccmh why kwtmax-1 ?? WTRAIN.236
DO 501 IWT=1,KWTMAX-1 WTRAIN.237
DO 501 J=KJS,KJL WTRAIN.238
ccmh PSWH(J,IWT)=4.004*SQRT(AMAX1(0.,PSWH(J,IWT)*XPI*PFBIN/2.)) WTRAIN.239
ccmh use this when peto is filled using UKMO df() in vTOTT ? WTRAIN.240
CCmh pswh is set with peto in the call to regroup / vintpar / vtott WTRAIN.241
PSWH(J,IWT)=4.004*SQRT(MAX(0.,PSWH(J,IWT)*XPI)) WTRAIN.242
501 CONTINUE WTRAIN.243
c WTRAIN.244
CAG PRINT*,'AFTER swh' WTRAIN.245
CAG PRINT 312,PERIO,PSWH,PDIR WTRAIN.246
C WTRAIN.247
C --------------------------------------------------------------- WTRAIN.248
C WTRAIN.249
C* 6. FIND WIND SEA AND CLASSE LES WT PAR PSWH DECROISSANTS. WTRAIN.250
C ----------------------------------------------------- WTRAIN.251
C WTRAIN.252
600 CONTINUE WTRAIN.253
CALL WTREORG
(PSWH,PERIO,PDIR,KBLO,KJS,KJL, WTRAIN.254
% KWTMAX,KWTOT,PFWIND,PDWIND,PDMAX,PMISS, WTRAIN.255
% 0,PMCOEF,KREOSP,KANG,KFRE,KWTRA) WTRAIN.256
C WTRAIN.257
ccmh but i have set kflagws to zero so could comment out these calls ? WTRAIN.258
CALL WTREORG
(PSWH,PERIO,PDIR,KBLO,KJS,KJL, WTRAIN.259
% KWTMAX,KWTOT,PFWIND,PDWIND,PDMAX,PMISS, WTRAIN.260
% KFLAGWS,PMCOEF,KREOSP,KANG,KFRE,KWTRA) WTRAIN.261
ccc PRINT*,'AFTER WTREORG WINDSEA' WTRAIN.262
ccc PRINT 312,PERIO,PSWH,PDIR WTRAIN.263
ccc PRINT 601,KWTRA WTRAIN.264
601 FORMAT('KWTRA AFTER WTREORG',/,(24I2)) WTRAIN.265
C WTRAIN.266
C --------------------------------------------------------------- WTRAIN.267
C WTRAIN.268
C* 7. CONVERT DIRECTION IN DEGREE. WTRAIN.269
C --------------------------- WTRAIN.270
C WTRAIN.271
700 CONTINUE WTRAIN.272
DO 701 IWT=1,KWTMAX WTRAIN.273
DO 701 J=KJS,KJL WTRAIN.274
C WTRAIN.275
c first convert to degrees in 0 to 360 WTRAIN.276
C WAM / UM convention is zero=north / incr clockwise WTRAIN.277
c WTRAIN.278
IF (PDIR(J,IWT).NE.PMISS)then WTRAIN.279
PDIR(J,IWT)=MOD(PDIR(J,IWT)*180./PI,360.) WTRAIN.280
ccc PDIR(J,IWT)=MOD(270. - PDIR(J,IWT),360.) WTRAIN.281
endif WTRAIN.282
701 CONTINUE WTRAIN.283
WTRAIN.284
RETURN WTRAIN.285
END WTRAIN.286
*ENDIF WTRAIN.287