*IF DEF,CONTROL,OR,DEF,MAKEBC GDR2F405.110
C ******************************COPYRIGHT****************************** GTS2F400.3259
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.3260
C GTS2F400.3261
C Use, duplication or disclosure of this code is subject to the GTS2F400.3262
C restrictions as set forth in the contract. GTS2F400.3263
C GTS2F400.3264
C Meteorological Office GTS2F400.3265
C London Road GTS2F400.3266
C BRACKNELL GTS2F400.3267
C Berkshire UK GTS2F400.3268
C RG12 2SZ GTS2F400.3269
C GTS2F400.3270
C If no contract has been raised with this copy of the code, the use, GTS2F400.3271
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.3272
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.3273
C Modelling at the above address. GTS2F400.3274
C ******************************COPYRIGHT****************************** GTS2F400.3275
C GTS2F400.3276
CLL ----------- SUBROUTINES GEN_INTF and GEN_INTF_A -------------------- @DYALLOC.944
CLL GENINTF1.4
CLL Purpose: To generate a PP header and boundary data from a global GENINTF1.5
CLL or regional model field at a particular time. Creates an GENINTF1.6
CLL interface file for use by a limited area model. GENINTF1.7
CLL DR240293.151
CLL GEN_INTF determines whether interface data is required DR240293.152
CLL for each area on this timestep and calls GEN_INTF_A or @DYALLOC.945
CLL GEN_INTF_O generate the interface data. (Note that @DYALLOC.946
CLL GEN_INTF_O does not exist yet) @DYALLOC.947
CLL GENINTF1.8
CLL Control routine for Cray YMP GENINTF1.9
CLL GENINTF1.10
CLL CW, AD, RS <- programmer of some or all of previous code or changes GENINTF1.11
CLL GENINTF1.12
CLL Model Modification history from model version 3.0: GENINTF1.13
CLL version Date GENINTF1.14
CLL 3.1 2/02/93 : added comdeck CHSUNITS to define NUNITS for i/o. RS030293.97
CLL 3.1 12/02/93 Correct IOERROR message for ICODE=3. R.T.H.Barnes. RB120293.1
CLL GENINTF1.15
CLL 3.1 15/12/92 Split subroutine into two (GEN_INTF and GEN_INTF2) DR240293.155
CLL to allow dynamic allocation of arrays. GEN_INTF2 DR240293.156
CLL is only called for those areas requiring data on DR240293.157
CLL each timestep. GEN_INTF2 is mainly the same as DR240293.158
CLL GEN_INTF in previous UM versions. D. Robinson DR240293.159
CLL 3.2 13/05/93 Dynamic allocation changes. Reanme GEN_INTF2 to @DYALLOC.948
CLL GEN_INTF_A. @DYALLOC.949
CLL 3.3 08/02/94 Modify calls to TIME2SEC/SEC2TIME to output/input TJ080294.257
CLL elapsed times in days & secs, for portability. TCJ TJ080294.258
CLL 3.3 26/10/93 M. Carter. Part of an extensive mod that: MC261093.34
CLL 1.Removes the limit on primary STASH item numbers. MC261093.35
CLL 2.Removes the assumption that (section,item) MC261093.36
CLL defines the sub-model. MC261093.37
CLL 3.Thus allows for user-prognostics. MC261093.38
CLL Replace LEN_PPINDEX with NITEMS to remove limit MC261093.39
CLL on prognostic STASHitems. MC261093.40
CLL 3.3 22/11/93 Remove AKH and BKH from GEN_INTF_A. D. Robinson. DR141293.4
CLL 3.4 17/06/94 DEF LBOUTA replaced by LOGICAL LLBOUTA GSS1F304.315
CLL Argument LCAL360 passed to SEC2TIM GSS1F304.316
CLL S.J.Swarbrick GSS1F304.317
CLL 3.4 16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon ANF0F304.19
CLL 3.4 24/12/93 Sets fixed header element 161 to the length GDG2F304.1
CLL of data rather than half the length of data GDG2F304.2
CLL Author D.M.Goddard GDG2F304.3
CLL 3.4 29/11/94 Pass U_FIELD for GEN_INTF_A for portable dyn.allocn. ANF1F304.30
CLL 3.5 24/03/95 Changed OPEN to FILE_OPEN and GPB1F305.34
CLL CLOSE to FILE_CLOSE P.Burton GPB1F305.35
CLL 3.5 05/06/95 Chgs to PPINDEX array. RTHBarnes GRB4F305.133
CLL 4.0 30/01/95 Correct dimension of TRACER array and no of levels GDR2F400.1
CLL for Vert Interp of Tracers. D. Robinson GDR2F400.2
! 4.0 01/09/95 Replace calls to H_INT with calls to H_INT_BL UDG1F400.324
! Authorr D.M. Goddard UDG1F400.325
CLL 4.0 30/03/95 Cater for unpacked data in atmosphere boundary GDR1F400.18
CLL datasets. D. Robinson. GDR1F400.19
! 4.1 16/01/96 Changes to NADDR in LOOKUP table. Converts a APB4F401.105
! boundary dataset into standard UM format. Use APB4F401.106
! PPXREF file to get packing indicator if INTF_PACK=2 APB4F401.107
! Remove PPINDEX from argument list ; call ARGSTS APB4F401.108
! and TYPSTS. D. Robinson. APB4F401.109
! 4.1 24/01/96 Changed argument list of GEN_INTF_A for MPP code - APB4F401.110
! added size of global field. Added MPP code. APB4F401.111
! Changed order of comdecks so TYPSIZE and CSUBMODL APB4F401.112
! are called before TYPSTS APB4F401.113
! P.Burton APB4F401.114
CLL 4.1 31/05/96 The number of v points to be processed on a UIE2F401.480
CLL C grid differs from u by row_length. u,v UIE2F401.481
CLL dimensioned separately in calls to WLLTOEQ. UIE2F401.482
CLL and WEQTOLL. Requirement for VAR. UIE2F401.483
CLL Author I.Edmond Reviewer D. Goddard UIE2F401.484
!LL 4.2 17/10/96 New name for group of processors in gather_field GPB0F402.185
!LL P.Burton GPB0F402.186
! 4.2 Oct. 96 T3E migration: exphf, loghf functions replaced by GSS9F402.94
! rtor_v function S.J.Swarbrick GSS9F402.95
!LL 4.3 24/04/97 Only call pack21 on PE0 P.Burton ARB1F404.212
!LL 4.4 04/08/97 Generalise for mixed phase precipitation scheme. ARB1F404.213
!LL RTHBarnes. ARB1F404.214
CLL ARB1F404.215
! 4.4 25/04/97 Changes to make the addresses well-formed for GBC5F404.47
! Cray I/O. Each complete set of LBC data for GBC5F404.48
! a timestep is made well-formed, but not GBC5F404.49
! individual records within the full set. GBC5F404.50
! Author: Bob Carruthers, Cray Research GBC5F404.51
!LL 4.5 15/04/98 Added start-end arguments to V_INT routines GSM1F405.733
!LL S.D.Mullerworth GSM1F405.734
! 4.5 17/10/97 Parallelise the horizontal and vertical GBCEF405.1
! interpolations, and use a multi-level GBCEF405.2
! gather. GBCEF405.3
! GBCEF405.4
! *** T3E Specific Code *** GBCEF405.5
! GBCEF405.6
! Authors: Bob Carruthers, Cray Research GBCEF405.7
! Paul Burton GBCEF405.8
!LL 4.5 29/07/98 Rename CINTF to CINTFA. Call INTF_UNIT. GDR2F405.111
!LL Remove DEF,RECONF. D. Robinson. GDR2F405.112
! 4.5 17/08/98 Global/Mes parallel running. Send messages to GDR3F405.667
! communication & information files. D. Robinson. GDR3F405.668
CLL Programing standard: UM Documentation paper No. 3, GENINTF1.16
CLL Version No 1, dated 15/01/90 GENINTF1.17
CLL GENINTF1.18
CLL System components covered: D81 GENINTF1.19
CLL GENINTF1.20
CLL System task: D81 GENINTF1.21
CLL GENINTF1.22
CLL Documentation: UM Documentation paper No D8, GENINTF1.23
CLL GENINTF1.24
CLLEND ---------------------------------------------------------------- GENINTF1.25
GENINTF1.26
C*L Argument list for GEN_INTF DR240293.161
SUBROUTINE GEN_INTF ( 5,9@DYALLOC.950
*CALL ARGSIZE
@DYALLOC.951
*CALL ARGD1
@DYALLOC.952
*CALL ARGDUMA
@DYALLOC.953
*CALL ARGSTS
@DYALLOC.954
*CALL ARGPTRA
@DYALLOC.955
*CALL ARGCONA
@DYALLOC.956
*CALL ARGINFA
@DYALLOC.957
*CALL ARGPTRO
GMB1F405.57
*CALL ARGCONO
GMB1F405.58
*CALL ARGDUMO
GMB1F405.59
*CALL ARGINFO
GMB1F405.60
*CALL ARGPPX
APB4F401.116
& internal_model,ICODE,CMESSAGE) GDR3F305.189
GENINTF1.31
IMPLICIT NONE GENINTF1.32
@DYALLOC.959
*CALL CMAXSIZE
@DYALLOC.960
*CALL CMAXSIZO
GMB1F405.61
*CALL CSUBMODL
GSS1F305.926
*CALL CINTFA
GDR2F405.113
*CALL TYPSIZE
@DYALLOC.961
*CALL TYPD1
@DYALLOC.962
*CALL TYPDUMA
@DYALLOC.963
*CALL TYPSTS
@DYALLOC.964
*CALL TYPPTRA
@DYALLOC.965
*CALL TYPCONA
@DYALLOC.966
*CALL TYPINFA
@DYALLOC.967
*CALL TYPPTRO
GMB1F405.62
*CALL TYPCONO
GMB1F405.63
*CALL TYPDUMO
GMB1F405.64
*CALL TYPINFO
GMB1F405.65
*IF DEF,MPP APB4F401.117
*CALL PARVARS
APB4F401.118
*ENDIF APB4F401.119
GENINTF1.33
INTEGER GENINTF1.34
& internal_model, ! Sub-model indicator GDR3F305.190
& ICODE ! Return code : =0 Normal exit DR240293.163
DR240293.164
CHARACTER*(80) CMESSAGE ! Error message if ICODE > 0 ANF0F304.16
DR240293.166
C* DR240293.167
*CALL CHSUNITS
GDR3F305.191
*CALL CCONTROL
GDR3F305.192
*CALL CTIME
DR240293.168
*CALL PPXLOOK
APB4F401.120
*CALL CHISTORY
GDR3F405.669
*CALL LBC_COUP
GDR3F405.670
integer lbc_ntimes ! No of times BC's have been generated. GDR3F405.671
*IF DEF,MPP GDR3F405.672
integer ierr ! Error code GDR3F405.673
integer info ! Return code from GCOM routine. GDR3F405.674
*ENDIF GDR3F405.675
character*8 ch_date2 ! Date returned from date_and_time. GDR3F405.676
character*10 ch_time2 ! Time returned from date_and_time. GDR3F405.677
GDR3F405.678
*CALL CINTFO
GMB1F405.66
*CALL TYPOCDPT
GMB1F405.67
DR240293.173
INTEGER NFTOUT DR240293.174
DR240293.177
INTEGER JINTF ! Interface area index DR240293.178
INTEGER LEN_INTF_DATA_DA ! Length of workspace GDR1F400.20
INTEGER IM_IDENT ! internal model identifier GRB4F305.134
INTEGER IM_INDEX ! internal model index for STASH arrays GRB4F305.135
DR240293.181
C*L External subroutines called : DR240293.182
EXTERNAL GMB1F405.68
& INTF_UNIT GMB1F405.69
*IF DEF,ATMOS GMB1F405.70
& ,GEN_INTF_A GMB1F405.71
*ENDIF GMB1F405.72
*IF DEF,OCEAN GMB1F405.73
& ,GEN_INTF_O GMB1F405.74
*ENDIF GMB1F405.75
C* DR240293.184
CL Internal structure: DR240293.190
GRB4F305.136
C Set up internal model identifier and STASH index GRB4F305.137
im_ident = internal_model GRB4F305.138
im_index = internal_model_index(im_ident) GRB4F305.139
DR240293.191
ICODE=0 DR240293.192
CMESSAGE=' ' DR240293.193
DR240293.194
*IF DEF,ATMOS GSS1F304.321
IF (LLBOUTim(A_IM)) THEN GDR3F305.193
DR240293.196
CL Atmosphere Interface DR240293.197
DR240293.198
CL 1.0 Loop over all areas DR240293.199
DO JINTF=1,N_INTF_A DR240293.200
DR240293.201
CL Determine if interface data required this timestep DR240293.202
IF (INTERFACE_STEPSim(JINTF,a_im).GT.0) THEN GDR5F305.19
DR240293.204
IF ( MOD(STEPim(a_im)-INTERFACE_FSTEPim(JINTF,a_im), GDR5F305.20
+ INTERFACE_STEPSim(JINTF,a_im)).EQ.0 GDR5F305.21
+ .AND. STEPim(a_im).GE.INTERFACE_FSTEPim(JINTF,a_im) GDR5F305.22
+ .AND. STEPim(a_im).LE.INTERFACE_LSTEPim(JINTF,a_im) ) THEN GDR5F305.23
DR240293.209
CALL INTF_UNIT
(1,JINTF,NFTOUT) GDR2F405.114
DR240293.211
! Determine length of workspace to be dynamic allocated GDR1F400.21
LEN_INTF_DATA_DA = LEN_INTFA_DATA(JINTF) APB4F401.121
GDR1F400.27
CL Call GEN_INTF_A to generate interface data for this area. @DYALLOC.969
CALL GEN_INTF_A
( @DYALLOC.970
*CALL ARGSIZE
@DYALLOC.971
*CALL ARGDUMA
@DYALLOC.972
*CALL ARGINFA
@DYALLOC.973
*CALL ARGSTS
APB4F401.122
*CALL ARGPPX
APB4F401.123
*IF DEF,MPP APB4F401.124
& glsize(1)*glsize(2), APB4F401.125
*ENDIF APB4F401.126
+ JINTF,NFTOUT, @DYALLOC.974
+ D1(JPSTAR),D1(JU(1)),D1(JV(1)),D1(JTHETA(1)),D1(JQ(1)), DR240293.215
+ D1(JQCF(1)),D1(JTRACER(1,1)),A_LEVDEPC(JAK),A_LEVDEPC(JBK), ARB1F404.216
+ LEN_INTFA_P(JINTF),LEN_INTFA_U(JINTF),LEN_INTFA_DATA(JINTF), DR240293.217
+ INTF_P_LEVELS(JINTF), @DYALLOC.975
& U_FIELD, APB4F401.127
& P_LEVELS,LEN_INTF_DATA_DA, GDR1F400.28
& atmos_im, APB4F401.128
& ICODE,CMESSAGE) GDR3F305.194
DR240293.222
IF (ICODE.NE.0) THEN DR240293.223
GO TO 999 ! Return DR240293.225
ENDIF DR240293.226
DR240293.227
ENDIF DR240293.228
GDR3F405.679
if (l_lbc_coup .and. GDR3F405.680
& lbc_stream_a(jintf).eq.um_lbc_stream) then GDR3F405.681
GDR3F405.682
! Flush buffer to send latest BC's to file. GDR3F405.683
GDR3F405.684
*IF DEF,MPP GDR3F405.685
if (mype.eq.0) then GDR3F405.686
*ENDIF GDR3F405.687
GDR3F405.688
! Flush out all boundary data from buffer. GDR3F405.689
call flush_buffer
(nftout,icode) GDR3F405.690
GDR3F405.691
if (icode.ne.0) then GDR3F405.692
write (6,*) 'Return Code from FLUSH_BUFFER ',icode, GDR3F405.693
& ' for unit number ',nftout GDR3F405.694
icode = 501 GDR3F405.695
write (cmessage,*) 'GENINTF : Error flushing out '// GDR3F405.696
& 'Boundary Data.' GDR3F405.697
endif GDR3F405.698
*IF DEF,MPP GDR3F405.699
GDR3F405.700
endif ! if mype=0 GDR3F405.701
GDR3F405.702
! Broadcast ICODE to all PE's GDR3F405.703
ierr=icode GDR3F405.704
call gc_ibcast(
450,1,0,nproc,info,ierr) GDR3F405.705
icode = ierr GDR3F405.706
*ENDIF GDR3F405.707
GDR3F405.708
! Check ICODE before proceeding. GDR3F405.709
if (icode.ne.0) then GDR3F405.710
write (6,*) ' GENINTF - Error detected' GDR3F405.711
write (6,*) ' CMESSAGE : ',CMESSAGE GDR3F405.712
write (6,*) ' ICODE : ',ICODE GDR3F405.713
go to 999 ! Return GDR3F405.714
endif GDR3F405.715
GDR3F405.716
! Get the number of times BC's have been generated. GDR3F405.717
lbc_ntimes = ft_lastfield(nftout) GDR3F405.718
GDR3F405.719
write (6,*) ' gl : after gen_intf - lbc_ntimes ', GDR3F405.720
& lbc_ntimes GDR3F405.721
GDR3F405.722
*IF DEF,MPP GDR3F405.723
if (mype.eq.0) then GDR3F405.724
*ENDIF GDR3F405.725
GDR3F405.726
! Send message to communication file that next lot of GDR3F405.727
! BC's have been generated. GDR3F405.728
write (190,*) lbc_ntimes GDR3F405.729
GDR3F405.730
*IF -DEF,MAKEBC PXGENINT.1
! Flush message out. GDR3F405.731
call um_fort_flush
(190,icode) PXFLUSH.1
if (icode.ne.0) then GDR3F405.733
write (6,*) 'Return Code from FLUSH ',icode GDR3F405.734
icode = 503 GDR3F405.735
write (cmessage,*) 'GENINTF : Error flushing out '// GDR3F405.736
& 'contents for Unit 190.' GDR3F405.737
go to 150 GDR3F405.738
endif GDR3F405.739
*ENDIF PXGENINT.2
GDR3F405.740
! Write a text message that next lot of BC's have GDR3F405.741
! been generated. GDR3F405.742
call date_and_time(
ch_date2, ch_time2) GDR3F405.743
if (lbc_fc_hrs.ge.0) then GDR3F405.744
write (191,*) GDR3F405.745
& ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6), GDR3F405.746
& ' Boundary data has been generated for T+',lbc_fc_hrs GDR3F405.747
else GDR3F405.748
write (191,*) GDR3F405.749
& ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6), GDR3F405.750
& ' Boundary data has been generated for T',lbc_fc_hrs GDR3F405.751
endif GDR3F405.752
GDR3F405.753
*IF -DEF,MAKEBC PXGENINT.3
! Flush message out. GDR3F405.754
call um_fort_flush
(191,icode) PXFLUSH.2
if (icode.ne.0) then GDR3F405.756
write (6,*) 'Return Code from FLUSH ',icode GDR3F405.757
icode = 504 GDR3F405.758
write (cmessage,*) 'GENINTF : Error flushing out '// GDR3F405.759
& 'contents for Unit 191.' GDR3F405.760
go to 150 GDR3F405.761
endif GDR3F405.762
*ENDIF PXGENINT.4
GDR3F405.763
*IF DEF,MPP GDR3F405.764
endif ! if mype=0 GDR3F405.765
*ENDIF GDR3F405.766
GDR3F405.767
call date_and_time(
ch_date2, ch_time2) GDR3F405.768
GDR3F405.769
write(6,*) 'LBC_COUP: ', GDR3F405.770
& ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ', GDR3F405.771
& ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4), GDR3F405.772
& ' Timestep ',stepim(a_im), GDR3F405.773
& ' Boundary conditions generated.' GDR3F405.774
GDR3F405.775
! If all boundary conditions have been generated, add GDR3F405.776
! value 7777 to end of file. GDR3F405.777
GDR3F405.778
if (stepim(a_im) .eq. interface_LSTEPim(jintf,a_im)) then GDR3F405.779
GDR3F405.780
lbc_ntimes = 7777 GDR3F405.781
GDR3F405.782
write (6,*) ' gl : after gen_intf - lbc_ntimes ', GDR3F405.783
& lbc_ntimes GDR3F405.784
GDR3F405.785
*IF DEF,MPP GDR3F405.786
if (mype.eq.0) then GDR3F405.787
*ENDIF GDR3F405.788
GDR3F405.789
! Write to communication file and flush. GDR3F405.790
write (190,*) lbc_ntimes GDR3F405.791
*IF -DEF,MAKEBC PXGENINT.5
call um_fort_flush
(190,icode) PXFLUSH.3
if (icode.ne.0) then GDR3F405.793
write (6,*) 'Return Code from FLUSH ',icode GDR3F405.794
icode = 506 GDR3F405.795
write (cmessage,*) 'GENINTF : Error flushing out '// GDR3F405.796
& 'contents for Unit 190.' GDR3F405.797
go to 150 GDR3F405.798
endif GDR3F405.799
*ENDIF PXGENINT.6
GDR3F405.800
! Write text message and flush. GDR3F405.801
write (191,*) ' All Boundary data has been generated.' GDR3F405.802
*IF -DEF,MAKEBC PXGENINT.7
call um_fort_flush
(191,icode) PXFLUSH.4
if (icode.ne.0) then GDR3F405.804
write (6,*) 'Return Code from FLUSH ',icode GDR3F405.805
icode = 507 GDR3F405.806
write (cmessage,*) 'GENINTF : Error flushing out '// GDR3F405.807
& 'contents for Unit 191.' GDR3F405.808
go to 150 GDR3F405.809
endif GDR3F405.810
*ENDIF PXGENINT.8
GDR3F405.811
*IF DEF,MPP GDR3F405.812
endif ! if mype=0 GDR3F405.813
*ENDIF GDR3F405.814
GDR3F405.815
write (6,*) GDR3F405.816
& 'LBC_COUP: GEN_INTF - All Boundary Conditions generated ', GDR3F405.817
& 'for stream ',jintf GDR3F405.818
GDR3F405.819
endif ! if stepim(a_im) GDR3F405.820
GDR3F405.821
150 continue GDR3F405.822
GDR3F405.823
*IF DEF,MPP GDR3F405.824
! Broadcast ICODE to all PEs. GDR3F405.825
ierr=icode GDR3F405.826
call gc_ibcast(
450,1,0,nproc,info,ierr) GDR3F405.827
icode = ierr GDR3F405.828
*ENDIF GDR3F405.829
GDR3F405.830
! Check ICODE before proceeding. GDR3F405.831
if (icode.ne.0) then GDR3F405.832
write (6,*) ' GENINTF - Error detected' GDR3F405.833
write (6,*) ' ICODE : ',ICODE GDR3F405.834
write (6,*) ' CMESSAGE : ',CMESSAGE GDR3F405.835
go to 999 ! Return GDR3F405.836
endif GDR3F405.837
GDR3F405.838
endif ! if l_lbc_coup GDR3F405.839
GDR3F405.840
ENDIF DR240293.229
ENDDO ! Loop over JINTF DR240293.230
GSS1F304.324
END IF ! LLBOUTim(A_IM) GDR3F305.195
*ENDIF GSS1F304.326
DR240293.232
*IF DEF,OCEAN GMB1F405.76
IF (LLBOUTim(O_IM)) THEN GMB1F405.77
GMB1F405.78
CL Ocean Interface GMB1F405.79
GMB1F405.80
CL 1.0 Loop over all areas GMB1F405.81
DO JINTF=1,N_INTF_O GMB1F405.82
GMB1F405.83
CL Determine if interface data required this timestep GMB1F405.84
IF (INTERFACE_STEPSim(JINTF,o_im).GT.0) THEN GMB1F405.85
GMB1F405.86
IF ( MOD(STEPim(o_im)-INTERFACE_FSTEPim(JINTF,o_im), GMB1F405.87
+ INTERFACE_STEPSim(JINTF,o_im)).EQ.0 GMB1F405.88
+ .AND. STEPim(o_im).GE.INTERFACE_FSTEPim(JINTF,o_im) GMB1F405.89
+ .AND. STEPim(o_im).LE.INTERFACE_LSTEPim(JINTF,o_im) ) THEN GMB1F405.90
GMB1F405.91
call intf_unit
(o_im, jintf, nftout) GMB1F405.92
GMB1F405.93
CL Call GEN_INTF_O to generate interface data for this area. GMB1F405.94
GMB1F405.95
call gen_intf_o
( GMB1F405.96
*CALL ADUMLENO
GMB1F405.97
*CALL AINFLENO
GMB1F405.98
*CALL AINTFO
GMB1F405.99
*CALL ARGDUMO
GMB1F405.100
*CALL ARGINFO
GMB1F405.101
*CALL ARGPPX
GMB1F405.102
+ JINTF,NFTOUT, GMB1F405.103
+ imt, jmt, km, GMB1F405.104
+ NITEMS, PPINDEX, GMB1F405.105
+ D1(joc_tracer(1,1)), D1(joc_tracer(2,1)), GMB1F405.106
+ D1(joc_u(1)),D1(joc_v(1)), GMB1F405.107
+ D1(joc_stream(1)), D1(joc_tend(1)), GMB1F405.108
+ D1(joc_snow), D1(joc_icecon), D1(joc_icedep), GMB1F405.109
+ O_SPCON(jocp_zdzz), GMB1F405.110
& ICODE,CMESSAGE ) GMB1F405.111
GMB1F405.112
IF (ICODE.NE.0) THEN GMB1F405.113
CMESSAGE = 'GEN_INTF ; Error in GEN_INTF_O' GMB1F405.114
GO TO 999 ! Return GMB1F405.115
ENDIF GMB1F405.116
GMB1F405.117
ENDIF GMB1F405.118
ENDIF GMB1F405.119
ENDDO ! Loop over JINTF GMB1F405.120
GMB1F405.121
END IF ! LLBOUTim(o_im) GMB1F405.122
*ENDIF GMB1F405.123
999 RETURN DR240293.240
END DR240293.241
DR240293.242
*IF DEF,ATMOS GSS1F304.327
DR240293.245
C*L Argument list for GEN_INTF_A @DYALLOC.980
SUBROUTINE GEN_INTF_A ( 1,65@DYALLOC.981
*CALL ARGSIZE
@DYALLOC.982
*CALL ARGDUMA
@DYALLOC.983
*CALL ARGINFA
@DYALLOC.984
*CALL ARGSTS
APB4F401.129
*CALL ARGPPX
APB4F401.130
*IF DEF,MPP APB4F401.131
& WORK_FLD_SIZE, APB4F401.132
*ENDIF APB4F401.133
& JINTF,NFTOUT, @DYALLOC.985
& PSTAR,U,V,THETA,Q,QCF,TRACER,AK,BK, ARB1F404.217
& LEN_INTF_P,LEN_INTF_U,LEN_INTF_DATA, DR240293.248
& INTF_P_LEVS,U_FIELDDA, APB4F401.134
& P_LEVELSDA,LEN_INTF_DATA_DA, GDR1F400.29
& INTERNAL_MODEL, APB4F401.135
& ICODE,CMESSAGE) GDR3F305.196
DR240293.252
IMPLICIT NONE DR240293.253
DR240293.254
*CALL CMAXSIZE
@DYALLOC.987
*CALL CINTFA
GDR2F405.115
*CALL TYPSIZE
@DYALLOC.988
*CALL TYPDUMA
@DYALLOC.989
*CALL TYPINFA
@DYALLOC.990
*CALL CSUBMODL
APB4F401.136
*CALL TYPSTS
APB4F401.137
@DYALLOC.991
INTEGER DR240293.255
& JINTF ! Index to interface area DR240293.256
& ,NFTOUT ! Unit number for interface data DR240293.257
& ,LEN_INTF_P ! Length of interface p* grid DR240293.266
& ,LEN_INTF_U ! Length of interface u grid DR240293.267
& ,LEN_INTF_DATA ! Length of interface data DR240293.268
& ,INTF_P_LEVS ! No of model levels in interface data DR240293.269
& ,U_FIELDDA ! No. of points in wind field ANF1F304.33
*IF DEF,MPP APB4F401.138
& ,WORK_FLD_SIZE ! Size of full global field APB4F401.139
*ENDIF APB4F401.140
& ,P_LEVELSDA ! No. of levels - p* grid GDR1F400.30
& ,LEN_INTF_DATA_DA ! Length of workspace for interface data GDR1F400.31
& ,INTERNAL_MODEL APB4F401.141
DR240293.284
INTEGER DR240293.285
& ICODE ! Return code : =0 Normal exit DR240293.286
C ! >0 Error condition GENINTF1.36
CHARACTER*(80) CMESSAGE ! Error message if ICODE>0 ANF0F304.21
@DYALLOC.993
REAL @DYALLOC.994
& PSTAR(P_FIELD) ! Model P* data @DYALLOC.995
& ,U(U_FIELD,P_LEVELS) ! Model u components @DYALLOC.996
& ,V(U_FIELD,P_LEVELS) ! Model v components @DYALLOC.997
& ,THETA(P_FIELD,P_LEVELS) ! Model theta data @DYALLOC.998
& ,Q(P_FIELD,Q_LEVELS) ! Model Q data @DYALLOC.999
& ,QCF(P_FIELD,Q_LEVELS) ! Model QCF data ARB1F404.218
& ,TRACER(TR_VARS*P_FIELD,TR_LEVELS) ! Model tracer data GDR2F400.3
& ,AK(P_LEVELS) !) A and B values for hybrid @DYALLOC.1003
& ,BK(P_LEVELS) !) co-ords on model full levels @DYALLOC.1004
@DYALLOC.1005
LOGICAL GDR1F400.32
& LPACK_32B ! Packing Indicator GDR1F400.33
& ,LPACK_PPXREF APB4F401.142
C* DR240293.288
INTEGER DR240293.289
& I, GENINTF1.38
& J, GENINTF1.39
& IADDR,IADDR_V, GDR1F400.34
& LEVEL, GENINTF1.42
& VAR, GENINTF1.43
& LOOKUP_START, GENINTF1.44
& LEN_IO, GENINTF1.45
& SEC, GENINTF1.46
& DATA_START, GENINTF1.48
& CODE GENINTF1.49
& ,NTIME ! postion number of interface data GENINTF1.50
*,LEN_PPNAME GENINTF1.51
& ,im_ident ! Internal model identifier APB4F401.143
& ,im_index ! Internal model index in STASH arrays APB4F401.144
GENINTF1.52
INTEGER YY,MM,DD,HR,MN,SS,DAY_NO DR240293.290
DR240293.291
REAL TEMP GENINTF1.53
GENINTF1.56
LOGICAL GENINTF1.57
& ROT_IN ! =T, if input model grid rotated GENINTF1.58
*CALL CHSUNITS
GDR3F305.198
*CALL CHISTORY
GDR3F305.199
*CALL CCONTROL
GDR3F305.200
*CALL CTIME
GDR3F305.201
*CALL CLOOKADD
GDR3F305.202
*CALL CTRACERA
ARB1F404.219
*CALL PPXLOOK
APB4F401.145
*CALL C_R_CP
GENINTF1.69
*IF DEF,MPP APB4F401.146
*CALL PARVARS
APB4F401.147
*CALL GCCOM
APB4F401.148
INTEGER info APB4F401.149
*IF DEF,T3E GBCEF405.9
c GBCEF405.10
integer len_intf_uv_data ! Length of U or V data to be GBCEF405.11
! collected after processing GBCEF405.12
! or copying GBCEF405.13
integer len_intf_theta_data ! Length of THETA data to be GBCEF405.14
! collected after processing GBCEF405.15
! or copying GBCEF405.16
integer len_intf_qt_data ! Length of QT data to be GBCEF405.17
! collected after processing GBCEF405.18
! or copying GBCEF405.19
integer lbc_address_work(maxproc) ! Address of the work area GBCEF405.20
! on remote PE's GBCEF405.21
integer lbc_address_data(maxproc) ! Address of the data area GBCEF405.22
! on remote PE's GBCEF405.23
integer iaddr_good ! The real address in GBCEF405.24
! intf_data, maintained GBCEF405.25
! correctly across PE's GBCEF405.26
integer iaddr_u ! Address of U in 'intf_data' GBCEF405.27
integer iaddr_theta ! Address of THETA in GBCEF405.28
! 'intf_data' GBCEF405.29
integer iaddr_qt ! Address of QT in 'intf_data' GBCEF405.30
c GBCEF405.31
integer pe_for_level_uv(p_levels) ! PE to work on a given level GBCEF405.32
! for U/V GBCEF405.33
integer pe_for_level_theta(p_levels)! PE to work on a given level GBCEF405.34
! for THETA GBCEF405.35
integer pe_for_level_qt(p_levels) ! PE to work on a given level GBCEF405.36
! for QT GBCEF405.37
integer local_level(p_levels) ! Index of a global level on a GBCEF405.38
! local PE when the levels are GBCEF405.39
! distributed over several PEs GBCEF405.40
integer pe_for_var(intf_lookupsa) ! PE numbers for each variable GBCEF405.41
real t1, t2, t3 ! local Timers GBCEF405.42
c GBCEF405.43
real remote_intf_work(len_intf_p, 2+2*p_levelsda) GBCEF405.44
real remote_intf_data(len_intf_data_da) GBCEF405.45
c GBCEF405.46
pointer (ptr_work, remote_intf_work) GBCEF405.47
pointer (ptr_data, remote_intf_data) GBCEF405.48
c GBCEF405.49
common/lbc_address_workes/ lbc_address_work, lbc_address_data GBCEF405.50
c GBCEF405.51
*IF DEF,TIME_LBC GBCEF405.52
*CALL T3ECLKTK
GBCEF405.53
*ENDIF GBCEF405.54
*ENDIF GBCEF405.55
*ENDIF APB4F401.150
GENINTF1.70
C*L External subroutines called : GENINTF1.71
EXTERNAL SEC2TIME,IOERROR,SETPOS,PACK21,W_LLTOEQ UDG1F400.326
& ,W_EQTOLL,V_INT,BUFFIN,BUFFOUT,P21BITS,H_INT_BL UDG1F400.327
C* DR240293.292
INTEGER EXPPXI APB4F401.151
EXTERNAL EXPPXI APB4F401.152
INTEGER P21BITS DR240293.293
INTEGER N1,N2,N3,N4,N5,NPACK DR240293.294
INTEGER LEN_DATA DR240293.295
*CALL CNTL_IO
GBC5F404.52
c GBC5F404.53
integer GBC5F404.54
& disk_address ! Current rounded disk address GBC5F404.55
&,disk_length ! Current data record length on disk GBC5F404.56
&,len_buf ! Maximum Record length to O/P GBC5F404.57
c GBC5F404.58
C*L Workspace used GENINTF1.81
DR240293.297
C Dynamic allocated workspace @DYALLOC.1006
REAL GENINTF1.82
* intf_data(((len_intf_data_da+um_sector_size-1)/ GBC5F404.59
* um_sector_size)*um_sector_size), GBC5F404.60
* INTF_WORK(LEN_INTF_P,2+2*P_LEVELSDA), GDR1F400.36
* INTF_PSTAR(LEN_INTF_P), DR240293.300
* P_OUT(LEN_INTF_P), DR240293.301
* P_TMP(LEN_INTF_P,P_LEVELSDA), GDR1F400.37
* P_HALF_TMP(LEN_INTF_P,INTF_P_LEVS+1), DR240293.303
* P_EXNER_HALF_TMP(LEN_INTF_P,INTF_P_LEVS+1), DR240293.304
*IF DEF,T3E,AND,DEF,MPP GBCEF405.56
* u_temp(u_fieldda, p_levelsda), GBCEF405.57
* v_temp(u_fieldda, p_levelsda), GBCEF405.58
*ELSE GBCEF405.59
* U_TEMP(U_FIELDDA), ANF1F304.34
* V_TEMP(U_FIELDDA), ANF1F304.35
*ENDIF GBCEF405.60
*IF DEF,MPP APB4F401.153
*IF DEF,T3E GBCEF405.61
& WORK_GLOBAL(WORK_FLD_SIZE, 2), GBCEF405.62
*ELSE GBCEF405.63
& WORK_GLOBAL(WORK_FLD_SIZE), APB4F401.154
*ENDIF GBCEF405.64
*ENDIF APB4F401.155
& A_IO DR240293.307
C Workspace for T3E vector function rtor_v GSS9F402.96
integer n_input ! No. of inputs for rtor_v GSS9F402.97
REAL P_HALF_TMP_wk(LEN_INTF_P,INTF_P_LEVS+1) GSS9F402.98
REAL KAPPA_HALF_wk(LEN_INTF_P,INTF_P_LEVS+1) GSS9F402.99
REAL P_TMP_wk(LEN_INTF_P,P_LEVELSDA) GSS9F402.100
REAL KAPPA_wk(LEN_INTF_P,P_LEVELSDA) GSS9F402.101
cdir$ cache_align intf_data GBC5F404.61
DR240293.308
C*--------------------------------------------------------------------- DR240293.309
INTEGER IP_P,IP_U DR240293.311
CHARACTER*80 STRING ! work array GENINTF1.97
CHARACTER*14 PPNAME ! boundary output filename GENINTF1.98
INTEGER START_ADDR ! Start Address in LOOKUP table APB4F401.156
@DYALLOC.1011
C*--------------------------------------------------------------------- @DYALLOC.1012
C Stash item numbers for interface fields @DYALLOC.1013
C Any change to code generating and testing ITEM_INTFA should also ARB1F404.220
C consider the corresponding use of ITEM_BOUNDA in INBOUND1/CHKLKBA1 ARB1F404.221
INTEGER ITEM_INTFA (INTF_LOOKUPSA) ARB1F404.222
C*--------------------------------------------------------------------- @DYALLOC.1019
C* GENINTF1.99
*CALL P_EXNERC
GENINTF1.100
GENINTF1.101
CL Internal structure: GENINTF1.102
GENINTF1.103
ICODE=0 GENINTF1.104
CMESSAGE=' ' GENINTF1.105
GENINTF1.106
im_ident = internal_model APB4F401.157
im_index = internal_model_index(im_ident) APB4F401.158
LPACK_32B = INTF_PACK(JINTF).EQ.1 GDR1F400.38
LPACK_PPXREF = INTF_PACK(JINTF).EQ.2 APB4F401.159
GDR1F400.39
CL Atmosphere interface GENINTF1.109
GENINTF1.110
C Logical to indicate if model grid is rotated GENINTF1.111
ROT_IN=A_REALHD(5).NE.90..OR.A_REALHD(6).NE.0. GENINTF1.112
GENINTF1.113
! Set up list of variables expected to be boundary updated. ARB1F404.223
ITEM_INTFA(1) = 1 ! Pstar ARB1F404.224
ITEM_INTFA(2) = 2 ! u-compt wind ARB1F404.225
ITEM_INTFA(3) = 3 ! v-compt wind ARB1F404.226
ITEM_INTFA(4) = 5 ! thetal ARB1F404.227
ITEM_INTFA(5) = 11 ! qt ARB1F404.228
IF (TR_VARS .gt. 0) THEN ARB1F404.229
! Find STASH item no. for each tracer in use. ARB1F404.230
I=0 ! count tracers in use ARB1F404.231
DO J = A_TRACER_FIRST,A_TRACER_LAST ARB1F404.232
IF (SI(J,0,im_index).NE.1) THEN ! tracer is in use ARB1F404.233
I = I+1 ARB1F404.234
ITEM_INTFA(5+I) = J ARB1F404.235
END IF ARB1F404.236
END DO ARB1F404.237
! Number of tracers found should correspond to TR_VARS ARB1F404.238
IF (I.NE.TR_VARS) THEN ARB1F404.239
WRITE(6,*)' GEN_INTF_A: no.of tracers found, ',I, ARB1F404.240
& ', differs from TR_VARS, ',TR_VARS ARB1F404.241
CMESSAGE=' GEN_INTF_A: inconsistency in number of tracers' ARB1F404.242
ICODE = 100 ARB1F404.243
GO TO 999 ARB1F404.244
END IF ARB1F404.245
END IF ARB1F404.246
IF (L_LSPICE) THEN ! mixed phase precipitation scheme ARB1F404.247
ITEM_INTFA(6+TR_VARS) = 12 ! qcf (cloud ice) ARB1F404.248
END IF ARB1F404.249
ARB1F404.250
CL 1.0 Generate data on the boundary zone of limited area grid GENINTF1.114
GENINTF1.115
IADDR=1 GENINTF1.116
GENINTF1.117
C Set up pointers to interpolation coefficients for this area DR240293.312
IP_P = 1 DR240293.313
IP_U = 1 DR240293.314
IF (JINTF.GT.1) THEN DR240293.315
DO J=1,JINTF-1 DR240293.316
IP_P = IP_P + LEN_INTFA_P(J) DR240293.317
IP_U = IP_U + LEN_INTFA_U(J) DR240293.318
ENDDO GENINTF1.132
ENDIF GENINTF1.133
*IF DEF,T3E,AND,DEF,MPP GBCEF405.65
c GBCEF405.66
c--check if there are enough processors to use a parallel algorithm GBCEF405.67
c (remember that PE's 0 and 1 hold only U/V data, PE 2 holds GBCEF405.68
c only THETA data, and PE 3 holds only QT data, etc, so that GBCEF405.69
c the vertical interpolations can be done in parallel after GBCEF405.70
c the horizontal gathers and interpolations) GBCEF405.71
GBCEF405.72
if(nproc.lt.max(p_levels+4, intf_lookupsa)) goto 5000 GBCEF405.73
c GBCEF405.74
c--set up the pe data for the multi-level gathers and horizontal GBCEF405.75
c interpolations GBCEF405.76
do i=1, p_levels GBCEF405.77
pe_for_level_uv(i)=i-1 GBCEF405.78
pe_for_level_theta(i)=i+1 GBCEF405.79
pe_for_level_qt(i)=i+2 GBCEF405.80
local_level(i)=1 GBCEF405.81
end do GBCEF405.82
c GBCEF405.83
c--initialise the 'pe_for_var' array (Vertical Interpolation) GBCEF405.84
do i=1, intf_lookupsa GBCEF405.85
pe_for_var(i)=i-1 GBCEF405.86
end do GBCEF405.87
c GBCEF405.88
c--T3E - exchange remote addresses for 'intf_work' GBCEF405.89
ptr_work=loc(intf_work) GBCEF405.90
call shmem_put(
lbc_address_work(mype+1), ptr_work, 1, 0) GBCEF405.91
call barrier(
) GBCEF405.92
c--now get all the remote addresses GBCEF405.93
call shmem_get(
lbc_address_work(1), lbc_address_work(1), nproc, 0) GBCEF405.94
c GBCEF405.95
c--T3E - exchange remote addresses for 'intf_data' GBCEF405.96
ptr_data=loc(intf_data) GBCEF405.97
call shmem_put(
lbc_address_data(mype+1), ptr_data, 1, 0) GBCEF405.98
call barrier(
) GBCEF405.99
c--now get all the remote addresses GBCEF405.100
call shmem_get(
lbc_address_data(1), lbc_address_data(1), nproc, 0) GBCEF405.101
GBCEF405.102
CL 1.0 Generate data on the boundary zone of limited area grid GBCEF405.103
GBCEF405.104
iaddr_good=1 GBCEF405.105
iaddr=iaddr_good GBCEF405.106
GBCEF405.107
CL 1.1 P Star GBCEF405.108
GBCEF405.109
*IF DEF,TIME_LBC GBCEF405.110
t1=rtc() GBCEF405.111
t2=0. GBCEF405.112
t3=rtc() GBCEF405.113
*ENDIF GBCEF405.114
call gather_field_ml
(PSTAR, WORK_GLOBAL, GBCEF405.115
& lasize(1), lasize(2), 1, GBCEF405.116
& glsize(1), glsize(2), 1, GBCEF405.117
& pe_for_level_uv, local_level, GBCEF405.118
& GC_ALL_PROC_GROUP, info) GBCEF405.119
*IF DEF,TIME_LBC GBCEF405.120
if(mype.eq.0) GBCEF405.121
2 write(0,*)'Time for Gather on PSTAR was ', GBCEF405.122
3 (rtc()-t3)/ticks_per_second GBCEF405.123
*ENDIF GBCEF405.124
GBCEF405.125
*IF DEF,TIME_LBC GBCEF405.126
t2=t2-rtc() GBCEF405.127
t3=rtc() GBCEF405.128
*ENDIF GBCEF405.129
IF (mype .EQ. 0) THEN GBCEF405.130
CL 1.1.1 Horizontal interpolation GBCEF405.131
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P GBCEF405.132
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),WORK_GLOBAL GBCEF405.133
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) GBCEF405.134
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) GBCEF405.135
&, INTF_DATA(IADDR)) GBCEF405.136
GBCEF405.137
GBCEF405.138
CL 1.1.2 Save pstar for vertical interpolation GBCEF405.139
IF (INTF_VERT_INTERP(JINTF)) THEN GBCEF405.140
GBCEF405.141
DO I=1,LEN_INTF_P GBCEF405.142
INTF_PSTAR(I)=INTF_DATA(IADDR+I-1) GBCEF405.143
ENDDO GBCEF405.144
ENDIF GBCEF405.145
GBCEF405.146
ENDIF ! IF (mype .EQ. 0) GBCEF405.147
*IF DEF,TIME_LBC GBCEF405.148
if(mype.eq.0) GBCEF405.149
2 write(0,*)'Time for Horizontal on PSTAR was ', GBCEF405.150
3 (rtc()-t3)/ticks_per_second GBCEF405.151
t2=t2+rtc() GBCEF405.152
*ENDIF GBCEF405.153
c GBCEF405.154
c--broadcast this result to everyone GBCEF405.155
call gc_rbcast(
8491, len_intf_p, 0, nproc, info, intf_pstar) GBCEF405.156
c--update the address in 'intf_data' GBCEF405.157
iaddr_good=iaddr_good+len_intf_p GBCEF405.158
GBCEF405.159
iaddr=iaddr_good GBCEF405.160
GBCEF405.161
*IF DEF,TIME_LBC GBCEF405.162
t3=rtc() GBCEF405.163
*ENDIF GBCEF405.164
c--loop over levels GBCEF405.165
do level=1, p_levels GBCEF405.166
GBCEF405.167
CL 1.2 U and V components GBCEF405.168
GBCEF405.169
CL 1.2.1 Rotate winds to standard lat-lon if input grid is rotated. GBCEF405.170
GBCEF405.171
IF (ROT_IN) THEN GBCEF405.172
GBCEF405.173
call w_eqtoll
(coeff3, coeff4, u(1, level), v(1, level), GBCEF405.174
& u_temp(1, level),v_temp(1, level), GBCEF405.175
& u_field, u_field) GBCEF405.176
GBCEF405.177
ELSE GBCEF405.178
GBCEF405.179
DO I=1,U_FIELD GBCEF405.180
u_temp(i, level)=u(i,level) GBCEF405.181
v_temp(i, level)=v(i,level) GBCEF405.182
ENDDO GBCEF405.183
GBCEF405.184
ENDIF GBCEF405.185
GBCEF405.186
end do GBCEF405.187
CL 1.2.2 Horizontal interpolation - winds GBCEF405.188
call gather_field_ml
(U_TEMP, WORK_GLOBAL(1, 1), GBCEF405.189
& lasize(1), lasize(2), p_levels, GBCEF405.190
& glsize(1), glsize(2)-1, 1, GBCEF405.191
& pe_for_level_uv, local_level, GBCEF405.192
& gcg_all, info) GBCEF405.193
GBCEF405.194
call gather_field_ml
(V_TEMP, WORK_GLOBAL(1, 2), GBCEF405.195
& lasize(1), lasize(2), p_levels, GBCEF405.196
& glsize(1), glsize(2)-1, 1, GBCEF405.197
& pe_for_level_uv, local_level, GBCEF405.198
& gc_all_proc_group, info) GBCEF405.199
GBCEF405.200
*IF DEF,TIME_LBC GBCEF405.201
if(mype.eq.pe_for_var(1)) GBCEF405.202
2 write(0,*)'Time for Gather on U was ', GBCEF405.203
3 (rtc()-t3)/ticks_per_second GBCEF405.204
if(mype.eq.pe_for_var(2)) GBCEF405.205
2 write(0,*)'Time for Gather on V was ', GBCEF405.206
3 (rtc()-t3)/ticks_per_second GBCEF405.207
*ENDIF GBCEF405.208
GBCEF405.209
*IF DEF,TIME_LBC GBCEF405.210
t2=t2-rtc() GBCEF405.211
t3=rtc() GBCEF405.212
*ENDIF GBCEF405.213
do level=1, p_levels GBCEF405.214
if(mype.eq.pe_for_level_uv(level)) then GBCEF405.215
GBCEF405.216
CALL H_INT_BL
(glsize(2)-1,glsize(1),LEN_INTF_U GBCEF405.217
&, AU_INDEX_B_L(IP_U),AU_INDEX_B_R(IP_U) GBCEF405.218
&, WORK_GLOBAL(1,1) GBCEF405.219
&, AU_WEIGHT_B_L(IP_U),AU_WEIGHT_B_R(IP_U) GBCEF405.220
&, AU_WEIGHT_T_L(IP_U),AU_WEIGHT_T_R(IP_U) GBCEF405.221
&, INTF_WORK(1,1)) GBCEF405.222
GBCEF405.223
CALL H_INT_BL
(glsize(2)-1,glsize(1),LEN_INTF_U GBCEF405.224
&, AU_INDEX_B_L(IP_U),AU_INDEX_B_R(IP_U) GBCEF405.225
&, WORK_GLOBAL(1,2) GBCEF405.226
&, AU_WEIGHT_B_L(IP_U),AU_WEIGHT_B_R(IP_U) GBCEF405.227
&, AU_WEIGHT_T_L(IP_U),AU_WEIGHT_T_R(IP_U) GBCEF405.228
&, INTF_WORK(1,2)) GBCEF405.229
GBCEF405.230
CALL W_LLTOEQ
(COEFF1(IP_U),COEFF2(IP_U), GBCEF405.231
& INTF_WORK(1,1),INTF_WORK(1,2), GBCEF405.232
& INTF_WORK(1,2+LEVEL), GBCEF405.233
& INTF_WORK(1,2+LEVEL+P_LEVELS), GBCEF405.234
& LEN_INTF_U,LEN_INTF_U) GBCEF405.235
GBCEF405.236
GBCEF405.237
endif GBCEF405.238
end do GBCEF405.239
GBCEF405.240
c--make sure everyone has finished computing their data GBCEF405.241
call barrier(
) GBCEF405.242
c--collect the data on PE zero and one GBCEF405.243
do level=1, p_levels GBCEF405.244
GBCEF405.245
c--U data GBCEF405.246
if(mype.eq.pe_for_var(1)) then GBCEF405.247
ptr_work=lbc_address_work(pe_for_level_uv(level)+1) GBCEF405.248
call shmem_get(
GBCEF405.249
2 intf_work(1, 2+level), GBCEF405.250
3 remote_intf_work(1, 2+level), len_intf_u, GBCEF405.251
4 pe_for_level_uv(level)) GBCEF405.252
endif GBCEF405.253
GBCEF405.254
c--V data GBCEF405.255
if(mype.eq.pe_for_var(2)) then GBCEF405.256
ptr_work=lbc_address_work(pe_for_level_uv(level)+1) GBCEF405.257
call shmem_get(
GBCEF405.258
2 intf_work(1, 2+level+p_levels), GBCEF405.259
3 remote_intf_work(1, 2+level+p_levels), len_intf_u, GBCEF405.260
4 pe_for_level_uv(level)) GBCEF405.261
endif GBCEF405.262
GBCEF405.263
end do GBCEF405.264
call barrier(
) GBCEF405.265
GBCEF405.266
*IF DEF,TIME_LBC GBCEF405.267
t2=t2+rtc() GBCEF405.268
if(mype.eq.pe_for_var(1)) GBCEF405.269
2 write(0,*)'Time for Horizontal on U was ', GBCEF405.270
3 (rtc()-t3)/ticks_per_second GBCEF405.271
if(mype.eq.pe_for_var(2)) GBCEF405.272
2 write(0,*)'Time for Horizontal on V was ', GBCEF405.273
3 (rtc()-t3)/ticks_per_second GBCEF405.274
*ENDIF GBCEF405.275
GBCEF405.276
c GBCEF405.277
c--calculate the input pressure levels which everyone needs GBCEF405.278
if (intf_vert_interp(jintf)) then GBCEF405.279
C set up input level pressures GBCEF405.280
C set up for P points and call V_INT for p points with zero data in GBCEF405.281
C extra non U points GBCEF405.282
do level=1,p_levels GBCEF405.283
do i=1,len_intf_p GBCEF405.284
p_tmp(i,level) = ak(level) + intf_pstar(i)*bk(level) GBCEF405.285
enddo GBCEF405.286
enddo GBCEF405.287
endif GBCEF405.288
GBCEF405.289
c--compute transfer addresses and lengths GBCEF405.290
if (intf_vert_interp(jintf)) then GBCEF405.291
len_intf_uv_data=intf_p_levels(jintf)*len_intf_u GBCEF405.292
else GBCEF405.293
len_intf_uv_data=p_levels*len_intf_u GBCEF405.294
endif GBCEF405.295
c--set up the addresses GBCEF405.296
iaddr_u=iaddr_good GBCEF405.297
iaddr_v=iaddr_good+len_intf_uv_data GBCEF405.298
c--now update 'iaddr_good' GBCEF405.299
iaddr_good=iaddr_good+len_intf_uv_data*2 GBCEF405.300
GBCEF405.301
iaddr=iaddr_good GBCEF405.302
GBCEF405.303
CL 1.3 THETAL GBCEF405.304
GBCEF405.305
CL 1.3.1 Horizontal interpolation - thetal GBCEF405.306
GBCEF405.307
*IF DEF,TIME_LBC GBCEF405.308
t3=rtc() GBCEF405.309
*ENDIF GBCEF405.310
GBCEF405.311
c do level=1, p_levels GBCEF405.312
call gather_field_ml
(theta(1, 1), WORK_GLOBAL(1,1), GBCEF405.313
& lasize(1), lasize(2), p_levels, GBCEF405.314
& glsize(1), glsize(2), 1, GBCEF405.315
& pe_for_level_theta, local_level, GBCEF405.316
& gcg_all, info) GBCEF405.317
c call gather_field(theta(1, level), WORK_GLOBAL(1,1), GBCEF405.318
c & lasize(1), lasize(2), GBCEF405.319
c & glsize(1), glsize(2), GBCEF405.320
c & pe_for_level_theta(level), GBCEF405.321
c & gcg_all, info) GBCEF405.322
c end do GBCEF405.323
GBCEF405.324
*IF DEF,TIME_LBC GBCEF405.325
if(mype.eq.pe_for_var(3)) GBCEF405.326
2 write(0,*)'Time for Gather on THETA was ', GBCEF405.327
3 (rtc()-t3)/ticks_per_second GBCEF405.328
*ENDIF GBCEF405.329
GBCEF405.330
*IF DEF,TIME_LBC GBCEF405.331
t2=t2-rtc() GBCEF405.332
t3=rtc() GBCEF405.333
*ENDIF GBCEF405.334
c--now do the horizontal interpolation in parallel GBCEF405.335
do level=1, p_levels GBCEF405.336
if(mype.eq.pe_for_level_theta(level)) then GBCEF405.337
GBCEF405.338
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P GBCEF405.339
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P) GBCEF405.340
&, WORK_GLOBAL(1,1) GBCEF405.341
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) GBCEF405.342
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) GBCEF405.343
&, INTF_WORK(1,2+LEVEL)) GBCEF405.344
GBCEF405.345
endif GBCEF405.346
end do GBCEF405.347
GBCEF405.348
c--make sure everyone has finished computing their data GBCEF405.349
call barrier(
) GBCEF405.350
c--collect the data on PE two GBCEF405.351
do level=1, p_levels GBCEF405.352
GBCEF405.353
c--THETAL data GBCEF405.354
if(mype.eq.pe_for_var(3)) then GBCEF405.355
ptr_work=lbc_address_work(pe_for_level_theta(level)+1) GBCEF405.356
call shmem_get(
GBCEF405.357
2 intf_work(1, 2+level), GBCEF405.358
3 remote_intf_work(1, 2+level), len_intf_p, GBCEF405.359
4 pe_for_level_theta(level)) GBCEF405.360
endif GBCEF405.361
end do GBCEF405.362
GBCEF405.363
call barrier(
) GBCEF405.364
*IF DEF,TIME_LBC GBCEF405.365
t2=t2+rtc() GBCEF405.366
if(mype.eq.pe_for_var(3)) GBCEF405.367
2 write(0,*)'Time for Horizontal on THETA was ', GBCEF405.368
3 (rtc()-t3)/ticks_per_second GBCEF405.369
*ENDIF GBCEF405.370
GBCEF405.371
c--compute transfer addresses and lengths GBCEF405.372
if (intf_vert_interp(jintf)) then GBCEF405.373
len_intf_theta_data=intf_p_levels(jintf)*len_intf_p GBCEF405.374
else GBCEF405.375
len_intf_theta_data=p_levels*len_intf_p GBCEF405.376
endif GBCEF405.377
iaddr_theta=iaddr_good GBCEF405.378
c--now update 'iaddr_good' GBCEF405.379
iaddr_good=iaddr_good+len_intf_theta_data GBCEF405.380
GBCEF405.381
iaddr=iaddr_good GBCEF405.382
GBCEF405.383
CL 1.4 QT GBCEF405.384
GBCEF405.385
CL 1.4.1 Horizontal interpolation - QT GBCEF405.386
GBCEF405.387
*IF DEF,TIME_LBC GBCEF405.388
t3=rtc() GBCEF405.389
*ENDIF GBCEF405.390
GBCEF405.391
call gather_field_ml
(q(1, 1), WORK_GLOBAL(1,1), GBCEF405.392
& lasize(1), lasize(2), q_levels, GBCEF405.393
& glsize(1), glsize(2), 1, GBCEF405.394
& pe_for_level_qt, local_level, GBCEF405.395
& gcg_all, info) GBCEF405.396
GBCEF405.397
*IF DEF,TIME_LBC GBCEF405.398
if(mype.eq.pe_for_var(4)) GBCEF405.399
2 write(0,*)'Time for Gather on QT was ', GBCEF405.400
3 (rtc()-t3)/ticks_per_second GBCEF405.401
*ENDIF GBCEF405.402
GBCEF405.403
*IF DEF,TIME_LBC GBCEF405.404
t2=t2-rtc() GBCEF405.405
t3=rtc() GBCEF405.406
*ENDIF GBCEF405.407
c--now do the horizontal interpolation in parallel GBCEF405.408
do level=1, q_levels GBCEF405.409
if(mype.eq.pe_for_level_qt(level)) then GBCEF405.410
GBCEF405.411
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P GBCEF405.412
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P) GBCEF405.413
&, WORK_GLOBAL(1,1) GBCEF405.414
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) GBCEF405.415
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) GBCEF405.416
&, INTF_WORK(1,2+LEVEL)) GBCEF405.417
GBCEF405.418
GBCEF405.419
endif GBCEF405.420
end do GBCEF405.421
GBCEF405.422
c--make sure everyone has finished computing their data GBCEF405.423
call barrier(
) GBCEF405.424
c--collect the data on PE three GBCEF405.425
do level=1, q_levels GBCEF405.426
GBCEF405.427
c--QT data GBCEF405.428
if(mype.eq.pe_for_var(4)) then GBCEF405.429
ptr_work=lbc_address_work(pe_for_level_qt(level)+1) GBCEF405.430
call shmem_get(
GBCEF405.431
2 intf_work(1, 2+level), GBCEF405.432
3 remote_intf_work(1, 2+level), len_intf_p, GBCEF405.433
4 pe_for_level_qt(level)) GBCEF405.434
endif GBCEF405.435
GBCEF405.436
end do GBCEF405.437
GBCEF405.438
call barrier(
) GBCEF405.439
*IF DEF,TIME_LBC GBCEF405.440
t2=t2+rtc() GBCEF405.441
if(mype.eq.pe_for_var(4)) GBCEF405.442
2 write(0,*)'Time for Horizontal on QT was ', GBCEF405.443
3 (rtc()-t3)/ticks_per_second GBCEF405.444
GBCEF405.445
if(mype.eq.0) write(0,*)'Time for Horizontal Interpolation was ', GBCEF405.446
2 t2/ticks_per_second GBCEF405.447
*ENDIF GBCEF405.448
GBCEF405.449
c--compute transfer addresses and lengths GBCEF405.450
if (intf_vert_interp(jintf)) then GBCEF405.451
len_intf_qt_data=intf_q_levels(jintf)*len_intf_p GBCEF405.452
else GBCEF405.453
len_intf_qt_data=q_levels*len_intf_p GBCEF405.454
endif GBCEF405.455
iaddr_qt=iaddr_good GBCEF405.456
c--now update 'iaddr_good' GBCEF405.457
iaddr_good=iaddr_good+len_intf_qt_data GBCEF405.458
GBCEF405.459
CL GBCEF405.460
CL Now do the vertical interpolation in parallel GBCEF405.461
CL GBCEF405.462
*IF DEF,TIME_LBC GBCEF405.463
t2=rtc() GBCEF405.464
*ENDIF GBCEF405.465
GBCEF405.466
iaddr=iaddr_u GBCEF405.467
if (mype.eq.pe_for_var(1) .or. mype.eq.pe_for_var(2)) then GBCEF405.468
*IF DEF,TIME_LBC GBCEF405.469
t3=rtc() GBCEF405.470
*ENDIF GBCEF405.471
GBCEF405.472
CL 1.2.3 Vertical interpolation - winds GBCEF405.473
GBCEF405.474
IF (INTF_VERT_INTERP(JINTF)) THEN GBCEF405.475
GBCEF405.476
DO LEVEL=1,P_LEVELS GBCEF405.477
DO I=LEN_INTF_U+1,LEN_INTF_P GBCEF405.478
INTF_WORK(I,2+LEVEL) = 0.0 GBCEF405.479
INTF_WORK(I,2+LEVEL+P_LEVELS) = 0.0 GBCEF405.480
ENDDO GBCEF405.481
ENDDO GBCEF405.482
GBCEF405.483
DO LEVEL=1,INTF_P_LEVELS(JINTF) GBCEF405.484
C set up output level pressure GBCEF405.485
DO I=1,LEN_INTF_P GBCEF405.486
P_OUT(I) = GBCEF405.487
& INTF_AK(LEVEL,JINTF)+ INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) GBCEF405.488
ENDDO GBCEF405.489
GBCEF405.490
if(mype.eq.pe_for_var(1)) GBCEF405.491
& CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_WORK(1,1), GBCEF405.492
& LEN_INTF_P,P_LEVELS,TEMP,TEMP,.FALSE., GBCEF405.493
& 1,LEN_INTF_P) GBCEF405.494
GBCEF405.495
if(mype.eq.pe_for_var(2)) GBCEF405.496
& CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3+P_LEVELS), GBCEF405.497
& INTF_WORK(1,2), GBCEF405.498
& LEN_INTF_P,P_LEVELS,TEMP,TEMP,.FALSE., GBCEF405.499
& 1,LEN_INTF_P) GBCEF405.500
GBCEF405.501
IADDR_V = IADDR + INTF_P_LEVELS(JINTF)*LEN_INTF_U GBCEF405.502
c GBCEF405.503
if(mype.eq.pe_for_var(1)) then GBCEF405.504
do i=1,len_intf_u GBCEF405.505
intf_data(iaddr+i-1) = intf_work(i,1) GBCEF405.506
end do GBCEF405.507
endif GBCEF405.508
GBCEF405.509
if(mype.eq.pe_for_var(2)) then GBCEF405.510
do i=1,len_intf_u GBCEF405.511
intf_data(iaddr_v+i-1) = intf_work(i,2) GBCEF405.512
enddo GBCEF405.513
endif GBCEF405.514
GBCEF405.515
IADDR = IADDR + LEN_INTF_U GBCEF405.516
GBCEF405.517
ENDDO GBCEF405.518
GBCEF405.519
IADDR = IADDR + INTF_P_LEVELS(JINTF)*LEN_INTF_U GBCEF405.520
GBCEF405.521
ELSE GBCEF405.522
GBCEF405.523
DO LEVEL=1,P_LEVELS GBCEF405.524
GBCEF405.525
DO I=1,LEN_INTF_U GBCEF405.526
INTF_DATA(IADDR+I-1) = INTF_WORK(I,2+LEVEL) GBCEF405.527
ENDDO GBCEF405.528
IADDR_V = IADDR + P_LEVELS*LEN_INTF_U GBCEF405.529
DO I=1,LEN_INTF_U GBCEF405.530
INTF_DATA(IADDR_V+I-1)=INTF_WORK(I,2+LEVEL+P_LEVELS) GBCEF405.531
ENDDO GBCEF405.532
IADDR = IADDR + LEN_INTF_U GBCEF405.533
GBCEF405.534
ENDDO GBCEF405.535
GBCEF405.536
IADDR = IADDR + P_LEVELS*LEN_INTF_U GBCEF405.537
GBCEF405.538
ENDIF GBCEF405.539
GBCEF405.540
c--collect the interpolated V data GBCEF405.541
if(mype.eq.pe_for_var(2)) then GBCEF405.542
iaddr_v=iaddr_u+len_intf_uv_data GBCEF405.543
ptr_data=lbc_address_data(1) GBCEF405.544
call shmem_put(
GBCEF405.545
& remote_intf_data(iaddr_v), GBCEF405.546
& intf_data(iaddr_v), len_intf_uv_data, 0) GBCEF405.547
endif GBCEF405.548
GBCEF405.549
*IF DEF,TIME_LBC GBCEF405.550
if(mype.eq.pe_for_var(1)) GBCEF405.551
2 write(0,*)'Time for Vertical on U was ', GBCEF405.552
3 (rtc()-t3)/ticks_per_second GBCEF405.553
if(mype.eq.pe_for_var(2)) GBCEF405.554
2 write(0,*)'Time for Vertical on V was ', GBCEF405.555
3 (rtc()-t3)/ticks_per_second GBCEF405.556
*ENDIF GBCEF405.557
ENDIF ! IF (mype.eq.pe_for_var(1) .or. mype.eq.pe_for_var(2)) GBCEF405.558
GBCEF405.559
GBCEF405.560
iaddr=iaddr_theta GBCEF405.561
if (mype .eq. pe_for_var(3)) then GBCEF405.562
*IF DEF,TIME_LBC GBCEF405.563
t3=rtc() GBCEF405.564
*ENDIF GBCEF405.565
GBCEF405.566
CL 1.3.2 Vertical interpolation - thetal GBCEF405.567
GBCEF405.568
IF(INTF_VERT_INTERP(JINTF)) THEN GBCEF405.569
GBCEF405.570
C input level pressures already set up for winds GBCEF405.571
GBCEF405.572
C Calculate pressure and exner pressure at output half levels GBCEF405.573
DO LEVEL=1,INTF_P_LEVELS(JINTF)+1 GBCEF405.574
DO I=1,LEN_INTF_P GBCEF405.575
P_HALF_TMP(I,LEVEL)= GBCEF405.576
& INTF_AKH(LEVEL,JINTF)+INTF_BKH(LEVEL,JINTF)* GBCEF405.577
& INTF_PSTAR(I) GBCEF405.578
P_HALF_TMP_wk(I,LEVEL)=(P_HALF_TMP(I,LEVEL)/PREF) GBCEF405.579
ENDDO GBCEF405.580
ENDDO GBCEF405.581
*IF DEF,VECTLIB PXVECTLB.9
DO LEVEL=1,INTF_P_LEVELS(JINTF)+1 GBCEF405.582
DO I=1,LEN_INTF_P GBCEF405.583
KAPPA_HALF_wk(I,LEVEL)=KAPPA GBCEF405.584
ENDDO GBCEF405.585
ENDDO GBCEF405.586
n_input=LEN_INTF_P*(INTF_P_LEVELS(JINTF)+1) GBCEF405.587
call rtor_v
GBCEF405.588
& (n_input,P_HALF_TMP_wk,KAPPA_HALF_wk,P_EXNER_HALF_TMP) GBCEF405.589
*ELSE PXVECTLB.10
DO LEVEL=1,INTF_P_LEVELS(JINTF)+1 PXVECTLB.11
DO I=1,LEN_INTF_P PXVECTLB.12
P_EXNER_HALF_TMP(I,LEVEL)=(P_HALF_TMP_wk(I,LEVEL))**KAPPA PXVECTLB.13
ENDDO PXVECTLB.14
ENDDO PXVECTLB.15
*ENDIF PXVECTLB.16
GBCEF405.590
C Convert input theta to temperature GBCEF405.591
DO LEVEL=1,P_LEVELS GBCEF405.592
DO I=1,LEN_INTF_P GBCEF405.593
P_TMP_wk(I,LEVEL)=P_TMP(I,LEVEL)/PREF GBCEF405.594
ENDDO GBCEF405.595
ENDDO GBCEF405.596
*IF DEF,VECTLIB PXVECTLB.17
DO LEVEL=1,P_LEVELS GBCEF405.597
DO I=1,LEN_INTF_P GBCEF405.598
KAPPA_wk(I,LEVEL)=KAPPA GBCEF405.599
ENDDO GBCEF405.600
ENDDO GBCEF405.601
n_input=LEN_INTF_P*P_LEVELS GBCEF405.602
call rtor_v(
n_input,P_TMP_wk,KAPPA_wk,P_TMP_wk) GBCEF405.603
*ELSE PXVECTLB.18
DO LEVEL=1,P_LEVELS PXVECTLB.19
DO I=1,LEN_INTF_P PXVECTLB.20
P_EXNER_HALF_TMP(I,LEVEL)=(P_HALF_TMP_wk(I,LEVEL))**KAPPA PXVECTLB.21
ENDDO PXVECTLB.22
ENDDO PXVECTLB.23
*ENDIF PXVECTLB.24
DO LEVEL=1,P_LEVELS GBCEF405.604
DO I=1,LEN_INTF_P GBCEF405.605
INTF_WORK(I,2+LEVEL)= INTF_WORK(I,2+LEVEL) GBCEF405.606
* *P_TMP_wk(I,LEVEL) GBCEF405.607
ENDDO GBCEF405.608
ENDDO GBCEF405.609
GBCEF405.610
DO LEVEL=1,INTF_P_LEVELS(JINTF) GBCEF405.611
GBCEF405.612
C set up output level pressure GBCEF405.613
DO I=1,LEN_INTF_P GBCEF405.614
P_OUT(I) = GBCEF405.615
& INTF_AK(LEVEL,JINTF)+INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) GBCEF405.616
ENDDO GBCEF405.617
GBCEF405.618
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_DATA(IADDR), GBCEF405.619
& LEN_INTF_P,P_LEVELS,TEMP,TEMP,.FALSE., GBCEF405.620
& 1,LEN_INTF_P) GBCEF405.621
GBCEF405.622
C Convert output temperature to theta GBCEF405.623
GBCEF405.624
DO I=1,LEN_INTF_P GBCEF405.625
INTF_DATA(IADDR+I-1) = INTF_DATA(IADDR+I-1) / GBCEF405.626
* P_EXNER_C(P_EXNER_HALF_TMP(I,LEVEL+1), GBCEF405.627
* P_EXNER_HALF_TMP(I,LEVEL),P_HALF_TMP(I,LEVEL+1), GBCEF405.628
* P_HALF_TMP(I,LEVEL),KAPPA) GBCEF405.629
ENDDO GBCEF405.630
GBCEF405.631
IADDR=IADDR+LEN_INTF_P GBCEF405.632
GBCEF405.633
ENDDO GBCEF405.634
GBCEF405.635
ELSE GBCEF405.636
GBCEF405.637
DO LEVEL=1,P_LEVELS GBCEF405.638
DO I=1,LEN_INTF_P GBCEF405.639
INTF_DATA(IADDR+I-1)=INTF_WORK(I,2+LEVEL) GBCEF405.640
ENDDO GBCEF405.641
IADDR=IADDR+LEN_INTF_P GBCEF405.642
ENDDO GBCEF405.643
GBCEF405.644
ENDIF GBCEF405.645
GBCEF405.646
c--collect the interpolated THETA data GBCEF405.647
ptr_data=lbc_address_data(1) GBCEF405.648
call shmem_put(
GBCEF405.649
& remote_intf_data(iaddr_theta), GBCEF405.650
& intf_data(iaddr_theta), len_intf_theta_data, 0) GBCEF405.651
GBCEF405.652
*IF DEF,TIME_LBC GBCEF405.653
write(0,*)'Time for Vertical on THETA was ', GBCEF405.654
2 (rtc()-t3)/ticks_per_second GBCEF405.655
*ENDIF GBCEF405.656
ENDIF ! IF (mype .EQ. pe_for_var(3)) GBCEF405.657
GBCEF405.658
GBCEF405.659
iaddr=iaddr_qt GBCEF405.660
IF (mype .EQ. pe_for_var(4)) THEN GBCEF405.661
*IF DEF,TIME_LBC GBCEF405.662
t3=rtc() GBCEF405.663
*ENDIF GBCEF405.664
GBCEF405.665
CL 1.4.2 Vertical interpolation - QT GBCEF405.666
GBCEF405.667
IF (INTF_VERT_INTERP(JINTF)) THEN GBCEF405.668
GBCEF405.669
C input level pressures already calculated for thetal GBCEF405.670
GBCEF405.671
DO LEVEL=1,INTF_Q_LEVELS(JINTF) GBCEF405.672
C set up output level pressure GBCEF405.673
DO I=1,LEN_INTF_P GBCEF405.674
P_OUT(I) = GBCEF405.675
& INTF_AK(LEVEL,JINTF)+INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) GBCEF405.676
ENDDO GBCEF405.677
GBCEF405.678
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_DATA(IADDR), GBCEF405.679
& LEN_INTF_P,Q_LEVELS,TEMP,TEMP,.FALSE., GBCEF405.680
& 1,LEN_INTF_P) GBCEF405.681
GBCEF405.682
IADDR=IADDR+LEN_INTF_P GBCEF405.683
GBCEF405.684
ENDDO GBCEF405.685
GBCEF405.686
ELSE GBCEF405.687
GBCEF405.688
DO LEVEL=1,Q_LEVELS GBCEF405.689
DO I=1,LEN_INTF_P GBCEF405.690
INTF_DATA(IADDR+I-1)=INTF_WORK(I,2+LEVEL) GBCEF405.691
ENDDO GBCEF405.692
IADDR=IADDR+LEN_INTF_P GBCEF405.693
ENDDO GBCEF405.694
GBCEF405.695
ENDIF GBCEF405.696
GBCEF405.697
c--collect the interpolated QT data GBCEF405.698
ptr_data=lbc_address_data(1) GBCEF405.699
call shmem_put(
GBCEF405.700
& remote_intf_data(iaddr_qt), GBCEF405.701
& intf_data(iaddr_qt), len_intf_qt_data, 0) GBCEF405.702
GBCEF405.703
*IF DEF,TIME_LBC GBCEF405.704
write(0,*)'Time for Vertical on QT was ', GBCEF405.705
2 (rtc()-t3)/ticks_per_second GBCEF405.706
*ENDIF GBCEF405.707
ENDIF ! IF (mype .EQ. pe_for_var(4)) GBCEF405.708
GBCEF405.709
c--ensure that everyone has sent acress their data GBCEF405.710
call barrier(
) GBCEF405.711
GBCEF405.712
*IF DEF,TIME_LBC GBCEF405.713
if(mype.eq.0) write(0,*)'Time for Vertical Interpolation was ', GBCEF405.714
2 (rtc()-t2)/ticks_per_second GBCEF405.715
GBCEF405.716
if(mype.eq.0) write(0,*)'Time to Collect LBC Variables was ', GBCEF405.717
2 (rtc()-t1)/ticks_per_second GBCEF405.718
*ENDIF GBCEF405.719
GBCEF405.720
c--reset the address for further data (Tracers can be added) GBCEF405.721
iaddr=iaddr_good GBCEF405.722
GBCEF405.723
c--now resume normal processing GBCEF405.724
goto 6000 GBCEF405.725
GBCEF405.726
c--bypass the parallel code if there are not enough processors GBCEF405.727
5000 continue GBCEF405.728
GBCEF405.729
*ENDIF GBCEF405.730
GENINTF1.134
CL 1.1 P Star DR240293.319
GENINTF1.136
*IF DEF,MPP APB4F401.160
CALL GATHER_FIELD
(PSTAR,WORK_GLOBAL, APB4F401.161
& lasize(1),lasize(2), APB4F401.162
& glsize(1),glsize(2), APB4F401.163
& 0,GC_ALL_PROC_GROUP, GPB0F402.187
& info) APB4F401.165
APB4F401.166
IF (mype .EQ. 0) THEN APB4F401.167
*ENDIF APB4F401.168
CL 1.1.1 Horizontal interpolation DR240293.320
*IF -DEF,MPP APB4F401.169
CALL H_INT_BL
(P_ROWS,ROW_LENGTH,LEN_INTF_P UDG1F400.328
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),PSTAR UDG1F400.329
*ELSE APB4F401.170
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P APB4F401.171
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),WORK_GLOBAL APB4F401.172
*ENDIF APB4F401.173
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) UDG1F400.330
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) APB4F401.174
&, INTF_DATA(IADDR)) APB4F401.175
GDR1F400.54
GENINTF1.138
CL 1.1.2 Save pstar for vertical interpolation DR240293.328
IF (INTF_VERT_INTERP(JINTF)) THEN DR240293.329
GENINTF1.140
DO I=1,LEN_INTF_P DR240293.330
INTF_PSTAR(I)=INTF_DATA(IADDR+I-1) APB4F401.176
ENDDO DR240293.332
ENDIF DR240293.333
*IF DEF,MPP APB4F401.177
APB4F401.178
ENDIF ! IF (mype .EQ. 0) APB4F401.179
*ENDIF APB4F401.180
DR240293.334
IADDR=IADDR+LEN_INTF_P APB4F401.181
APB4F401.182
DO LEVEL=1,P_LEVELS DR240293.335
DR240293.336
CL 1.2 U and V components DR240293.337
DR240293.338
CL 1.2.1 Rotate winds to standard lat-lon if input grid is rotated. DR240293.339
DR240293.340
IF (ROT_IN) THEN DR240293.341
DR240293.342
CALL W_EQTOLL
(COEFF3,COEFF4,U(1,LEVEL),V(1,LEVEL), DR240293.343
& U_TEMP,V_TEMP,U_FIELD,U_FIELD) UIE2F401.486
GENINTF1.143
ELSE GENINTF1.144
GENINTF1.145
DO I=1,U_FIELD GENINTF1.146
*IF DEF,T3E,AND,DEF,MPP GBCEF405.731
u_temp(i, 1)=u(i, level) GBCEF405.732
v_temp(i, 1)=v(i, level) GBCEF405.733
*ELSE GBCEF405.734
U_TEMP(I)=U(I,LEVEL) DR240293.344
V_TEMP(I)=V(I,LEVEL) DR240293.345
*ENDIF GBCEF405.735
ENDDO GENINTF1.149
GENINTF1.150
ENDIF GENINTF1.151
GENINTF1.152
CL 1.2.2 Horizontal interpolation - winds DR240293.346
*IF DEF,MPP APB4F401.183
CALL GATHER_FIELD
(U_TEMP,WORK_GLOBAL, APB4F401.184
& lasize(1),lasize(2), APB4F401.185
& glsize(1),glsize(2)-1, APB4F401.186
& 0,GCG_ALL, APB4F401.187
& info) APB4F401.188
APB4F401.189
IF (mype .EQ. 0) THEN APB4F401.190
*ENDIF APB4F401.191
GENINTF1.154
*IF -DEF,MPP APB4F401.192
CALL H_INT_BL
(U_ROWS,ROW_LENGTH,LEN_INTF_U UDG1F400.332
&, AU_INDEX_B_L(IP_U),AU_INDEX_B_R(IP_U),U_TEMP UDG1F400.333
*ELSE APB4F401.193
CALL H_INT_BL
(glsize(2)-1,glsize(1),LEN_INTF_U APB4F401.194
&, AU_INDEX_B_L(IP_U),AU_INDEX_B_R(IP_U),WORK_GLOBAL APB4F401.195
*ENDIF APB4F401.196
&, AU_WEIGHT_B_L(IP_U),AU_WEIGHT_B_R(IP_U) UDG1F400.334
&, AU_WEIGHT_T_L(IP_U),AU_WEIGHT_T_R(IP_U) UDG1F400.335
&, INTF_WORK(1,1)) UDG1F400.336
*IF DEF,MPP APB4F401.197
ENDIF ! IF (mype .EQ. 0) APB4F401.198
APB4F401.199
CALL GATHER_FIELD
(V_TEMP,WORK_GLOBAL, APB4F401.200
& lasize(1),lasize(2), APB4F401.201
& glsize(1),glsize(2)-1, APB4F401.202
& 0,GC_ALL_PROC_GROUP, GPB0F402.188
& info) APB4F401.204
APB4F401.205
IF (mype .EQ. 0) THEN APB4F401.206
*ENDIF APB4F401.207
GENINTF1.158
*IF -DEF,MPP APB4F401.208
CALL H_INT_BL
(U_ROWS,ROW_LENGTH,LEN_INTF_U UDG1F400.337
&, AU_INDEX_B_L(IP_U),AU_INDEX_B_R(IP_U),V_TEMP UDG1F400.338
*ELSE APB4F401.209
CALL H_INT_BL
(glsize(2)-1,glsize(1),LEN_INTF_U APB4F401.210
&, AU_INDEX_B_L(IP_U),AU_INDEX_B_R(IP_U),WORK_GLOBAL APB4F401.211
*ENDIF APB4F401.212
&, AU_WEIGHT_B_L(IP_U),AU_WEIGHT_B_R(IP_U) UDG1F400.339
&, AU_WEIGHT_T_L(IP_U),AU_WEIGHT_T_R(IP_U) UDG1F400.340
&, INTF_WORK(1,2)) UDG1F400.341
GENINTF1.162
CALL W_LLTOEQ
(COEFF1(IP_U),COEFF2(IP_U), DR240293.355
& INTF_WORK(1,1),INTF_WORK(1,2), DR240293.356
& INTF_WORK(1,2+LEVEL),INTF_WORK(1,2+LEVEL+P_LEVELS), DR240293.357
& LEN_INTF_U,LEN_INTF_U) UIE2F401.485
*IF DEF,MPP APB4F401.213
APB4F401.214
ENDIF ! IF (mype .EQ. 0) APB4F401.215
*ENDIF APB4F401.216
GENINTF1.166
ENDDO DR240293.359
*IF DEF,MPP APB4F401.217
APB4F401.218
IF (mype .EQ. 0) THEN APB4F401.219
*ENDIF APB4F401.220
GENINTF1.168
CL 1.2.3 Vertical interpolation - winds DR240293.360
GENINTF1.169
IF (INTF_VERT_INTERP(JINTF)) THEN DR240293.361
GENINTF1.173
C set up input level pressures GENINTF1.174
C set up for P points and call V_INT for p points with zero data in GENINTF1.175
C extra non U points GENINTF1.176
DO LEVEL=1,P_LEVELS DR240293.362
DO I=1,LEN_INTF_P DR240293.363
P_TMP(I,LEVEL) = AK(LEVEL) + INTF_PSTAR(I)*BK(LEVEL) DR240293.364
ENDDO GENINTF1.181
ENDDO DR240293.365
DR240293.366
DO LEVEL=1,P_LEVELS DR240293.367
DO I=LEN_INTF_U+1,LEN_INTF_P DR240293.368
INTF_WORK(I,2+LEVEL) = 0.0 GENINTF1.185
INTF_WORK(I,2+LEVEL+P_LEVELS) = 0.0 GENINTF1.186
ENDDO GENINTF1.187
ENDDO DR240293.369
GENINTF1.189
DO LEVEL=1,INTF_P_LEVELS(JINTF) DR240293.370
C set up output level pressure GENINTF1.191
DO I=1,LEN_INTF_P DR240293.371
P_OUT(I) = DR240293.372
& INTF_AK(LEVEL,JINTF)+ INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) DR240293.373
ENDDO GENINTF1.194
GENINTF1.195
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_WORK(1,1), GENINTF1.196
& LEN_INTF_P,P_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.735
& ,1,LEN_INTF_P) GSM1F405.736
GENINTF1.198
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3+P_LEVELS),INTF_WORK(1,2), GENINTF1.199
& LEN_INTF_P,P_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.737
& ,1,LEN_INTF_P) GSM1F405.738
GENINTF1.201
IADDR_V = IADDR + INTF_P_LEVELS(JINTF)*LEN_INTF_U APB4F401.221
DO I=1,LEN_INTF_U APB4F401.222
INTF_DATA(IADDR+I-1) = INTF_WORK(I,1) APB4F401.223
INTF_DATA(IADDR_V+I-1) = INTF_WORK(I,2) APB4F401.224
ENDDO APB4F401.225
APB4F401.226
IADDR = IADDR + LEN_INTF_U APB4F401.227
GENINTF1.208
ENDDO DR240293.382
GDR1F400.86
IADDR = IADDR + INTF_P_LEVELS(JINTF)*LEN_INTF_U APB4F401.228
GENINTF1.210
ELSE GENINTF1.211
GENINTF1.212
DO LEVEL=1,P_LEVELS GENINTF1.213
GDR1F400.92
DO I=1,LEN_INTF_U APB4F401.229
INTF_DATA(IADDR+I-1) = INTF_WORK(I,2+LEVEL) APB4F401.230
ENDDO APB4F401.231
IADDR_V = IADDR + P_LEVELS*LEN_INTF_U APB4F401.232
DO I=1,LEN_INTF_U APB4F401.233
INTF_DATA(IADDR_V+I-1)=INTF_WORK(I,2+LEVEL+P_LEVELS) APB4F401.234
ENDDO APB4F401.235
IADDR = IADDR + LEN_INTF_U APB4F401.236
GDR1F400.114
ENDDO GENINTF1.220
GENINTF1.221
IADDR = IADDR + P_LEVELS*LEN_INTF_U APB4F401.237
GDR1F400.120
ENDIF GENINTF1.222
*IF DEF,MPP APB4F401.238
ENDIF ! IF (mype .EQ. 0) APB4F401.239
APB4F401.240
*ENDIF APB4F401.241
GENINTF1.225
CL 1.3 THETAL DR240293.390
GENINTF1.227
CL 1.3.1 Horizontal interpolation - thetal DR240293.391
DO LEVEL=1,P_LEVELS DR240293.392
GENINTF1.231
*IF DEF,MPP APB4F401.242
CALL GATHER_FIELD
(THETA(1,LEVEL),WORK_GLOBAL, APB4F401.243
& lasize(1),lasize(2), APB4F401.244
& glsize(1),glsize(2), APB4F401.245
& 0,GC_ALL_PROC_GROUP, GPB0F402.189
& info) APB4F401.247
APB4F401.248
IF (mype .EQ. 0) THEN APB4F401.249
*ENDIF APB4F401.250
APB4F401.251
*IF -DEF,MPP APB4F401.252
CALL H_INT_BL
(P_ROWS,ROW_LENGTH,LEN_INTF_P UDG1F400.342
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),THETA(1,LEVEL) UDG1F400.343
*ELSE APB4F401.253
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P APB4F401.254
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),WORK_GLOBAL APB4F401.255
*ENDIF APB4F401.256
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) UDG1F400.344
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) UDG1F400.345
&, INTF_WORK(1,2+LEVEL)) UDG1F400.346
*IF DEF,MPP APB4F401.257
ENDIF ! IF (mype .EQ. 0) APB4F401.258
APB4F401.259
*ENDIF APB4F401.260
GENINTF1.233
ENDDO DR240293.398
DR240293.399
*IF DEF,MPP APB4F401.261
APB4F401.262
IF (mype .EQ. 0) THEN APB4F401.263
*ENDIF APB4F401.264
CL 1.3.2 Vertical interpolation - thetal DR240293.400
IF(INTF_VERT_INTERP(JINTF)) THEN DR240293.401
GENINTF1.236
C input level pressures already set up for winds GENINTF1.237
GENINTF1.238
C Calculate pressure and exner pressure at output half levels GENINTF1.239
DO LEVEL=1,INTF_P_LEVELS(JINTF)+1 DR240293.402
DO I=1,LEN_INTF_P DR240293.403
P_HALF_TMP(I,LEVEL)= GENINTF1.242
& INTF_AKH(LEVEL,JINTF)+INTF_BKH(LEVEL,JINTF)*INTF_PSTAR(I) DR240293.404
P_HALF_TMP_wk(I,LEVEL)=(P_HALF_TMP(I,LEVEL)/PREF) GSS9F402.102
ENDDO GENINTF1.246
ENDDO GENINTF1.247
*IF DEF,VECTLIB PXVECTLB.25
DO LEVEL=1,INTF_P_LEVELS(JINTF)+1 GSS9F402.104
DO I=1,LEN_INTF_P GSS9F402.105
KAPPA_HALF_wk(I,LEVEL)=KAPPA GSS9F402.106
ENDDO GSS9F402.107
ENDDO GSS9F402.108
n_input=LEN_INTF_P*(INTF_P_LEVELS(JINTF)+1) GSS9F402.109
call rtor_v
GSS9F402.110
& (n_input,P_HALF_TMP_wk,KAPPA_HALF_wk,P_EXNER_HALF_TMP) GSS9F402.111
*ELSE GSS9F402.112
DO LEVEL=1,INTF_P_LEVELS(JINTF)+1 GSS9F402.113
DO I=1,LEN_INTF_P GSS9F402.114
P_EXNER_HALF_TMP(I,LEVEL)=(P_HALF_TMP_wk(I,LEVEL))**KAPPA GSS9F402.115
ENDDO GSS9F402.116
ENDDO GSS9F402.117
*ENDIF GSS9F402.118
GENINTF1.248
C Convert input theta to temperature GENINTF1.249
DO LEVEL=1,P_LEVELS GENINTF1.250
DO I=1,LEN_INTF_P DR240293.405
P_TMP_wk(I,LEVEL)=P_TMP(I,LEVEL)/PREF GSS9F402.119
ENDDO GSS9F402.120
ENDDO GSS9F402.121
*IF DEF,VECTLIB PXVECTLB.26
DO LEVEL=1,P_LEVELS GSS9F402.123
DO I=1,LEN_INTF_P GSS9F402.124
KAPPA_wk(I,LEVEL)=KAPPA GSS9F402.125
ENDDO GSS9F402.126
ENDDO GSS9F402.127
n_input=LEN_INTF_P*P_LEVELS GSS9F402.128
call rtor_v(
n_input,P_TMP_wk,KAPPA_wk,P_TMP_wk) GSS9F402.129
*ELSE GSS9F402.130
DO LEVEL=1,P_LEVELS GSS9F402.131
DO I=1,LEN_INTF_P GSS9F402.132
P_TMP_wk(I,LEVEL)=P_TMP_wk(I,LEVEL)**KAPPA GSS9F402.133
ENDDO GSS9F402.134
ENDDO GSS9F402.135
*ENDIF GSS9F402.136
DO LEVEL=1,P_LEVELS GSS9F402.137
DO I=1,LEN_INTF_P GSS9F402.138
INTF_WORK(I,2+LEVEL)= INTF_WORK(I,2+LEVEL) GENINTF1.252
* *P_TMP_wk(I,LEVEL) GSS9F402.139
ENDDO GENINTF1.254
ENDDO GENINTF1.255
GENINTF1.256
DO LEVEL=1,INTF_P_LEVELS(JINTF) DR240293.406
GENINTF1.258
C set up output level pressure GENINTF1.259
DO I=1,LEN_INTF_P DR240293.407
P_OUT(I) = DR240293.408
& INTF_AK(LEVEL,JINTF)+INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) DR240293.409
ENDDO GENINTF1.262
GENINTF1.263
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_DATA(IADDR), APB4F401.265
& LEN_INTF_P,P_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.739
& ,1,LEN_INTF_P) GSM1F405.740
GENINTF1.266
GSM1F405.741
C Convert output temperature to theta GENINTF1.267
GENINTF1.268
DO I=1,LEN_INTF_P DR240293.411
INTF_DATA(IADDR+I-1) = INTF_DATA(IADDR+I-1) / APB4F401.266
* P_EXNER_C(P_EXNER_HALF_TMP(I,LEVEL+1), GENINTF1.271
* P_EXNER_HALF_TMP(I,LEVEL),P_HALF_TMP(I,LEVEL+1), GENINTF1.272
* P_HALF_TMP(I,LEVEL),KAPPA) GENINTF1.273
ENDDO GENINTF1.274
GENINTF1.275
IADDR=IADDR+LEN_INTF_P APB4F401.267
GENINTF1.279
ENDDO DR240293.415
GENINTF1.281
ELSE GENINTF1.282
GENINTF1.283
DO LEVEL=1,P_LEVELS GENINTF1.284
DO I=1,LEN_INTF_P APB4F401.268
INTF_DATA(IADDR+I-1)=INTF_WORK(I,2+LEVEL) APB4F401.269
ENDDO APB4F401.270
IADDR=IADDR+LEN_INTF_P APB4F401.271
ENDDO GENINTF1.288
GENINTF1.289
ENDIF GENINTF1.290
*IF DEF,MPP APB4F401.272
ENDIF ! IF (mype .EQ. 0) APB4F401.273
APB4F401.274
*ENDIF APB4F401.275
GENINTF1.291
CL 1.4 QT DR240293.419
GENINTF1.293
CL 1.4.1 Horizontal interpolation - QT DR240293.420
DO LEVEL=1,Q_LEVELS DR240293.421
GENINTF1.297
*IF DEF,MPP APB4F401.276
CALL GATHER_FIELD
(Q(1,LEVEL),WORK_GLOBAL, APB4F401.277
& lasize(1),lasize(2), APB4F401.278
& glsize(1),glsize(2), APB4F401.279
& 0,GC_ALL_PROC_GROUP, GPB0F402.190
& info) APB4F401.281
APB4F401.282
IF (mype .EQ. 0) THEN APB4F401.283
*ENDIF APB4F401.284
APB4F401.285
*IF -DEF,MPP APB4F401.286
CALL H_INT_BL
(P_ROWS,ROW_LENGTH,LEN_INTF_P UDG1F400.347
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),Q(1,LEVEL) UDG1F400.348
*ELSE APB4F401.287
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P APB4F401.288
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),WORK_GLOBAL APB4F401.289
*ENDIF APB4F401.290
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) UDG1F400.349
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) UDG1F400.350
&, INTF_WORK(1,2+LEVEL)) UDG1F400.351
GENINTF1.299
*IF DEF,MPP APB4F401.291
ENDIF ! IF (mype .EQ. 0) APB4F401.292
APB4F401.293
*ENDIF APB4F401.294
ENDDO DR240293.427
*IF DEF,MPP APB4F401.295
APB4F401.296
IF (mype .EQ. 0) THEN APB4F401.297
*ENDIF APB4F401.298
DR240293.428
CL 1.4.2 Vertical interpolation - QT DR240293.429
IF (INTF_VERT_INTERP(JINTF)) THEN DR240293.430
GENINTF1.302
C input level pressures already calculated for thetal GENINTF1.303
GENINTF1.304
DO LEVEL=1,INTF_Q_LEVELS(JINTF) DR240293.431
C set up output level pressure GENINTF1.306
DO I=1,LEN_INTF_P DR240293.432
P_OUT(I) = DR240293.433
& INTF_AK(LEVEL,JINTF)+INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) DR240293.434
ENDDO GENINTF1.309
GENINTF1.310
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_DATA(IADDR), APB4F401.299
& LEN_INTF_P,Q_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.742
& ,1,LEN_INTF_P) GSM1F405.743
GENINTF1.313
IADDR=IADDR+LEN_INTF_P APB4F401.300
GENINTF1.314
ENDDO DR240293.439
GENINTF1.320
ELSE GENINTF1.321
GENINTF1.322
DO LEVEL=1,Q_LEVELS GENINTF1.323
DO I=1,LEN_INTF_P APB4F401.301
INTF_DATA(IADDR+I-1)=INTF_WORK(I,2+LEVEL) APB4F401.302
ENDDO APB4F401.303
IADDR=IADDR+LEN_INTF_P APB4F401.304
ENDDO GENINTF1.327
GENINTF1.328
ENDIF GENINTF1.329
*IF DEF,MPP APB4F401.305
ENDIF ! IF (mype .EQ. 0) APB4F401.306
APB4F401.307
*ENDIF APB4F401.308
GENINTF1.330
CL 1.5 TRACERS DR240293.443
*IF DEF,T3E,AND,DEF,MPP GBCEF405.736
GBCEF405.737
c--resume collective processing GBCEF405.738
6000 continue GBCEF405.739
GBCEF405.740
*ENDIF GBCEF405.741
GENINTF1.331
IF (TR_VARS.GT.0) THEN GENINTF1.332
GENINTF1.335
DO VAR=1,TR_VARS DR240293.444
GENINTF1.340
CL 1.5.1 Horizontal interpolation - tracers DR240293.445
GENINTF1.342
DO LEVEL=1,TR_LEVELS DR240293.446
DR240293.447
*IF DEF,MPP APB4F401.309
CALL GATHER_FIELD
(TRACER(VAR,LEVEL),WORK_GLOBAL, APB4F401.310
& lasize(1),lasize(2), APB4F401.311
& glsize(1),glsize(2), APB4F401.312
& 0,GC_ALL_PROC_GROUP, GPB0F402.191
& info) APB4F401.314
APB4F401.315
IF (mype .EQ. 0) THEN APB4F401.316
APB4F401.317
*ENDIF APB4F401.318
APB4F401.319
*IF -DEF,MPP APB4F401.320
CALL H_INT_BL
(P_ROWS,ROW_LENGTH,LEN_INTF_P UDG1F400.352
*ELSE APB4F401.321
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P APB4F401.322
*ENDIF APB4F401.323
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P) UDG1F400.353
*IF -DEF,MPP APB4F401.324
&, TRACER((VAR-1)*P_FIELD+1,LEVEL) UDG1F400.354
*ELSE APB4F401.325
&, WORK_GLOBAL APB4F401.326
*ENDIF APB4F401.327
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) UDG1F400.355
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) UDG1F400.356
&, INTF_WORK(1,2+LEVEL)) UDG1F400.357
DR240293.453
*IF DEF,MPP APB4F401.328
ENDIF ! IF (mype .EQ. 0) APB4F401.329
APB4F401.330
*ENDIF APB4F401.331
APB4F401.332
ENDDO DR240293.454
*IF DEF,MPP APB4F401.333
APB4F401.334
IF (mype .EQ. 0) THEN APB4F401.335
*ENDIF APB4F401.336
DR240293.455
CL 1.5.2 Vertical interpolation - tracers DR240293.456
DR240293.457
IF (INTF_VERT_INTERP(JINTF)) THEN DR240293.458
GENINTF1.345
C input level pressures already calculated GENINTF1.346
GENINTF1.347
DO LEVEL=INTF_P_LEVELS(JINTF)-INTF_TR_LEVELS(JINTF)+1, DR240293.459
& INTF_P_LEVELS(JINTF) GDR2F400.4
C set up output level pressure GENINTF1.349
DO I=1,LEN_INTF_P DR240293.461
P_OUT(I) = DR240293.462
& INTF_AK(LEVEL,JINTF)+INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) DR240293.463
ENDDO GENINTF1.352
GENINTF1.353
CALL V_INT
(P_TMP(1,P_LEVELS-TR_LEVELS+1), DR240293.464
& P_OUT,INTF_WORK(1,3),INTF_DATA(IADDR), APB4F401.337
& LEN_INTF_P,TR_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.744
& ,1,LEN_INTF_P) GSM1F405.745
GENINTF1.357
IADDR=IADDR+LEN_INTF_P APB4F401.338
DR240293.469
ENDDO DR240293.470
GENINTF1.363
ELSE GENINTF1.364
GENINTF1.365
DO LEVEL=1,TR_LEVELS GENINTF1.366
DO I=1,LEN_INTF_P APB4F401.339
INTF_DATA(IADDR+I-1)=INTF_WORK(I,2+LEVEL) APB4F401.340
ENDDO APB4F401.341
IADDR=IADDR+LEN_INTF_P APB4F401.342
ENDDO GENINTF1.370
ENDIF GENINTF1.372
*IF DEF,MPP APB4F401.343
ENDIF ! IF (mype .EQ. 0) APB4F401.344
APB4F401.345
*ENDIF APB4F401.346
GENINTF1.373
ENDDO DR240293.474
ENDIF GENINTF1.375
GENINTF1.376
CL 1.6 QCF ARB1F404.251
ARB1F404.252
IF (L_LSPICE) THEN ! mixed phase precipitation scheme ARB1F404.253
ARB1F404.254
CL 1.6.1 Horizontal interpolation - QCF ARB1F404.255
DO LEVEL=1,Q_LEVELS ARB1F404.256
ARB1F404.257
*IF DEF,MPP ARB1F404.258
CALL GATHER_FIELD
(QCF(1,LEVEL),WORK_GLOBAL, ARB1F404.259
& lasize(1),lasize(2), ARB1F404.260
& glsize(1),glsize(2), ARB1F404.261
& 0,GC_ALL_PROC_GROUP, ARB1F404.262
& info) ARB1F404.263
ARB1F404.264
IF (mype .EQ. 0) THEN ARB1F404.265
*ENDIF ARB1F404.266
ARB1F404.267
*IF -DEF,MPP ARB1F404.268
CALL H_INT_BL
(P_ROWS,ROW_LENGTH,LEN_INTF_P ARB1F404.269
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),QCF(1,LEVEL) ARB1F404.270
*ELSE ARB1F404.271
CALL H_INT_BL
(glsize(2),glsize(1),LEN_INTF_P ARB1F404.272
&, AP_INDEX_B_L(IP_P),AP_INDEX_B_R(IP_P),WORK_GLOBAL ARB1F404.273
*ENDIF ARB1F404.274
&, AP_WEIGHT_B_L(IP_P),AP_WEIGHT_B_R(IP_P) ARB1F404.275
&, AP_WEIGHT_T_L(IP_P),AP_WEIGHT_T_R(IP_P) ARB1F404.276
&, INTF_WORK(1,2+LEVEL)) ARB1F404.277
ARB1F404.278
*IF DEF,MPP ARB1F404.279
ENDIF ! IF (mype .EQ. 0) ARB1F404.280
ARB1F404.281
*ENDIF ARB1F404.282
ENDDO ARB1F404.283
*IF DEF,MPP ARB1F404.284
ARB1F404.285
IF (mype .EQ. 0) THEN ARB1F404.286
*ENDIF ARB1F404.287
ARB1F404.288
CL 1.6.2 Vertical interpolation - QCF ARB1F404.289
IF (INTF_VERT_INTERP(JINTF)) THEN ARB1F404.290
ARB1F404.291
C input level pressures already calculated for thetal ARB1F404.292
ARB1F404.293
DO LEVEL=1,INTF_Q_LEVELS(JINTF) ARB1F404.294
C set up output level pressure ARB1F404.295
DO I=1,LEN_INTF_P ARB1F404.296
P_OUT(I) = ARB1F404.297
& INTF_AK(LEVEL,JINTF)+INTF_PSTAR(I)*INTF_BK(LEVEL,JINTF) ARB1F404.298
ENDDO ARB1F404.299
ARB1F404.300
CALL V_INT
(P_TMP,P_OUT,INTF_WORK(1,3),INTF_DATA(IADDR), ARB1F404.301
& LEN_INTF_P,Q_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.746
& ,1,LEN_INTF_P) GSM1F405.747
ARB1F404.303
IADDR=IADDR+LEN_INTF_P ARB1F404.304
ARB1F404.305
ENDDO ARB1F404.306
ARB1F404.307
ELSE ARB1F404.308
ARB1F404.309
DO LEVEL=1,Q_LEVELS ARB1F404.310
DO I=1,LEN_INTF_P ARB1F404.311
INTF_DATA(IADDR+I-1)=INTF_WORK(I,2+LEVEL) ARB1F404.312
ENDDO ARB1F404.313
IADDR=IADDR+LEN_INTF_P ARB1F404.314
ENDDO ARB1F404.315
ARB1F404.316
ENDIF ARB1F404.317
*IF DEF,MPP ARB1F404.318
ENDIF ! IF (mype .EQ. 0) ARB1F404.319
ARB1F404.320
*ENDIF ARB1F404.321
END IF ! IF (L_LSPICE) - mixed phase precip scheme ARB1F404.322
ARB1F404.323
CL 2.0 Update Information in Headers DR240293.475
GENINTF1.377
CL Open boundary output file if reinitialised during run DR240293.476
DR240293.477
IF (FT_STEPS(NFTOUT).GT.0) THEN GENINTF1.383
STRING=MODEL_FT_UNIT(NFTOUT) GENINTF1.384
PPNAME=STRING(18:31) GENINTF1.385
LEN_PPNAME=LEN(PPNAME) GENINTF1.386
CALL FILE_OPEN
(NFTOUT,PPNAME,LEN_PPNAME,1,1,ICODE) GPB1F305.36
IF (ICODE.NE.0) THEN DR240293.478
CMESSAGE="GEN_INTF: Error opening preassigned boundary file" DR240293.479
GO TO 999 ! Return DR240293.480
ENDIF DR240293.481
GENINTF1.389
C Determine position where to Buffer out data to DR240293.482
GENINTF1.391
NTIME=FT_LASTFIELD(NFTOUT)+1 GENINTF1.392
ELSE GENINTF1.393
NTIME=FT_LASTFIELD(NFTOUT)+1 GENINTF1.394
C A_IO=UNIT(NFTOUT) ! Only valid with CRAY-specific BUFFER IN/OUT RB120293.2
GENINTF1.396
ENDIF GENINTF1.397
GENINTF1.398
CL 2.1 Fixed length header DR240293.483
FIXHD_INTFA(152,JINTF) = INTF_LOOKUPSA*NTIME DR240293.484
FIXHD_INTFA(161,JINTF) = LEN_INTF_DATA*NTIME GDG2F304.4
GENINTF1.400
CL 2.2 Integer Constants DR240293.486
INTHD_INTFA(3,JINTF) = NTIME DR240293.487
DR240293.488
CL 2.3 LOOKUP Table APB4F401.355
APB4F401.356
C Determine position in LOOKUP table DR240293.490
LOOKUP_START=FIXHD_INTFA(150,JINTF) + DR240293.491
& FIXHD_INTFA(151,JINTF)*INTF_LOOKUPSA*(NTIME-1) - 1 DR240293.492
DR240293.493
c GBC5F404.62
c--for well-formed I/O, we must read back the GBC5F404.63
c last lookup table entry on disk GBC5F404.64
c GBC5F404.65
if(ntime.ne.1) then GBC5F404.66
call setpos
(nftout, lookup_start-len1_lookup, icode) GBC5F404.67
call buffin
(nftout, lookup_intfa(1, 1, jintf), len1_lookup, GBC5F404.68
& len_io, a_io) GBC5F404.69
c--check for errors GBC5F404.70
if(a_io.ne.-1.0 .or. len_io.ne.len1_lookup) then GBC5F404.71
call ioerror
('GEN_INTF_A: Buffer in of Last Lookup Header', GBC5F404.72
& a_io, len_io, len1_lookup) GBC5F404.73
cmessage=' GEN_INTF_A: I/O Error on Read' GBC5F404.74
icode=5 GBC5F404.75
goto 999 GBC5F404.76
endif GBC5F404.77
c--compute the new disk address from the last address and length GBC5F404.78
disk_address=lookup_intfa(lbegin, 1, jintf)+ GBC5F404.79
& lookup_intfa(lbnrec, 1, jintf) GBC5F404.80
else GBC5F404.81
disk_address=fixhd_intfa(160, jintf)-1 GBC5F404.82
endif GBC5F404.83
c--round this disk to ensure we start on a sector boundary GBC5F404.84
disk_address=((disk_address+um_sector_size-1)/ GBC5F404.85
& um_sector_size)*um_sector_size GBC5F404.86
c--zero the maximum output record size GBC5F404.87
len_buf=0 GBC5F404.88
C Check that there is enough space for this entry in LOOKUP table DR240293.494
IF (FIXHD_INTFA(150,JINTF)+ DR240293.495
& FIXHD_INTFA(151,JINTF)*FIXHD_INTFA(152,JINTF).GT. DR240293.496
& FIXHD_INTFA(160,JINTF)) THEN DR240293.497
CMESSAGE=' GEN_INTF: Insufficient space for headers in boundary DR240293.498
& dataset.' DR240293.499
ICODE=1 GENINTF1.411
GO TO 999 ! Return DR240293.500
ENDIF DR240293.501
GENINTF1.414
START_ADDR = FIXHD_INTFA(161,JINTF)-LEN_INTF_DATA+1 APB4F401.357
APB4F401.358
DO VAR=1,INTF_LOOKUPSA DR240293.502
GENINTF1.415
C Set STASHCODE for variable required for interfacing DR240293.503
DR240293.504
CODE=ITEM_INTFA(VAR) DR240293.505
DR240293.506
DO I=1,LEN1_LOOKUP DR240293.507
LOOKUP_INTFA(I,VAR,JINTF)=A_LOOKUP(I,PPINDEX(CODE,im_index)) APB4F401.359
ENDDO DR240293.509
DR240293.510
SEC = STEPim(a_im) * SECS_PER_PERIODim(a_im) / GDR3F305.203
& STEPS_PER_PERIODim(a_im) GDR3F305.204
DR240293.512
CALL SEC2TIME
(0,SEC,BASIS_TIME_DAYS,BASIS_TIME_SECS, TJ080294.259
& YY,MM,DD,HR,MN,SS,DAY_NO,LCAL360) GSS1F304.330
DR240293.514
C Validity time of this field DR240293.515
LOOKUP_INTFA(LBYR ,VAR,JINTF) = YY DR240293.516
LOOKUP_INTFA(LBMON,VAR,JINTF) = MM DR240293.517
LOOKUP_INTFA(LBDAT,VAR,JINTF) = DD DR240293.518
LOOKUP_INTFA(LBHR ,VAR,JINTF) = HR DR240293.519
LOOKUP_INTFA(LBMIN,VAR,JINTF) = MN DR240293.520
LOOKUP_INTFA(LBDAY,VAR,JINTF) = DAY_NO DR240293.521
DR240293.522
LOOKUP_INTFA(LBYRD ,VAR,JINTF) = A_FIXHD(21) DR240293.523
LOOKUP_INTFA(LBMOND,VAR,JINTF) = A_FIXHD(22) DR240293.524
LOOKUP_INTFA(LBDATD,VAR,JINTF) = A_FIXHD(23) DR240293.525
LOOKUP_INTFA(LBHRD ,VAR,JINTF) = A_FIXHD(24) DR240293.526
LOOKUP_INTFA(LBMIND,VAR,JINTF) = A_FIXHD(25) DR240293.527
LOOKUP_INTFA(LBDAYD,VAR,JINTF) = A_FIXHD(27) DR240293.528
DR240293.529
!! GENERALISED FOR MIXED PHASE PRECIP SCHEME ARB1F404.324
IF(VAR.EQ.1) THEN DR240293.530
LEN_DATA = LEN_INTF_P DR240293.531
ELSE IF(VAR.EQ.2.OR.VAR.EQ.3) THEN DR240293.532
LEN_DATA = LEN_INTF_U*INTF_P_LEVELS(JINTF) DR240293.533
ELSE IF(VAR.EQ.4) THEN DR240293.534
LEN_DATA = LEN_INTF_P*INTF_P_LEVELS(JINTF) DR240293.535
ELSE IF(VAR.EQ.5) THEN DR240293.536
LEN_DATA = LEN_INTF_P*INTF_Q_LEVELS(JINTF) DR240293.537
ELSE IF(VAR.GT.5 .AND. CODE.GT.60) THEN ARB1F404.325
LEN_DATA = LEN_INTF_P*INTF_TR_LEVELS(JINTF) DR240293.539
ELSE IF(VAR.GT.5 .AND. CODE.EQ.12) THEN ARB1F404.326
LEN_DATA = LEN_INTF_P*INTF_Q_LEVELS(JINTF) ARB1F404.327
END IF DR240293.540
LOOKUP_INTFA(LBLREC,VAR,JINTF) = LEN_DATA DR240293.541
C New packing information from UM Version 2.8 DR240293.542
N1 = 0 ! Data not packed GDR1F400.181
IF (LPACK_32B) N1 = 2 ! Data packed as 32 bits GDR1F400.182
IF (LPACK_PPXREF) THEN APB4F401.360
N1 = EXPPXI
(atmos_im,0,item_intfa(var),ppx_dump_packing, APB4F401.361
*CALL ARGPPX
APB4F401.362
& icode,cmessage) APB4F401.363
ENDIF APB4F401.364
N2 = 0 ! Data not compressed DR240293.544
N3 = 0 ! Compression definition DR240293.545
N4 = 0 ! Number format DR240293.546
N5 = 0 ! Not used DR240293.547
NPACK = N5*10000 + N4*1000 +N3*100 + N2*10 + N1 DR240293.548
LOOKUP_INTFA(LBPACK,VAR,JINTF)= NPACK DR240293.549
c GBC5F404.89
c--make sure that the LBC complete record is well formed GBC5F404.90
c GBC5F404.91
c--set the disk address GBC5F404.92
lookup_intfa(lbegin, var, jintf)=disk_address GBC5F404.93
c--fetch the data field length, allowing for packing GBC5F404.94
if(mod(lookup_intfa(lbpack, var, jintf), 10).eq.2) then GBC5F404.95
disk_length=(lookup_intfa(lblrec, var, jintf)+1)/2 GBC5F404.96
else GBC5F404.97
disk_length=lookup_intfa(lblrec, var, jintf) GBC5F404.98
endif GBC5F404.99
c--update the maximum record size GBC5F404.100
len_buf=len_buf+disk_length GBC5F404.101
c--store the rounded-up length GBC5F404.102
lookup_intfa(lbnrec, var, jintf)=disk_length GBC5F404.103
c--update the disk address GBC5F404.104
disk_address=disk_address+disk_length GBC5F404.105
LOOKUP_INTFA(LBCODE,VAR,JINTF)=1 DR240293.550
IF(VAR.EQ.2.OR.VAR.EQ.3) THEN DR240293.551
LOOKUP_INTFA(LBCODE,VAR,JINTF)=2 DR240293.552
END IF DR240293.553
LOOKUP_INTFA(LBHEM,VAR,JINTF)=99 DR240293.554
LOOKUP_INTFA(LBROW,VAR,JINTF)=INTFWIDTHA(JINTF) DR240293.555
LOOKUP_INTFA(LBNPT,VAR,JINTF)=LEN_INTF_P/INTFWIDTHA(JINTF) DR240293.556
IF (VAR.EQ.2.OR.VAR.EQ.3) THEN DR240293.557
LOOKUP_INTFA(LBNPT,VAR,JINTF)=LEN_INTF_U/INTFWIDTHA(JINTF) DR240293.558
END IF DR240293.559
LOOKUP_INTFA(LBLEV,VAR,JINTF)=-1 DR240293.560
LOOKUP_INTFA(NADDR,VAR,JINTF) = START_ADDR APB4F401.365
START_ADDR = START_ADDR + LOOKUP_INTFA(LBLREC,VAR,JINTF) APB4F401.366
DR240293.563
ENDDO DR240293.564
DR240293.565
APB4F401.367
CL 3.0 Pack data as required APB4F401.368
APB4F401.369
IADDR = 1 APB4F401.370
LEN_DATA = 0 APB4F401.371
DO VAR = 1,INTF_LOOKUPSA APB4F401.372
IF (MOD(LOOKUP_INTFA(LBPACK,VAR,JINTF),10).EQ.2) THEN APB4F401.373
*IF DEF,MPP GPB5F403.45
IF (mype .EQ. 0) THEN GPB5F403.46
*ENDIF GPB5F403.47
CALL PACK21
(LOOKUP_INTFA(LBLREC,VAR,JINTF), APB4F401.374
& INTF_DATA(IADDR),INTF_DATA(LEN_DATA+1), APB4F401.375
& P21BITS
(FIXHD_INTFA(12,JINTF))) APB4F401.376
*IF DEF,MPP GPB5F403.48
ENDIF GPB5F403.49
*ENDIF GPB5F403.50
c--the (+1) in the expression below is unnecessary, since GBC5F404.110
c LBC data is composed of two rows NS and two rows EW, and GBC5F404.111
c thus always has an even number of data points. If this GBC5F404.112
c is not true, then READFLDS will either get the data one GBC5F404.113
c out downwards if the (+1) is omitted, or one word upwards GBC5F404.114
c if the (+1) is added. In other words, the packing will GBC5F404.115
c cause either one word to be omitted or one word added in GBC5F404.116
c the data after the read. This is because READFLDS reads GBC5F404.117
c and converts the whole LBC record at one go, rather than GBC5F404.118
c as a series of separate records. GBC5F404.119
len_data = len_data+(lookup_intfa(lblrec,var,jintf)+1)/2 GBC5F404.120
c--check that we are not packing an odd nuber of words GBC5F404.121
if((lookup_intfa(lblrec,var,jintf)/2)*2 .ne. GBC5F404.122
& lookup_intfa(lblrec,var,jintf)) then GBC5F404.123
write(6,7734) lookup_intfa(lblrec,var,jintf) GBC5F404.124
7734 format(/'LBC Data contains ',i10,' Words, which is', GBC5F404.125
& ' an Odd Number which is not allowed for 32-bit', GBC5F404.126
& ' Packing') GBC5F404.127
*IF DEF,T3E,AND,DEF,MPP GBC5F404.128
if(mype.eq.0) then GBC5F404.129
write(6,7734) lookup_intfa(lblrec,var,jintf) GBC5F404.130
endif GBC5F404.131
*ENDIF GBC5F404.132
endif GBC5F404.133
ELSE APB4F401.378
IF (LEN_DATA+1.LT.IADDR) THEN APB4F401.379
*IF DEF,MPP GPB5F403.51
IF (mype .EQ. 0) THEN GPB5F403.52
*ENDIF GPB5F403.53
DO J = 1,LOOKUP_INTFA(LBLREC,VAR,JINTF) APB4F401.380
INTF_DATA(LEN_DATA+J) = INTF_DATA(IADDR+J-1) APB4F401.381
ENDDO APB4F401.382
*IF DEF,MPP GPB5F403.54
ENDIF GPB5F403.55
*ENDIF GPB5F403.56
ENDIF APB4F401.383
LEN_DATA = LEN_DATA+LOOKUP_INTFA(LBLREC,VAR,JINTF) APB4F401.384
ENDIF APB4F401.385
IADDR = IADDR+LOOKUP_INTFA(LBLREC,VAR,JINTF) APB4F401.386
ENDDO APB4F401.387
CL 4.0 Write out headers/data DR240293.566
DR240293.567
CL 4.1 Fixed length header DR240293.568
GENINTF1.417
IADDR = 0 GENINTF1.418
CALL SETPOS
(NFTOUT,IADDR,ICODE) GTD0F400.79
CALL BUFFOUT
(NFTOUT,FIXHD_INTFA(1,JINTF),LEN_FIXHD,LEN_IO,A_IO) DR240293.570
GENINTF1.421
C Check for I/O Errors GENINTF1.422
GENINTF1.423
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN GENINTF1.424
CALL IOERROR
('buffer out of fixed length header',A_IO,LEN_IO, GENINTF1.425
& LEN_FIXHD) GENINTF1.426
CMESSAGE=' GEN_INTF: I/O ERROR ' GENINTF1.427
ICODE=2 GENINTF1.428
GO TO 999 ! Return DR240293.571
END IF GENINTF1.430
GENINTF1.431
CL 4.2 Integer constants DR240293.572
GENINTF1.433
CALL BUFFOUT
(NFTOUT,INTHD_INTFA(1,JINTF), DR240293.573
& PP_LEN_INTHD,LEN_IO,A_IO) DR240293.574
GENINTF1.435
C Check for I/O Errors GENINTF1.436
GENINTF1.437
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.PP_LEN_INTHD) THEN GENINTF1.438
CALL IOERROR
('buffer out of integer header',A_IO,LEN_IO, RB120293.3
& PP_LEN_INTHD) GENINTF1.440
CMESSAGE=' GEN_INTF: I/O ERROR ' GENINTF1.441
ICODE=3 GENINTF1.442
GO TO 999 ! Return DR240293.575
END IF GENINTF1.444
GENINTF1.445
CL 4.3 PP headers in LOOKUP table DR240293.576
CALL SETPOS
(NFTOUT,LOOKUP_START,ICODE) GTD0F400.80
CALL BUFFOUT
(NFTOUT,LOOKUP_INTFA(1,1,JINTF), DR240293.577
& LEN1_LOOKUP*INTF_LOOKUPSA,LEN_IO,A_IO) GENINTF1.506
GENINTF1.507
C Check for I/O Errors GENINTF1.508
GENINTF1.509
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN1_LOOKUP*INTF_LOOKUPSA) THEN GENINTF1.510
CALL IOERROR
('buffer out of PP header',A_IO,LEN_IO, GENINTF1.511
& LEN1_LOOKUP*INTF_LOOKUPSA) GENINTF1.512
CMESSAGE=' GEN_INTF: I/O ERROR ' GENINTF1.513
ICODE=4 GENINTF1.514
GO TO 999 ! Return DR240293.578
END IF GENINTF1.516
GENINTF1.517
CL 4.4 Interface data DR240293.579
C Determine position in data section DR240293.580
GDR1F400.183
DATA_START = DR240293.581
& lookup_intfa(lbegin, 1, jintf) GBC5F404.106
c--round this disk length to a multiple of the sector size GBC5F404.107
len_data=((len_data+um_sector_size-1)/ GBC5F404.108
& um_sector_size)*um_sector_size GBC5F404.109
CALL SETPOS
(NFTOUT,DATA_START,ICODE) GTD0F400.81
CALL BUFFOUT
(NFTOUT,INTF_DATA(1),LEN_DATA,LEN_IO,A_IO) GDR1F400.191
GENINTF1.520
C Check for I/O Errors GENINTF1.521
GENINTF1.522
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_DATA) THEN GDR1F400.192
CALL IOERROR
('buffer out of boundary data',A_IO,LEN_IO, GENINTF1.524
& LEN_DATA) GDR1F400.193
CMESSAGE=' GEN_INTF: I/O ERROR ' GENINTF1.526
ICODE=51 GDR1F400.194
GO TO 999 ! Return DR240293.583
END IF GENINTF1.529
GENINTF1.530
CL Close boundary output file if reinitialised during run DR240293.584
IF (FT_STEPS(NFTOUT).GT.0) THEN GENINTF1.533
LEN_PPNAME=LEN(PPNAME) GENINTF1.534
CALL FILE_CLOSE
(NFTOUT,PPNAME,LEN_PPNAME,1,0,ICODE) GTD0F400.4
END IF GENINTF1.536
GENINTF1.537
CL Update FT_LASTFIELD DR240293.585
FT_LASTFIELD(NFTOUT) = FT_LASTFIELD(NFTOUT) + 1 GENINTF1.540
GENINTF1.541
999 RETURN DR240293.587
END GENINTF1.557
*ENDIF GSS1F304.331
*ENDIF GENINTF1.559