*IF DEF,C90_1A,OR,DEF,C90_2A,OR,DEF,C90_2B AAD2F404.294
*IF -DEF,SCMA AJC0F405.262
C ******************************COPYRIGHT****************************** GTS2F400.1369
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.1370
C GTS2F400.1371
C Use, duplication or disclosure of this code is subject to the GTS2F400.1372
C restrictions as set forth in the contract. GTS2F400.1373
C GTS2F400.1374
C Meteorological Office GTS2F400.1375
C London Road GTS2F400.1376
C BRACKNELL GTS2F400.1377
C Berkshire UK GTS2F400.1378
C RG12 2SZ GTS2F400.1379
C GTS2F400.1380
C If no contract has been raised with this copy of the code, the use, GTS2F400.1381
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.1382
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.1383
C Modelling at the above address. GTS2F400.1384
C ******************************COPYRIGHT****************************** GTS2F400.1385
C GTS2F400.1386
CLL Subroutine COPYDIAG_3D ------------------------------------------- COPD3D1A.3
CLL COPD3D1A.4
CLL Purpose : To copy a diagnostic field from secondary space to the COPD3D1A.5
CLL main data array for stash processing, and to extend the COPD3D1A.6
CLL data to a full horizontal field. Input data of multilevel COPD3D1A.7
CLL fields is assumed to be on all model levels. Output data COPD3D1A.8
CLL is on the levels required. COPD3D1A.9
CLL Service routine COPD3D1A.10
CLL COPD3D1A.11
CLL Written by : M.J.P. Cullen COPD3D1A.12
CLL COPD3D1A.13
CLL Model Modification history from model version 3.0: COPD3D1A.14
CLL version Date COPD3D1A.15
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.41
CLL portability. Author Tracey Smith. TS150793.42
!LL 4.3 10/02/97 MPP code : Added PPX arguments and modified GPB1F403.648
!LL updating of polar rows. P.Burton GPB1F403.649
!LL 4.5 23/10/98 Introduce Single Column Model. JC Thil AJC0F405.261
CLL COPD3D1A.16
CLL Programming Standard : Unified Model Documentation paper number 4 COPD3D1A.17
CLL : Version no 2, dated 18/01/90 COPD3D1A.18
CLL COPD3D1A.19
CLL System components covered : D3 COPD3D1A.20
CLL COPD3D1A.21
CLL System task : P0 COPD3D1A.22
CLL COPD3D1A.23
CLL Documentation: U.M. Documentation paper number P0 COPD3D1A.24
CLL version 11 dated (26/11/90) COPD3D1A.25
CLLEND -------------------------------------------------------------- COPD3D1A.26
COPD3D1A.27
C*L Arguments COPD3D1A.28
COPD3D1A.29
SUBROUTINE COPYDIAG_3D(DIAGOUT,DIAGIN,FIRST_POINT,LAST_POINT, 46,3COPD3D1A.30
& FIELD,ROW_LENGTH, COPD3D1A.31
& LEVELS,STLIST,LEN_STLIST,STASH_LEVELS, COPD3D1A.32
& LEN_STASHLEVELS, GPB1F403.650
& IM,IS,IE, GPB1F403.651
*CALL ARGPPX
GPB1F403.652
& ICODE,CMESSAGE) GPB1F403.653
COPD3D1A.34
IMPLICIT NONE COPD3D1A.35
COPD3D1A.36
INTEGER COPD3D1A.37
& FIRST_POINT, ! First and last points for which data COPD3D1A.38
& LAST_POINT, ! is pressent on input COPD3D1A.39
& FIELD, ! Length of full logical field COPD3D1A.40
& ROW_LENGTH, ! Number of points in a row COPD3D1A.41
& LEVELS, ! Number of levels in input data COPD3D1A.42
& LEN_STLIST, ! COPD3D1A.43
& STLIST(LEN_STLIST), ! STASH list COPD3D1A.44
& LEN_STASHLEVELS, ! COPD3D1A.45
& STASH_LEVELS(LEN_STASHLEVELS,*), ! STASH levels list. COPD3D1A.46
& IM,IS,IE, ! Model, section, item GPB1F403.654
& ICODE ! Return code =0 Normal exit COPD3D1A.47
C >1 Error message COPD3D1A.48
COPD3D1A.49
! ARGPPX arguments: GPB1F403.655
*CALL CSUBMODL
GPB1F403.656
*CALL CPPXREF
GPB1F403.657
*CALL PPXLOOK
GPB1F403.658
GPB1F403.659
CHARACTER*80 CMESSAGE TS150793.43
COPD3D1A.51
REAL COPD3D1A.52
& DIAGIN(FIELD,LEVELS), ! Output data COPD3D1A.53
& DIAGOUT(FIELD,*) ! Input data COPD3D1A.54
COPD3D1A.55
*IF DEF,MPP GPB1F403.660
! MPP common block and parameters GPB1F403.661
*CALL PARVARS
GPB1F403.662
*ENDIF GPB1F403.663
GPB1F403.664
C* COPD3D1A.56
C Local variables COPD3D1A.57
COPD3D1A.58
INTEGER COPD3D1A.59
& I, ! COPD3D1A.60
& K, ! COPD3D1A.61
& KOUT, ! COPD3D1A.62
& NP_START , SP_START ! start points of North/South pole rows GPB1F403.665
&, ECOL_START , WCOL_START ! start points of East/West boundaries GPB1F403.666
&, START_POINT,END_POINT ! MPP modified versions of FIRST/LAST GPB1F403.667
*IF DEF,MPP GPB1F403.668
&, GR ! grid type of grid GPB1F403.669
&, FLD_TYPE ! is it a p field or a u field? GPB1F403.670
&, info ! GCOM return code GPB1F403.671
GPB1F403.672
! Functions called: GPB1F403.673
INTEGER GPB1F403.674
& EXPPXI,GET_FLD_TYPE GPB1F403.675
GPB1F403.676
*ENDIF GPB1F403.677
GPB1F403.678
REAL GPB1F403.679
& COPY_VALUE_START(LEVELS) ! value to copy into start of array GPB1F403.680
&, COPY_VALUE_END(LEVELS) ! value to copy into end of array GPB1F403.681
GPB1F403.682
COPD3D1A.64
LOGICAL COPD3D1A.65
& LIST(LEVELS) ! COPD3D1A.66
COPD3D1A.67
*IF DEF,MPP GPB1F403.683
! Find out the gridtype of the field GPB1F403.684
GR = EXPPXI
(IM,IS,IE,ppx_grid_type, GPB1F403.685
*CALL ARGPPX
GPB1F403.686
& ICODE,CMESSAGE) GPB1F403.687
GPB1F403.688
IF (ICODE .GT. 0) GOTO 9999 GPB1F403.689
GPB1F403.690
! and use this to find the field type (p field or u field) GPB1F403.691
GPB1F403.692
FLD_TYPE=GET_FLD_TYPE
(GR) GPB1F403.693
GPB1F403.694
*ENDIF GPB1F403.695
GPB1F403.696
! Set START_POINT and END_POINT GPB1F403.697
*IF -DEF,MPP GPB1F403.698
START_POINT=FIRST_POINT GPB1F403.699
END_POINT=LAST_POINT GPB1F403.700
*ELSE GPB1F403.701
! Place START and END to be in real data - not in the halos GPB1F403.702
START_POINT=FIRST_POINT+Offx GPB1F403.703
END_POINT=LAST_POINT-Offx GPB1F403.704
*ENDIF GPB1F403.705
GPB1F403.706
! Find the values to copy into the start and end of the arrays GPB1F403.707
GPB1F403.708
DO K=1,LEVELS GPB1F403.709
COPY_VALUE_START(K)=DIAGIN(START_POINT,K) GPB1F403.710
COPY_VALUE_END(K)=DIAGIN(END_POINT,K) GPB1F403.711
ENDDO GPB1F403.712
GPB1F403.713
*IF DEF,MPP GPB1F403.714
! If this is the Northern processor row - we must make sure we GPB1F403.715
! get a consistent value over the polar row - so we take GPB1F403.716
! the value from PE 0 and use that on all processors GPB1F403.717
IF (attop) THEN GPB1F403.718
CALL GCG_RBCAST(
700,LEVELS,first_comp_pe,gc_proc_row_group, GPB1F403.719
& info,COPY_VALUE_START) GPB1F403.720
ENDIF GPB1F403.721
GPB1F403.722
! If this is the Southern processor row - we must make sure we GPB1F403.723
! get a consistent value over the polar row - so we take GPB1F403.724
! the value from PE 0 and use that on all processors GPB1F403.725
IF (atbase) THEN GPB1F403.726
CALL GCG_RBCAST(
701,LEVELS,last_comp_pe,gc_proc_row_group, GPB1F403.727
& info,COPY_VALUE_END) GPB1F403.728
ENDIF GPB1F403.729
*ENDIF GPB1F403.730
CALL SET_LEVELS_LIST
(LEVELS,LEN_STLIST,STLIST,LIST,STASH_LEVELS, COPD3D1A.68
& LEN_STASHLEVELS,ICODE,CMESSAGE) COPD3D1A.69
IF(ICODE.GT.0) GOTO 9999 GPB1F403.731
COPD3D1A.71
CL Move data from DIAGIN to DIAGOUT at levels requested COPD3D1A.72
COPD3D1A.73
KOUT=0 COPD3D1A.74
DO K=1,LEVELS COPD3D1A.75
IF(LIST(K)) THEN COPD3D1A.76
KOUT=KOUT+1 COPD3D1A.77
COPD3D1A.78
DO I=START_POINT,END_POINT GPB1F403.732
DIAGOUT(I,KOUT)=DIAGIN(I,K) COPD3D1A.80
END DO COPD3D1A.81
COPD3D1A.82
DO I=1,START_POINT-1 GPB1F403.733
DIAGOUT(I,KOUT)=COPY_VALUE_START(K) GPB1F403.734
END DO COPD3D1A.85
COPD3D1A.86
DO I=END_POINT+1,FIELD GPB1F403.735
DIAGOUT(I,KOUT)=COPY_VALUE_END(K) GPB1F403.736
END DO COPD3D1A.89
COPD3D1A.90
*IF -DEF,GLOBAL COPD3D1A.91
COPD3D1A.92
CL Copy diagnostic information to N and S boundaries COPD3D1A.93
COPD3D1A.94
*IF DEF,MPP GPB1F403.737
IF (attop) THEN GPB1F403.738
NP_START=Offy*ROW_LENGTH+1 GPB1F403.739
*ELSE GPB1F403.740
NP_START=1 GPB1F403.741
*ENDIF GPB1F403.742
DO I=NP_START,NP_START+ROW_LENGTH-1 GPB1F403.743
DIAGOUT(I,KOUT)=DIAGOUT(I+ROW_LENGTH,KOUT) GPB1F403.744
ENDDO GPB1F403.745
*IF DEF,MPP GPB1F403.746
ENDIF GPB1F403.747
GPB1F403.748
IF (atbase) THEN GPB1F403.749
IF (FLD_TYPE .EQ. fld_type_p) THEN GPB1F403.750
SP_START=FIELD-(Offy+1)*ROW_LENGTH+1 GPB1F403.751
ELSE GPB1F403.752
SP_START=FIELD-(Offy+2)*ROW_LENGTH+1 GPB1F403.753
ENDIF GPB1F403.754
*ELSE GPB1F403.755
GPB1F403.756
SP_START=FIELD-ROW_LENGTH+1 GPB1F403.757
*ENDIF GPB1F403.758
DO I=SP_START,SP_START+ROW_LENGTH-1 GPB1F403.759
DIAGOUT(I,KOUT)=DIAGOUT(I-ROW_LENGTH,KOUT) GPB1F403.760
ENDDO GPB1F403.761
*IF DEF,MPP GPB1F403.762
ENDIF GPB1F403.763
*ENDIF GPB1F403.764
COPD3D1A.100
CL Copy diagnostic information to E and W boundaries COPD3D1A.101
COPD3D1A.102
*IF DEF,MPP GPB1F403.765
IF (atleft) THEN GPB1F403.766
GPB1F403.767
WCOL_START=Offy*ROW_LENGTH+1+Offx GPB1F403.768
*ELSE GPB1F403.769
WCOL_START=1 GPB1F403.770
*ENDIF GPB1F403.771
DO I=WCOL_START,FIELD,ROW_LENGTH GPB1F403.772
DIAGOUT(I,KOUT)=DIAGOUT(I+1,KOUT) GPB1F403.773
ENDDO GPB1F403.774
*IF DEF,MPP GPB1F403.775
ENDIF GPB1F403.776
GPB1F403.777
IF (atright) THEN GPB1F403.778
GPB1F403.779
ECOL_START=(Offy+1)*ROW_LENGTH-Offx GPB1F403.780
*ELSE GPB1F403.781
GPB1F403.782
ECOL_START=ROW_LENGTH GPB1F403.783
*ENDIF GPB1F403.784
DO I=ECOL_START,FIELD,ROW_LENGTH GPB1F403.785
DIAGOUT(I,KOUT)=DIAGOUT(I-1,KOUT) GPB1F403.786
ENDDO GPB1F403.787
*IF DEF,MPP GPB1F403.788
ENDIF GPB1F403.789
*ENDIF GPB1F403.790
COPD3D1A.108
*ENDIF COPD3D1A.109
COPD3D1A.110
END IF COPD3D1A.111
END DO COPD3D1A.112
COPD3D1A.113
9999 CONTINUE GPB1F403.791
RETURN COPD3D1A.114
END COPD3D1A.115
*ENDIF COPD3D1A.116
*ENDIF AJC0F405.263