*IF DEF,CONTROL,AND,DEF,OCEAN FORTXD1.2
C ******************************COPYRIGHT****************************** GTS2F400.3097
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.3098
C GTS2F400.3099
C Use, duplication or disclosure of this code is subject to the GTS2F400.3100
C restrictions as set forth in the contract. GTS2F400.3101
C GTS2F400.3102
C Meteorological Office GTS2F400.3103
C London Road GTS2F400.3104
C BRACKNELL GTS2F400.3105
C Berkshire UK GTS2F400.3106
C RG12 2SZ GTS2F400.3107
C GTS2F400.3108
C If no contract has been raised with this copy of the code, the use, GTS2F400.3109
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.3110
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.3111
C Modelling at the above address. GTS2F400.3112
C ******************************COPYRIGHT****************************** GTS2F400.3113
C GTS2F400.3114
CLL Routines: UMWRITE,UMREAD,UMRANCIL---------------------------------- OSI1F405.47
CLL FORTXD1.4
CLL Purpose: To transfer data between D1 and ocean model workspace. FORTXD1.5
CLL Tracers and currents are held in D1 for sea points only. FORTXD1.6
CLL Unpacking or packing is therefore required when transfering data FORTXD1.7
CLL to or from an ocean slab. This is controlled by indexes based on FORTXD1.8
CLL the TRACER topography. Thus a u,v mask needs to be set up to FORTXD1.9
CLL ensure all u,v land points are appropriately set either to zero in FORTXD1.10
CLL ocean workspace or RMDIs in D1. FORTXD1.11
CLL FORTXD1.12
CLL FORTXD1.18
CLL Tested under compiler: cft77 FORTXD1.19
CLL Tested under OS version: UNICOS 5.1 FORTXD1.20
CLL FORTXD1.21
CLL TJ, SI <- programmer of some or all of previous code or changes FORTXD1.22
CLL FORTXD1.23
CLL Model Modification history from model version 3.0: FORTXD1.24
CLL version Date FORTXD1.25
CLL 3.2 25/5/93 S Foreman: convert to dynamic allocation. @DYALLOC.904
CLL 3.4 26/8/94 R Hill : Remove redundant array "uv_mask" ORH4F304.1
CLL from UMREAD and UMWRITE. ORH4F304.2
CLL 4.5 02/9/97 C.G. Jones : Removed the subroutine UMLATRD OSI1F405.48
CLL FORTXD1.26
CLL Programming standard : FORTXD1.27
CLL FORTXD1.28
CLL Logical system components covered : F4 FORTXD1.29
CLL FORTXD1.30
CLL Project task: FORTXD1.31
CLL FORTXD1.32
CLL External documentation: FORTXD1.33
CLL FORTXD1.34
CLLEND----------------------------------------------------------------- FORTXD1.35
C*L Subruotine FORTXD1.36
FORTXD1.37
SUBROUTINE UMWRITE( 3,6@DYALLOC.905
*CALL ARGSIZE
@DYALLOC.906
*CALL ARGD1
@DYALLOC.907
*CALL ARGDUMO
@DYALLOC.908
*CALL ARGPTRO
@DYALLOC.909
& LU,NLOC,ARRAY ! ############################ @DYALLOC.910
&,NDISKB,NDISK,NDISKA,FKMP,FKMQ ) OSI0F402.20
C* FORTXD1.40
FORTXD1.41
IMPLICIT NONE FORTXD1.42
FORTXD1.43
CL Include COMDECKS FORTXD1.44
*CALL TYPSIZE
@DYALLOC.911
*CALL TYPDUMO
@DYALLOC.912
*CALL TYPD1
@DYALLOC.913
*CALL TYPPTRO
@DYALLOC.914
*CALL CNTLOCN
OSI0F402.21
*CALL C_MDI
FORTXD1.47
FORTXD1.48
C*L Type argument list FORTXD1.49
FORTXD1.50
INTEGER FORTXD1.51
& NLOC ! Row number FORTXD1.52
&,LU ! Disc unit number (if continuous IO) FORTXD1.53
&,NDISKB,NDISK,NDISKA ! 1,2 or 3 (if continuous IO). FORTXD1.54
REAL FORTXD1.55
& ARRAY((NT+2)*IMT*KM) ! Slab of data transfered to/from D1 FORTXD1.56
&,FKMP(IMT,JMT) ! Number of vertical levels at T points OSI0F402.22
&,FKMQ(IMT,JMT) ! Number of vertical levels at u,v points FORTXD1.57
C* FORTXD1.58
FORTXD1.59
C Local variables FORTXD1.60
FORTXD1.61
INTEGER FORTXD1.62
& t_pntr(NT),u_pntr,v_pntr ! pointers to t,u,v in slab ARRAY FORTXD1.63
&,MSB ! 1 if present t-step, 2 if t-step before of after present FORTXD1.64
&,LUM12 ! LU minus 12 FORTXD1.65
&,I,J,M,K,index ! local indexes OSI0F402.23
&,JDIM ! local dimension OSI0F402.24
&,n_levels(IMT) OSI0F402.25
REAL FORTXD1.69
& O_RMDI ! missing data indicator for fields FORTXD1.70
FORTXD1.71
C*L External subroutines called FORTXD1.72
FORTXD1.73
EXTERNAL FORTXD1.74
& PACK FORTXD1.75
C* FORTXD1.76
FORTXD1.77
CL Find out for which time level data is valid FORTXD1.78
C MSB=1 Data transfer for present time level FORTXD1.79
C MSB=2 Data transfer for timestep before or after present time level FORTXD1.80
FORTXD1.81
LUM12=LU-12 FORTXD1.82
IF(LUM12.EQ.NDISKB) MSB=2 FORTXD1.83
IF(LUM12.EQ.NDISK ) MSB=1 FORTXD1.84
IF(LUM12.EQ.NDISKA) MSB=2 FORTXD1.85
FORTXD1.86
CL Set ocean missing data indicator for fields held in dump FORTXD1.87
FORTXD1.88
O_RMDI=RMDI FORTXD1.89
FORTXD1.90
CL Set pointers to tracers and currents in slab FORTXD1.91
FORTXD1.92
DO M=1,NT FORTXD1.93
t_pntr(M)=1+IMT*KM*(M-1) FORTXD1.94
END DO FORTXD1.95
u_pntr=1+IMT*KM*NT FORTXD1.96
v_pntr=1+IMT*KM*(NT+1) FORTXD1.97
FORTXD1.98
CL Set land points to missing data indicator OSI0F402.26
OSI0F402.27
IF (.NOT.L_OCOMP) THEN OSI0F402.28
OSI0F402.29
DO I=1,IMT OSI0F402.30
n_levels(I)=FKMP(I,NLOC) OSI0F402.31
END DO OSI0F402.32
DO M=1,NT OSI0F402.33
DO K=1,KM OSI0F402.34
index=(K-1)*IMT-1 OSI0F402.35
DO I=1,IMT OSI0F402.36
IF (K.GT.n_levels(i)) THEN OSI0F402.37
ARRAY(t_pntr(M)+index+I)=O_RMDI OSI0F402.38
END IF OSI0F402.39
END DO OSI0F402.40
END DO OSI0F402.41
END DO OSI0F402.42
OSI0F402.43
ENDIF OSI0F402.44
OSI0F402.45
FORTXD1.100
DO I=1,IMT FORTXD1.101
n_levels(I)=FKMQ(I,NLOC) OSI0F402.46
END DO FORTXD1.103
DO K=1,KM FORTXD1.104
index=(K-1)*IMT-1 FORTXD1.105
DO I=1,IMT FORTXD1.106
IF (K.GT.n_levels(i)) THEN OSI0F402.47
ARRAY(u_pntr+index+I)=O_RMDI FORTXD1.108
ARRAY(v_pntr+index+I)=O_RMDI FORTXD1.109
END IF FORTXD1.110
END DO FORTXD1.111
END DO FORTXD1.112
FORTXD1.113
CL Transfer ARRAY slab of data to D1. Tracers,ucurrent,vcurrent. FORTXD1.114
FORTXD1.115
IF (L_OCOMP) THEN OSI0F402.48
OSI0F402.49
DO M=1,NT FORTXD1.116
CALL PACK
(0,NLOC,NLOC,1,KM,JMT,KM FORTXD1.117
&, IMT,1,KM,O_CFI1,O_CFI2,joc_no_segs FORTXD1.118
&, O_CFI3 FORTXD1.119
&, joc_no_seapts,D1(joc_tracer(M,MSB)),ARRAY(t_pntr(M)) FORTXD1.120
&, O_RMDI,CYCLIC_OCEAN) FORTXD1.121
END DO FORTXD1.122
FORTXD1.123
CALL PACK
(1,NLOC,NLOC,1,KM,JMT,KM FORTXD1.124
&,IMT,1,KM,O_CFI1,O_CFI2,joc_no_segs FORTXD1.125
&,O_CFI3 FORTXD1.126
&,joc_no_seapts,D1(joc_u(MSB)),ARRAY(u_pntr) FORTXD1.127
&,O_RMDI,CYCLIC_OCEAN) FORTXD1.128
FORTXD1.129
FORTXD1.130
CALL PACK
(1,NLOC,NLOC,1,KM,JMT,KM FORTXD1.131
&,IMT,1,KM,O_CFI1,O_CFI2,joc_no_segs FORTXD1.132
&,O_CFI3 FORTXD1.133
&,joc_no_seapts,D1(joc_v(MSB)),ARRAY(v_pntr) FORTXD1.134
&,O_RMDI,CYCLIC_OCEAN) FORTXD1.135
FORTXD1.136
ELSE OSI0F402.50
OSI0F402.51
*IF DEF,MPP OSI0F402.52
JDIM=JMT OSI0F402.53
*ELSE OSI0F402.54
JDIM=JMTM1 OSI0F402.55
*ENDIF OSI0F402.56
OSI0F402.57
DO M=1,NT OSI0F402.58
CALL OSLAB2D1
(1,IMT,NLOC,NLOC,1,KM,IMT,1,KM, IMT,JMT,KM, OSI0F402.59
& D1(joc_tracer(M,MSB)),ARRAY(t_pntr(M))) OSI0F402.60
ENDDO OSI0F402.61
OSI0F402.62
CALL OSLAB2D1
(1,IMT,NLOC,NLOC,1,KM,IMT,1,KM, IMT,JDIM,KM, OSI0F402.63
& D1(joc_u(MSB)),ARRAY(u_pntr)) OSI0F402.64
CALL OSLAB2D1
(1,IMT,NLOC,NLOC,1,KM,IMT,1,KM, IMT,JDIM,KM, OSI0F402.65
& D1(joc_v(MSB)),ARRAY(v_pntr)) OSI0F402.66
OSI0F402.67
ENDIF OSI0F402.68
OSI0F402.69
RETURN FORTXD1.137
END FORTXD1.138
FORTXD1.139
FORTXD1.140
C*L Subroutine FORTXD1.141
FORTXD1.142
SUBROUTINE UMREAD( 34,6@DYALLOC.915
*CALL ARGSIZE
@DYALLOC.916
*CALL ARGD1
@DYALLOC.917
*CALL ARGDUMO
@DYALLOC.918
*CALL ARGPTRO
@DYALLOC.919
& LU,NLOC,ARRAY ! ############################# @DYALLOC.920
&,NDISKB,NDISK,NDISKA,FKMP,FKMQ) OSI0F402.70
C* FORTXD1.145
FORTXD1.146
IMPLICIT NONE FORTXD1.147
FORTXD1.148
CL Include COMDECKS FORTXD1.149
*CALL TYPSIZE
@DYALLOC.921
*CALL TYPD1
@DYALLOC.922
*CALL TYPDUMO
@DYALLOC.923
*CALL TYPPTRO
@DYALLOC.924
*CALL CNTLOCN
OSI0F402.71
*CALL COCNINDX
OSI1F405.352
FORTXD1.153
C*L Type argument list FORTXD1.154
FORTXD1.155
INTEGER FORTXD1.156
& NLOC ! Row number FORTXD1.157
&,LU ! Disc unit number (if continuous IO) FORTXD1.158
&,NDISKB,NDISK,NDISKA ! 1,2 or 3 (if continuous IO). FORTXD1.159
REAL FORTXD1.160
& ARRAY((NT+2)*IMT*KM) ! Slab of data transfered to/from D1 FORTXD1.161
&,FKMP(IMT,JMT) ! Number of vertical levels at t points OSI0F402.72
&,FKMQ(IMT,JMT) ! Number of vertical levels at u,v points FORTXD1.162
C* FORTXD1.163
FORTXD1.164
C Local variables FORTXD1.165
FORTXD1.166
INTEGER FORTXD1.167
& t_pntr(NT),u_pntr,v_pntr ! pointers to t,u,v in slab ARRAY FORTXD1.168
&,MSB ! 1 if present t-step, 2 if t-step before of after present FORTXD1.169
&,LUM12 ! LU minus 12 FORTXD1.170
&,I,J,M,K,index ! local indexes OSI0F402.73
&,JDIM ! local dimension OSI0F402.74
&,n_levels(IMT) OSI0F402.75
REAL FORTXD1.173
& O_RMDI ! missing data indicator for fields FORTXD1.174
FORTXD1.176
C*L External subroutines called FORTXD1.177
FORTXD1.178
EXTERNAL FORTXD1.179
& UNPACK FORTXD1.180
C* FORTXD1.181
FORTXD1.182
CL Find out for which time level data is valid FORTXD1.183
C MSB=1 Data transfer for present time level FORTXD1.184
C MSB=2 Data transfer for timestep before or after present time level FORTXD1.185
FORTXD1.186
LUM12=LU-12 FORTXD1.187
IF(LUM12.EQ.NDISKB) MSB=2 FORTXD1.188
IF(LUM12.EQ.NDISK ) MSB=1 FORTXD1.189
IF(LUM12.EQ.NDISKA) MSB=2 FORTXD1.190
FORTXD1.191
CL Set pointers to tracers and currents in slab FORTXD1.192
FORTXD1.193
DO M=1,NT FORTXD1.194
t_pntr(M)=1+IMT*KM*(M-1) FORTXD1.195
END DO FORTXD1.196
u_pntr=1+IMT*KM*NT FORTXD1.197
v_pntr=1+IMT*KM*(NT+1) FORTXD1.198
FORTXD1.199
CL Transfer slabs of data from D1 to ARRAY. Tracers,ucurrent,vcurrent. FORTXD1.200
FORTXD1.201
IF (L_OCOMP) THEN OSI0F402.76
OSI0F402.77
DO M=1,NT FORTXD1.202
FORTXD1.203
IF(M.EQ.2) THEN FORTXD1.204
O_RMDI=0.01 FORTXD1.205
ELSE FORTXD1.206
O_RMDI=0.0 FORTXD1.207
END IF FORTXD1.208
FORTXD1.209
CALL UNPACK
(NLOC,NLOC,1,KM,JMT,KM FORTXD1.210
&, IMT,1,KM,O_CFI1,O_CFI2,joc_no_segs FORTXD1.211
&, O_CFI3 FORTXD1.212
&, joc_no_seapts,D1(joc_tracer(M,MSB)),ARRAY(t_pntr(M)) FORTXD1.213
&, O_RMDI,CYCLIC_OCEAN) FORTXD1.214
END DO FORTXD1.215
FORTXD1.216
O_RMDI=0.0 FORTXD1.217
FORTXD1.218
CALL UNPACK
(NLOC,NLOC,1,KM,JMT,KM FORTXD1.219
&,IMT,1,KM,O_CFI1,O_CFI2,joc_no_segs FORTXD1.220
&,O_CFI3 FORTXD1.221
&,joc_no_seapts,D1(joc_u(MSB)),ARRAY(u_pntr) FORTXD1.222
&,O_RMDI,CYCLIC_OCEAN) FORTXD1.223
FORTXD1.224
CALL UNPACK
(NLOC,NLOC,1,KM,JMT,KM FORTXD1.225
&,IMT,1,KM,O_CFI1,O_CFI2,joc_no_segs FORTXD1.226
&,O_CFI3 FORTXD1.227
&,joc_no_seapts,D1(joc_v(MSB)),ARRAY(v_pntr) FORTXD1.228
&,O_RMDI,CYCLIC_OCEAN) FORTXD1.229
OSI0F402.78
ELSE OSI0F402.79
OSI0F402.80
OSI0F402.81
*IF DEF,MPP OSI0F402.82
JDIM=JMT OSI0F402.83
*ELSE OSI0F402.84
JDIM=JMTM1 OSI0F402.85
*ENDIF OSI0F402.86
OSI0F402.87
DO M=1,NT OSI0F402.88
CALL OD12SLAB
(1,IMT,NLOC,NLOC,1,KM,IMT,1,KM, IMT,JMT,KM, OSI0F402.89
& D1(joc_tracer(M,MSB)),ARRAY(t_pntr(M))) OSI0F402.90
ENDDO OSI0F402.91
OSI0F402.92
CALL OD12SLAB
(1,IMT,NLOC,NLOC,1,KM,IMT,1,KM, IMT,JDIM,KM, OSI0F402.93
& D1(joc_u(MSB)),ARRAY(u_pntr)) OSI0F402.94
CALL OD12SLAB
(1,IMT,NLOC,NLOC,1,KM,IMT,1,KM, IMT,JDIM,KM, OSI0F402.95
& D1(joc_v(MSB)),ARRAY(v_pntr)) OSI0F402.96
OSI0F402.97
OSI0F402.98
ENDIF OSI0F402.99
OSI0F402.100
FORTXD1.230
CL Set all land points to 0.01 for salinity, 0.0 otherwise OSI0F402.101
OSI0F402.102
IF (.NOT.L_OCOMP) THEN OSI0F402.103
OSI0F402.104
DO M=1,NT OSI0F402.105
IF(M.EQ.2) THEN OSI0F402.106
O_RMDI=0.01 OSI0F402.107
ELSE OSI0F402.108
O_RMDI=0.0 OSI0F402.109
END IF OSI0F402.110
OSI0F402.111
DO I=1,IMT OSI0F402.112
n_levels(I)=FKMP(I,NLOC) OSI0F402.113
END DO OSI0F402.114
OSI1F405.353
IF (L_OGILL_LBCS) THEN OSI1F405.354
IF (L_OBDY_SOUTH .AND. NLOC+J_OFFSET.EQ.1) THEN OSI1F405.355
DO I=1,IMT OSI1F405.356
n_levels(I)=FKMP(I,NLOC+1) OSI1F405.357
END DO OSI1F405.358
ENDIF OSI1F405.359
IF (L_OBDY_NORTH .AND. NLOC+J_OFFSET.EQ.JMT_GLOBAL) THEN OSI1F405.360
DO I=1,IMT OSI1F405.361
n_levels(I)=FKMP(I,NLOC-1) OSI1F405.362
END DO OSI1F405.363
ENDIF OSI1F405.364
ENDIF ! L_OGILL_LBCS OSI1F405.365
OSI1F405.366
DO K=1,KM OSI0F402.115
index=(K-1)*IMT-1 OSI0F402.116
DO I=1,IMT OSI0F402.117
IF (K.GT.n_levels(I)) THEN OSI0F402.118
ARRAY(t_pntr(M)+index+I)=O_RMDI OSI0F402.119
END IF OSI0F402.120
END DO OSI0F402.121
END DO OSI0F402.122
END DO OSI0F402.123
OSI0F402.124
ENDIF OSI0F402.125
FORTXD1.232
DO I=1,IMT FORTXD1.233
n_levels(I)=FKMQ(I,NLOC) OSI0F402.126
END DO FORTXD1.235
DO K=1,KM FORTXD1.236
index=(K-1)*IMT-1 FORTXD1.237
DO I=1,IMT FORTXD1.238
IF (K.GT.n_levels(I)) THEN OSI0F402.127
ARRAY(u_pntr+index+I)=0.0 FORTXD1.240
ARRAY(v_pntr+index+I)=0.0 FORTXD1.241
END IF FORTXD1.242
END DO FORTXD1.243
END DO FORTXD1.244
FORTXD1.245
RETURN FORTXD1.246
END FORTXD1.247
FORTXD1.248
FORTXD1.249
C*L Subroutine call FORTXD1.250
FORTXD1.251
SUBROUTINE UMRANCIL( 1@DYALLOC.925
*CALL ARGSIZE
@DYALLOC.926
*CALL ARGD1
@DYALLOC.927
*CALL ARGPTRO
@DYALLOC.929
& NLOC ! ##################################### @DYALLOC.930
&,wsx_um,wsy_um FORTXD1.253
&,htn_um FORTXD1.254
&,pme_um FORTXD1.255
&,wme_um FORTXD1.256
&,sol_um FORTXD1.257
&,snowrate_um FORTXD1.258
&,climsst_um FORTXD1.259
&,climsal_um FORTXD1.260
&,river_um FORTXD1.261
& ) FORTXD1.262
C* FORTXD1.263
FORTXD1.264
IMPLICIT NONE FORTXD1.265
FORTXD1.266
CL Include COMDECKS FORTXD1.267
*CALL TYPSIZE
@DYALLOC.931
*CALL TYPD1
@DYALLOC.932
*CALL TYPPTRO
@DYALLOC.934
FORTXD1.271
C*L Type argument list FORTXD1.272
FORTXD1.273
INTEGER FORTXD1.274
& NLOC ! Row number FORTXD1.275
REAL FORTXD1.276
& wsx_um(IMT),wsy_um(IMT) ! Components of wind stress FORTXD1.277
&,wme_um(IMT) ! Wind mixing energy (opt X) FORTXD1.278
&,sol_um(IMT) ! Penetrative heat flux (opt E) FORTXD1.279
&,htn_um(IMT) ! Surface heat flux FORTXD1.280
&,pme_um(IMT) ! Fresh water flux FORTXD1.281
&,snowrate_um(IMT) ! Snow rate (opt P) FORTXD1.282
&,climsst_um(IMT) ! Climatological SST FORTXD1.283
&,climsal_um(IMT) ! Climatological salinity FORTXD1.284
&,river_um(IMT) ! River Runoff (option r) FORTXD1.285
C* FORTXD1.286
FORTXD1.287
C Local variables FORTXD1.288
FORTXD1.289
INTEGER FORTXD1.290
& I ! local indexes FORTXD1.291
&,start ! pointer to row of ancillary data in D1 FORTXD1.292
FORTXD1.293
CL Set pointer to start of row NLOC in field FORTXD1.294
FORTXD1.295
start=(NLOC-1)*IMT-1 FORTXD1.296
FORTXD1.297
CL Transfer rows of ancillary data FORTXD1.298
FORTXD1.299
DO I=1,IMT FORTXD1.300
wsx_um(I)= D1(joc_taux + start+I) FORTXD1.301
wsy_um(I)= D1(joc_tauy + start+I) FORTXD1.302
htn_um(I)= D1(joc_heat + start+I) FORTXD1.303
pme_um(I)= D1(joc_ple + start+I) FORTXD1.304
END DO FORTXD1.305
FORTXD1.306
IF (joc_wme.GT.1) THEN FORTXD1.307
DO I=1,IMT FORTXD1.308
wme_um(I)= D1(joc_wme + start+I) FORTXD1.309
END DO FORTXD1.310
ENDIF FORTXD1.311
FORTXD1.312
IF (joc_solar.GT.1) THEN FORTXD1.313
DO I=1,IMT FORTXD1.314
sol_um(I)= D1(joc_solar + start+I) FORTXD1.315
END DO FORTXD1.316
ENDIF FORTXD1.317
FORTXD1.318
IF (joc_snowrate.GT.1) THEN FORTXD1.319
DO I=1,IMT FORTXD1.320
snowrate_um(I)= D1(joc_snowrate + start+I) FORTXD1.321
END DO FORTXD1.322
ENDIF FORTXD1.323
FORTXD1.324
IF (joc_climsst.GT.1) THEN FORTXD1.325
DO I=1,IMT FORTXD1.326
climsst_um(I)= D1(joc_climsst + start+I) FORTXD1.327
END DO FORTXD1.328
ENDIF FORTXD1.329
FORTXD1.330
IF (joc_climsal.GT.1) THEN FORTXD1.331
DO I=1,IMT FORTXD1.332
climsal_um(I)= D1(joc_climsal + start+I) FORTXD1.333
END DO FORTXD1.334
ENDIF FORTXD1.335
FORTXD1.336
IF (joc_river .GT. 1) THEN FORTXD1.337
DO I=1,IMT FORTXD1.338
river_um(I)= D1(joc_river + start + I) FORTXD1.339
ENDDO FORTXD1.340
ENDIF FORTXD1.341
FORTXD1.342
RETURN FORTXD1.343
END FORTXD1.344
*ENDIF FORTXD1.493