*IF DEF,C90_1A,OR,DEF,C90_2A,OR,DEF,C90_2B AAD2F404.290
C ******************************COPYRIGHT****************************** GTS2F400.10945
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.10946
C GTS2F400.10947
C Use, duplication or disclosure of this code is subject to the GTS2F400.10948
C restrictions as set forth in the contract. GTS2F400.10949
C GTS2F400.10950
C Meteorological Office GTS2F400.10951
C London Road GTS2F400.10952
C BRACKNELL GTS2F400.10953
C Berkshire UK GTS2F400.10954
C RG12 2SZ GTS2F400.10955
C GTS2F400.10956
C If no contract has been raised with this copy of the code, the use, GTS2F400.10957
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.10958
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.10959
C Modelling at the above address. GTS2F400.10960
C ******************************COPYRIGHT****************************** GTS2F400.10961
C GTS2F400.10962
CLL SUBROUTINE UV_TO_P_FULL---------------------------------------- UVTOPF1A.3
CLL UVTOPF1A.4
CLL Purpose: Interpolates a horizontal field from wind to pressure UVTOPF1A.5
CLL points on an Arakawa B grid. Under UPDATE identifier GLOBAL the data UVTOPF1A.6
CLL is assumed periodic along rows. Otherwise, the first value CW250393.18
CLL on each row is set equal to the second value on each row and the CW250393.19
CLL top row values set to the second row, and the bottom row set to the CW250393.20
CLL penultimate row.The input array is a full U/V field and the CW250393.21
CLL output array is a full P field. UVTOPF1A.10
CLL The routine UV_TO_P outputs data on a P-field starting at the UVTOPF1A.11
CLL first element in the second row - i.e. the north pole or top UVTOPF1A.12
CLL row is ignored. UVTOPF1A.13
CLL UVTOPF1A.14
CLL Not suitable for single column use. UVTOPF1A.15
CLL UVTOPF1A.16
CLL J.Heming <- programmer of some or all of previous code or changes UVTOPF1A.17
CLL R.Rawlins <- programmer of some or all of previous code or changes UVTOPF1A.18
CLL M.Carter <- programmer of some or all of previous code or changes UVTOPF1A.19
CLL UVTOPF1A.20
CLL Model Modification history from model version 3.0: UVTOPF1A.21
CLL version Date UVTOPF1A.22
CLL 3.2 25/03/93 Remove one-sided differencing for edge points. CW250393.22
CLL Author: C.A.Wilson Reviewer: A.Dickinson CW250393.23
!LL 4.3 07/05/97 Added MPP code P.Burton GPB1F403.1824
CLL UVTOPF1A.23
CLL Programming standard: Unified Model Documentation Paper No 3 UVTOPF1A.24
CLL UVTOPF1A.25
CLL System component: S101 UVTOPF1A.26
CLL UVTOPF1A.27
CLL System task: S1 UVTOPF1A.28
CLL UVTOPF1A.29
CLL Documentation: The equation used is (2.1) UVTOPF1A.30
CLL in unified model documentation paper No. S1 UVTOPF1A.31
CLL UVTOPF1A.32
CLLEND------------------------------------------------------------- UVTOPF1A.33
UVTOPF1A.34
C UVTOPF1A.35
C*L Arguments:--------------------------------------------------- UVTOPF1A.36
SUBROUTINE UV_TO_P_FULL 2UVTOPF1A.37
1 (U_DATA,P_DATA,U_FIELD,P_FIELD,ROW_LENGTH,P_ROWS) UVTOPF1A.38
UVTOPF1A.39
IMPLICIT NONE UVTOPF1A.40
UVTOPF1A.41
INTEGER UVTOPF1A.42
* P_ROWS !IN Number of rows in p field UVTOPF1A.43
*, ROW_LENGTH !IN Number of points per row UVTOPF1A.44
*, P_FIELD !IN Number of points in output field UVTOPF1A.45
*, U_FIELD !IN Number of points in input field UVTOPF1A.46
UVTOPF1A.47
REAL UVTOPF1A.48
* P_DATA(P_FIELD) ! OUT Data on p points UVTOPF1A.49
*,U_DATA(U_FIELD) ! IN Data on uv points UVTOPF1A.50
C*--------------------------------------------------------------------- UVTOPF1A.51
UVTOPF1A.52
C*L Local arrays:---------------------------------------------------- UVTOPF1A.53
REAL UVTOPF1A.54
* U_DATASUM ! Sum of uv point data on first and last rows UVTOPF1A.55
*,RECIP_ROW_LENGTH ! Reciprocal of rowlength UVTOPF1A.56
C*--------------------------------------------------------------------- UVTOPF1A.57
UVTOPF1A.58
C*L External subroutine calls:---------------------------------------- UVTOPF1A.59
C None UVTOPF1A.60
C*--------------------------------------------------------------------- UVTOPF1A.61
UVTOPF1A.62
*IF DEF,MPP GPB1F403.1825
!---------------------------------------------------------------------- GPB1F403.1826
! Comdecks required by MPP code GPB1F403.1827
GPB1F403.1828
*CALL PARVARS
GPB1F403.1829
*CALL GCCOM
GPB1F403.1830
GPB1F403.1831
!---------------------------------------------------------------------- GPB1F403.1832
*ENDIF GPB1F403.1833
! GPB1F403.1834
!---------------------------------------------------------------------- GPB1F403.1835
! Loop bound variables GPB1F403.1836
INTEGER GPB1F403.1837
& FIRST_POINT,LAST_POINT GPB1F403.1838
&, TOP_ROW_START , TOP_ROW_END GPB1F403.1839
&, BOT_ROW_START , BOT_ROW_END GPB1F403.1840
GPB1F403.1841
*IF DEF,MPP GPB1F403.1842
! GCOM variables GPB1F403.1843
INTEGER GPB1F403.1844
& info GPB1F403.1845
*ENDIF GPB1F403.1846
GPB1F403.1847
C---------------------------------------------------------------------- UVTOPF1A.63
C Define local variables UVTOPF1A.64
C---------------------------------------------------------------------- UVTOPF1A.65
INTEGER UVTOPF1A.66
* I ! Horizontal loop indices CW250393.24
UVTOPF1A.68
C--------------------------------------------------------------------- UVTOPF1A.69
CL 1. Initialise local constants UVTOPF1A.70
C--------------------------------------------------------------------- UVTOPF1A.71
UVTOPF1A.72
U_DATASUM = 0.0 UVTOPF1A.73
*IF -DEF,MPP GPB1F403.1848
RECIP_ROW_LENGTH = 1.0/ROW_LENGTH UVTOPF1A.74
*ELSE GPB1F403.1849
RECIP_ROW_LENGTH = 1.0/glsize(1) GPB1F403.1850
*ENDIF GPB1F403.1851
GPB1F403.1852
UVTOPF1A.75
C--------------------------------------------------------------------- UVTOPF1A.76
CL 2. Calculate horizontal average at p points excluding first UVTOPF1A.77
CL and last rows UVTOPF1A.78
C--------------------------------------------------------------------- UVTOPF1A.79
UVTOPF1A.80
*IF -DEF,MPP GPB1F403.1853
FIRST_POINT=ROW_LENGTH+2 GPB1F403.1854
LAST_POINT=P_FIELD-ROW_LENGTH GPB1F403.1855
*ELSE GPB1F403.1856
IF (attop) THEN GPB1F403.1857
FIRST_POINT=(Offy+1)*ROW_LENGTH+Offx+1 GPB1F403.1858
ELSE GPB1F403.1859
FIRST_POINT=Offy*ROW_LENGTH+Offx+1 GPB1F403.1860
ENDIF GPB1F403.1861
GPB1F403.1862
IF (atbase) THEN GPB1F403.1863
LAST_POINT=P_FIELD-(Offy+1)*ROW_LENGTH-Offx GPB1F403.1864
ELSE GPB1F403.1865
LAST_POINT=P_FIELD-Offy*ROW_LENGTH-Offx GPB1F403.1866
ENDIF GPB1F403.1867
*ENDIF GPB1F403.1868
GPB1F403.1869
DO I=FIRST_POINT,LAST_POINT GPB1F403.1870
P_DATA(I)=0.25*(U_DATA(I)+U_DATA(I-1)+ UVTOPF1A.82
* U_DATA(I-ROW_LENGTH)+U_DATA(I-1-ROW_LENGTH)) UVTOPF1A.83
ENDDO UVTOPF1A.84
UVTOPF1A.85
*IF DEF,GLOBAL UVTOPF1A.86
C--------------------------------------------------------------------- UVTOPF1A.87
CL 3. Calculate horizontal average at north and south pole UVTOPF1A.88
C--------------------------------------------------------------------- UVTOPF1A.89
UVTOPF1A.90
*IF -DEF,MPP GPB1F403.1871
DO I=1,ROW_LENGTH UVTOPF1A.91
U_DATASUM=U_DATASUM+U_DATA(I) UVTOPF1A.92
ENDDO UVTOPF1A.93
DO I=1,ROW_LENGTH UVTOPF1A.94
P_DATA(I)=RECIP_ROW_LENGTH*U_DATASUM UVTOPF1A.95
ENDDO UVTOPF1A.96
UVTOPF1A.97
U_DATASUM = 0.0 UVTOPF1A.98
UVTOPF1A.99
DO I=P_FIELD-(2*ROW_LENGTH)+1,P_FIELD-ROW_LENGTH UVTOPF1A.100
U_DATASUM=U_DATASUM+U_DATA(I) UVTOPF1A.101
ENDDO UVTOPF1A.102
DO I=P_FIELD-ROW_LENGTH+1,P_FIELD UVTOPF1A.103
P_DATA(I)=RECIP_ROW_LENGTH*U_DATASUM UVTOPF1A.104
ENDDO UVTOPF1A.105
*ELSE GPB1F403.1872
GPB1F403.1873
IF (attop) THEN GPB1F403.1874
GPB1F403.1875
CALL GCG_RVECSUMR(
ROW_LENGTH,ROW_LENGTH-2*Offx, GPB1F403.1876
& Offy*ROW_LENGTH+Offx+1,1,U_DATA, GPB1F403.1877
& gc_proc_row_group,info,U_DATASUM) GPB1F403.1878
GPB1F403.1879
DO I=Offy*ROW_LENGTH+1,(Offy+1)*ROW_LENGTH GPB1F403.1880
P_DATA(I)=RECIP_ROW_LENGTH*U_DATASUM GPB1F403.1881
ENDDO GPB1F403.1882
GPB1F403.1883
ENDIF GPB1F403.1884
GPB1F403.1885
U_DATASUM=0.0 GPB1F403.1886
GPB1F403.1887
IF (atbase) THEN GPB1F403.1888
GPB1F403.1889
CALL GCG_RVECSUMR(
ROW_LENGTH,ROW_LENGTH-2*Offx, GPB1F403.1890
& P_FIELD-(Offy+2)*ROW_LENGTH+Offx+1,1, GPB1F403.1891
& U_DATA,gc_proc_row_group,info,U_DATASUM) GPB1F403.1892
GPB1F403.1893
DO I=P_FIELD-(Offy+1)*ROW_LENGTH+1, GPB1F403.1894
& P_FIELD-Offy*ROW_LENGTH GPB1F403.1895
P_DATA(I)=RECIP_ROW_LENGTH*U_DATASUM GPB1F403.1896
ENDDO GPB1F403.1897
GPB1F403.1898
ENDIF GPB1F403.1899
GPB1F403.1900
*ENDIF GPB1F403.1901
UVTOPF1A.106
C--------------------------------------------------------------------- UVTOPF1A.107
CL 4.Recalculate horizontal average at end points not including poles UVTOPF1A.108
CL i.e. allow for global wrap round UVTOPF1A.109
C--------------------------------------------------------------------- UVTOPF1A.110
UVTOPF1A.111
*IF -DEF,MPP GPB1F403.1902
DO I=ROW_LENGTH+1,P_FIELD-ROW_LENGTH,ROW_LENGTH UVTOPF1A.112
P_DATA(I)=0.25*(U_DATA(I)+U_DATA(I-1+ROW_LENGTH)+ UVTOPF1A.113
* U_DATA(I-ROW_LENGTH)+U_DATA(I-1)) UVTOPF1A.114
ENDDO UVTOPF1A.115
*ELSE GPB1F403.1903
! Halos take care of this automatically GPB1F403.1904
*ENDIF GPB1F403.1905
UVTOPF1A.116
*ELSE UVTOPF1A.117
C--------------------------------------------------------------------- UVTOPF1A.118
CL 5.Recalculate first and last rows for limited area model by UVTOPF1A.119
CL setting equal to internal rows CW250393.25
C--------------------------------------------------------------------- UVTOPF1A.121
*IF -DEF,MPP GPB1F403.1906
DO I = 2 , ROW_LENGTH CW250393.26
P_DATA(I)=P_DATA(I+ROW_LENGTH) CW250393.27
ENDDO UVTOPF1A.124
UVTOPF1A.125
DO I = P_FIELD-ROW_LENGTH+2 , P_FIELD CW250393.28
P_DATA(I)=P_DATA(I-ROW_LENGTH) CW250393.29
ENDDO UVTOPF1A.128
*ELSE GPB1F403.1907
IF (attop) THEN GPB1F403.1908
DO I=Offy*ROW_LENGTH+1,(Offy+1)*ROW_LENGTH GPB1F403.1909
P_DATA(I)=P_DATA(I+ROW_LENGTH) GPB1F403.1910
ENDDO GPB1F403.1911
ENDIF GPB1F403.1912
GPB1F403.1913
IF (atbase) THEN GPB1F403.1914
DO I=P_FIELD-(Offy+1)*ROW_LENGTH+1,P_FIELD-Offy*ROW_LENGTH GPB1F403.1915
P_DATA(I)=P_DATA(I-ROW_LENGTH) GPB1F403.1916
ENDDO GPB1F403.1917
ENDIF GPB1F403.1918
*ENDIF GPB1F403.1919
C--------------------------------------------------------------------- UVTOPF1A.129
CL 6.Recalculate first points in each row for the limited CW250393.30
CL area model by setting equal to second points CW250393.31
C--------------------------------------------------------------------- UVTOPF1A.132
UVTOPF1A.133
*IF -DEF,MPP GPB1F403.1920
DO I=1,P_FIELD,ROW_LENGTH CW250393.32
P_DATA(I)=P_DATA(I+1) CW250393.33
ENDDO UVTOPF1A.138
*ELSE GPB1F403.1921
IF (atleft) THEN GPB1F403.1922
DO I=Offx+1,P_FIELD,ROW_LENGTH GPB1F403.1923
P_DATA(I)=P_DATA(I+1) GPB1F403.1924
ENDDO GPB1F403.1925
ENDIF GPB1F403.1926
*ENDIF GPB1F403.1927
UVTOPF1A.139
*ENDIF UVTOPF1A.140
C--------------------------------------------------------------------- UVTOPF1A.141
UVTOPF1A.142
RETURN UVTOPF1A.143
END UVTOPF1A.144
UVTOPF1A.145
*ENDIF UVTOPF1A.146