*IF DEF,OCEAN GENINT1.2
C ******************************COPYRIGHT****************************** GENINT1.3
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. GENINT1.4
C GENINT1.5
C Use, duplication or disclosure of this code is subject to the GENINT1.6
C restrictions as set forth in the contract. GENINT1.7
C GENINT1.8
C Meteorological Office GENINT1.9
C London Road GENINT1.10
C BRACKNELL GENINT1.11
C Berkshire UK GENINT1.12
C RG12 2SZ GENINT1.13
C GENINT1.14
C If no contract has been raised with this copy of the code, the use, GENINT1.15
C duplication or disclosure of it is strictly prohibited. Permission GENINT1.16
C to do so must first be obtained in writing from the Head of Numerical GENINT1.17
C Modelling at the above address. GENINT1.18
C ******************************COPYRIGHT****************************** GENINT1.19
C GENINT1.20
CLL Subroutine GEN_INTF_FLD ------------------------------------------- GENINT1.21
C GENINT1.22
CLL Purpose: To generate boundary data from a source model(global or GENINT1.23
CLL regional) GENINT1.24
CLL GENINT1.25
CLL Gather_fld extracts the required data from the source GENINT1.26
CLL (global or regional) data to create the boundary data GENINT1.27
CLL GENINT1.28
CLL Model Modification history from model version 4.5 GENINT1.29
CLL version Date GENINT1.30
CLL 4.5 3/09/98 New deck added M.J.Bell GENINT1.31
CLL GENINT1.32
CLLEND --------------------------------------------------------------- GENINT1.33
GENINT1.34
C*L Argument list for GEN_INTF_FLD GENINT1.35
subroutine gen_intf_fld ( icode, cmessage, nlevels_srce, 9,3GENINT1.36
*IF DEF,MPP GENINT1.37
& nrows_local_srce, row_length_local_srce, GENINT1.38
& mype, proc_to_use, proc_group, GENINT1.39
*ENDIF GENINT1.40
& nrows_srce, row_length_srce, GENINT1.41
& len_intf_trgt, tot_len_intf_trgt, n_levels_trgt, GENINT1.42
& indx_start, index_b_l, index_b_r, GENINT1.43
& weight_b_l, weight_b_r, weight_t_l, weight_t_r, GENINT1.44
& intf_vert_interp, depths_srce, depths_trgt, GENINT1.45
& fld_srce, out_trgt ) GENINT1.46
GENINT1.47
implicit none GENINT1.48
GENINT1.49
integer icode GENINT1.50
character*256 cmessage GENINT1.51
GENINT1.52
integer GENINT1.53
& nlevels_srce, ! IN number of levels on source grid (global) GENINT1.54
*IF DEF,MPP GENINT1.55
& nrows_local_srce, ! in number of rows on source grid (local) GENINT1.56
& row_length_local_srce, ! IN number of points on a row (local) GENINT1.57
& mype, ! "my" processor number GENINT1.58
& proc_to_use, ! IN processor to use GENINT1.59
& proc_group, ! IN (GC_ALL_PROC_GROUP) GENINT1.60
*ENDIF GENINT1.61
& nrows_srce, ! IN number of rows on source grid (global) GENINT1.62
& row_length_srce, ! IN number of points on a row (global) GENINT1.63
& len_intf_trgt, ! IN length of 1 level of interface output GENINT1.64
& tot_len_intf_trgt, ! IN; total length of coefficient arrays GENINT1.65
& n_levels_trgt, ! IN number of levels of interface output GENINT1.66
& indx_start, ! IN start location in arrays GENINT1.67
& index_b_l(tot_len_intf_trgt), !IN GENINT1.68
& index_b_r(tot_len_intf_trgt) ! IN GENINT1.69
real GENINT1.70
& weight_b_l(tot_len_intf_trgt), ! IN weights for GENINT1.71
& weight_b_r(tot_len_intf_trgt), ! IN horiz GENINT1.72
& weight_t_l(tot_len_intf_trgt), ! IN interpolation GENINT1.73
& weight_t_r(tot_len_intf_trgt) ! IN GENINT1.74
GENINT1.75
logical intf_vert_interp ! T => vertical interpolation needed GENINT1.76
real GENINT1.77
& depths_srce( nlevels_srce), ! IN depths of source grid GENINT1.78
& depths_trgt ( n_levels_trgt ), ! IN depths of target grid GENINT1.79
*IF DEF,MPP GENINT1.80
& fld_srce (row_length_local_srce*nrows_local_srce,nlevels_srce), GENINT1.81
*ELSE GENINT1.82
& fld_srce (row_length_srce*nrows_srce,nlevels_srce), GENINT1.83
*ENDIF GENINT1.84
& ! IN input field GENINT1.85
& out_trgt ( len_intf_trgt, n_levels_trgt ) ! OUT main output GENINT1.86
GENINT1.87
!--------------------------------------- GENINT1.88
GENINT1.89
! local arrays GENINT1.90
real work_global(row_length_srce, nrows_srce) GENINT1.91
real intf_work( len_intf_trgt, nlevels_srce) GENINT1.92
GENINT1.93
! local scalars GENINT1.94
integer level, i ! loop counters GENINT1.95
GENINT1.96
integer indx_ptr ! pointer to start location in interpolation GENINT1.97
! coeff arrays GENINT1.98
real depth ! depth of level to interpolate to GENINT1.99
GENINT1.100
integer lev1, lev2 ! depths of nearest levels GENINT1.101
real dep_lev1, dep_lev2 !depths of levels above and below GENINT1.102
GENINT1.103
!--------------------------------------- GENINT1.104
GENINT1.105
CL 1. Loop over levels of SRCE grid for horizontal interpolation GENINT1.106
GENINT1.107
do level = 1, nlevels_srce GENINT1.108
GENINT1.109
CL 1.1 Gather field for horizontal interpolation GENINT1.110
GENINT1.111
*IF DEF,MPP GENINT1.112
call gather_field
(fld_srce(1,level), work_global, GENINT1.113
& row_length_local_srce, nrows_local_srce, GENINT1.114
& row_length_srce, nrows_srce, GENINT1.115
& proc_to_use, proc_group, GENINT1.116
& icode) ! check info -> icode is OK GENINT1.117
GENINT1.118
if (icode .ne. 0) then GENINT1.119
write(6,*) ' gather_field failed in gen_intf_fld on level ' GENINT1.120
write(6,*) level GENINT1.121
icode = 1 GENINT1.122
go to 999 GENINT1.123
end if GENINT1.124
GENINT1.125
IF (mype .EQ. proc_to_use) THEN GENINT1.126
*ENDIF GENINT1.127
GENINT1.128
CL 1.2 Do horizontal interpolation GENINT1.129
GENINT1.130
! need to think about sizes carefully !! GENINT1.131
! indx_ptr = (level - 1) * len_intf_trgt + indx_start GENINT1.132
indx_ptr = indx_start GENINT1.133
! need to think about sizes carefully !! GENINT1.134
GENINT1.135
GENINT1.136
*IF -DEF,MPP GENINT1.137
call h_int_bl
(nrows_srce,row_length_srce,len_intf_trgt GENINT1.138
&, index_b_l(indx_ptr),index_b_r(indx_ptr), fld_srce GENINT1.139
*ELSE GENINT1.140
call h_int_bl
(nrows_srce,row_length_srce,len_intf_trgt GENINT1.141
&, index_b_l(indx_ptr),index_b_r(indx_ptr),work_global GENINT1.142
*ENDIF GENINT1.143
&, weight_b_l(indx_ptr), weight_b_r(indx_ptr) GENINT1.144
&, weight_t_l(indx_ptr), weight_t_r(indx_ptr) GENINT1.145
&, intf_work(1,level) ) GENINT1.146
GENINT1.147
*IF DEF,MPP GENINT1.148
END IF ! mype GENINT1.149
*ENDIF GENINT1.150
GENINT1.151
end do ! level GENINT1.152
GENINT1.153
CL 2. do vertical interpolation GENINT1.154
GENINT1.155
*IF DEF,MPP GENINT1.156
IF (mype .eq. proc_to_use) THEN GENINT1.157
*ENDIF GENINT1.158
GENINT1.159
if (intf_vert_interp) then GENINT1.160
do level=1, n_levels_trgt GENINT1.161
! set output level GENINT1.162
depth = depths_trgt (level) GENINT1.163
GENINT1.164
call oa_int_lev(
icode, cmessage, GENINT1.165
& nlevels_srce, depths_srce, depth, GENINT1.166
& lev1, lev2, dep_lev1, dep_lev2 ) GENINT1.167
GENINT1.168
call oa_int_1d(
icode, cmessage, GENINT1.169
& dep_lev1, dep_lev2, 1, depth, GENINT1.170
& len_intf_trgt, intf_work(1,lev1), intf_work(1,lev2), GENINT1.171
& out_trgt) GENINT1.172
GENINT1.173
end do GENINT1.174
GENINT1.175
C if no vertical interpolation transfer output directly to out_trgt GENINT1.176
else GENINT1.177
do level=1, n_levels_trgt GENINT1.178
do i = 1, len_intf_trgt GENINT1.179
out_trgt (i,level) = intf_work (i,level) GENINT1.180
end do GENINT1.181
end do GENINT1.182
end if GENINT1.183
GENINT1.184
!!!! temporary write out values to see what is happening !!!! GENINT1.185
write(6,*) ' gen_int_fld: out_trgt(i,1) ' GENINT1.186
level=min(7,n_levels_trgt) GENINT1.187
write(6,*)(out_trgt(i,level),i=1,len_intf_trgt) GENINT1.188
GENINT1.189
GENINT1.190
*IF DEF,MPP GENINT1.191
END IF ! mype GENINT1.192
*ENDIF GENINT1.193
GENINT1.194
999 continue GENINT1.195
return GENINT1.196
end GENINT1.197
GENINT1.198
*ENDIF GENINT1.199