*IF DEF,A13_1A,OR,DEF,A13_1B ATJ0F402.26
C ******************************COPYRIGHT****************************** GTS2F400.10909
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.10910
C GTS2F400.10911
C Use, duplication or disclosure of this code is subject to the GTS2F400.10912
C restrictions as set forth in the contract. GTS2F400.10913
C GTS2F400.10914
C Meteorological Office GTS2F400.10915
C London Road GTS2F400.10916
C BRACKNELL GTS2F400.10917
C Berkshire UK GTS2F400.10918
C RG12 2SZ GTS2F400.10919
C GTS2F400.10920
C If no contract has been raised with this copy of the code, the use, GTS2F400.10921
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.10922
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.10923
C Modelling at the above address. GTS2F400.10924
C ******************************COPYRIGHT****************************** GTS2F400.10925
C GTS2F400.10926
CLL SUBROUTINE UV_DIF ----------------------------------------- UVDIF1A.3
CLL UVDIF1A.4
CLL PURPOSE: CALCULATES DIFFUSIVE INCREMENTS TO U AND V AT UVDIF1A.5
CLL ONE MODEL LEVEL USING EQUATION (47) AND ADDS TO FIELD. UVDIF1A.6
CLL IF GLOBAL MODEL RUN THEN UPDATES POLAR VALUES. UVDIF1A.7
CLL PERFORMS FULL DEL-SQUARED CALCULATION WITH UVDIF1A.8
CLL ACROSS-POLE DIFFERENCING IN GLOBAL CASE (TCJ). UVDIF1A.9
CLL IF STEEP SLOPE THEN EFFECTIVE DIFFUSION IS ZERO. (TD) ATD1F400.774
CLL NOT SUITABLE FOR SINGLE COLUMN USE. UVDIF1A.10
CLL VERSION FOR CRAY Y-MP UVDIF1A.11
CLL UVDIF1A.12
CLL WRITTEN BY M.H MAWSON. UVDIF1A.13
CLL UVDIF1A.14
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: UVDIF1A.15
CLL VERSION DATE UVDIF1A.16
CLL 4.0 03/02/95 RE-WRITTEN TO MAKE MORE EFFICIENT WITH TESTING FOR ATD1F400.775
CLL STEEP SLOPES. AUTHOR: T.DAVIES. REVIEWER: M.MAWSON ATD1F400.776
! 3.5 28/03/95 MPP code additions P.Burton APB0F305.1369
! 4.1 07/05/96 Added MPP code and TYPFLDPT arguments P.Burton APB0F401.1669
! 4.3 22/04/97 Added optimised vector shift GSS2F403.172
! B. Carruthers GSS2F403.173
CLL UVDIF1A.17
CLL DOCUMENTATION: THE EQUATION USED IS (47) ATD1F400.777
CLL IN UNIFIED MODEL DOCUMENTATION PAPER ATD1F400.778
CLL NO. 10 M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON ATD1F400.779
CLL VERSION 22 DATED 01/06/92. ATD1F400.780
CLL UVDIF1A.20
CLL SYSTEM COMPONENTS COVERED: P132 UVDIF1A.21
CLL UVDIF1A.22
CLL SYSTEM TASK: P1 UVDIF1A.23
CLL UVDIF1A.24
CLL DOCUMENTATION: THE EQUATION USED IS (47) UVDIF1A.25
CLL IN UNIFIED MODEL DOCUMENTATION PAPER UVDIF1A.26
CLL NO. 10 M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON UVDIF1A.27
CLL VERSION 16 DATED 09/01/91. UVDIF1A.28
CLLEND------------------------------------------------------------- UVDIF1A.29
UVDIF1A.30
C*L ARGUMENTS:--------------------------------------------------- UVDIF1A.31
SUBROUTINE UV_DIF 2,15UVDIF1A.32
1 (FIELDU,FIELDV,RS_SQUARED_DELTAP, ATD1F400.781
2 SEC_U_LATITUDE,START_U_UPDATE,END_U_UPDATE, ATD1F400.782
3 ROW_LENGTH, APB0F401.1670
*CALL ARGFLDPT
APB0F401.1671
& P_FIELD,U_FIELD, APB0F401.1672
4 DIFFUSION_EW,DIFFUSION_NS) ATD1F400.784
UVDIF1A.40
IMPLICIT NONE UVDIF1A.41
UVDIF1A.42
INTEGER UVDIF1A.43
* U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID UVDIF1A.44
*, P_FIELD !IN DIMENSION OF FIELDS ON PRESSURE GRID UVDIF1A.45
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW UVDIF1A.46
*, START_U_UPDATE !IN FIRST POINT TO BE UPDATED. UVDIF1A.47
*, END_U_UPDATE !IN LAST POINT TO BE UPDATED. UVDIF1A.48
APB0F401.1673
! All TYPFLDPT arguments are intent IN APB0F401.1674
*CALL TYPFLDPT
APB0F401.1675
UVDIF1A.49
REAL UVDIF1A.50
* FIELDU(U_FIELD) !INOUT. U DIFFUSION FIELD. ATD1F400.785
*,FIELDV(U_FIELD) !INOUT. V DIFFUSION FIELD. ATD1F400.786
UVDIF1A.53
REAL UVDIF1A.54
* RS_SQUARED_DELTAP(U_FIELD) !IN HOLDS RS*RS*DELTA P UVDIF1A.55
*,DIFFUSION_EW(P_FIELD) !IN EFFECTIVE EW DIFFUSION COEFFICIENT ATD1F400.787
*,DIFFUSION_NS(P_FIELD) !IN EFFECTIVE NS DIFFUSION COEFFICIENT ATD1F400.788
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS UVDIF1A.65
UVDIF1A.70
UVDIF1A.75
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- UVDIF1A.76
C DEFINE LOCAL ARRAYS: 4 ARE REQUIRED UVDIF1A.77
UVDIF1A.78
*IF DEF,MPP,AND,DEF,T3E GSS2F403.174
*IF DEF,MPP GSS2F403.175
*CALL AMAXSIZE
GSS2F403.176
*ENDIF GSS2F403.177
*ENDIF GSS2F403.178
REAL UVDIF1A.79
* FIELD1(P_FIELD) ! GENERAL WORKSPACE ATD1F400.789
*,FIELD2(P_FIELD) ! GENERAL WORKSPACE ATD1F400.790
*,FIELD3(P_FIELD) ! GENERAL WORKSPACE ATD1F400.791
*,FIELD4(P_FIELD) ! GENERAL WORKSPACE ATD1F400.792
*IF DEF,MPP APB0F401.1676
*IF DEF,MPP,AND,DEF,T3E GSS2F403.179
&,u_copy(row_length_max) ! copy of polar row GSS2F403.180
&,v_copy(row_length_max) ! copy of polar row GSS2F403.181
&,u_out_copy(row_length_max) GSS2F403.182
&,v_out_copy(row_length_max) GSS2F403.183
c GSS2F403.184
integer ipad1(32), ipad2(32), ipad3(32), ipad4(32) GSS2F403.185
c GSS2F403.186
common/uv_dif_shmem/ ipad1, u_copy, ipad2, v_copy, ipad3 GSS2F403.187
c GSS2F403.188
*CALL PARVARS
GSS2F403.189
integer g_start(maxproc), g_new_start, l_new_length, GSS2F403.190
2 l_iadd, current_length, l_rem_iadd, my_row_pe GSS2F403.191
*ELSE GSS2F403.192
&,U_COPY(ROW_LENGTH) ! copy of polar row APB0F401.1677
&,V_COPY(ROW_LENGTH) ! copy of polar row APB0F401.1678
*ENDIF GSS2F403.193
*ENDIF APB0F401.1679
C*--------------------------------------------------------------------- UVDIF1A.82
C DEFINE LOCAL VARIABLES UVDIF1A.83
UVDIF1A.84
C LOCAL REALS. UVDIF1A.85
REAL UVDIF1A.86
* SCALAR UVDIF1A.87
C COUNT VARIABLES FOR DO LOOPS ETC. UVDIF1A.88
INTEGER UVDIF1A.89
* I,IJ,J,JI,HALF_RL ATD1F400.793
*IF DEF,GLOBAL,AND,DEF,MPP APB0F401.1680
INTEGER info APB0F401.1681
*ENDIF APB0F401.1682
UVDIF1A.91
C*L EXTERNAL SUBROUTINE CALLS: NONE--------------------------------- ATD1F400.794
C*--------------------------------------------------------------------- UVDIF1A.95
CL MAXIMUM VECTOR LENGTH ASSUMED IS END_U_UPDATE-START_U_UPDATE+1+ UVDIF1A.96
CL ROW_LENGTH UVDIF1A.97
CL--------------------------------------------------------------------- UVDIF1A.98
CL INTERNAL STRUCTURE. UVDIF1A.99
CL--------------------------------------------------------------------- UVDIF1A.100
CL UVDIF1A.101
CL--------------------------------------------------------------------- UVDIF1A.102
CL SECTION 1. CALCULATE FIRST TERM IN EQUATION (47) UVDIF1A.103
CL--------------------------------------------------------------------- UVDIF1A.104
UVDIF1A.105
C---------------------------------------------------------------------- ATD1F400.795
CL SECTION 1.1 CALCULATE DELTALAMBDA TERMS ATD1F400.796
C---------------------------------------------------------------------- ATD1F400.797
ATD1F400.798
ATD1F400.799
DO I=START_U_UPDATE+1,END_U_UPDATE ATD1F400.800
FIELD1(I) =FIELDU(I)-FIELDU(I-1) ATD1F400.801
FIELD2(I) =FIELDV(I)-FIELDV(I-1) ATD1F400.802
END DO ATD1F400.803
ATD1F400.804
*IF -DEF,MPP APB0F401.1683
C CORRECT END POINTS ATD1F400.805
ATD1F400.806
DO I=START_U_UPDATE,END_U_UPDATE,ROW_LENGTH ATD1F400.807
IJ=I+ROW_LENGTH-1 ATD1F400.808
FIELD1(I) =FIELDU(I)-FIELDU(IJ) ATD1F400.809
FIELD2(I) =FIELDV(I)-FIELDV(IJ) ATD1F400.810
END DO ATD1F400.811
*ELSE APB0F401.1684
FIELD1(START_U_UPDATE)=FIELD1(START_U_UPDATE+1) APB0F401.1685
FIELD2(START_U_UPDATE)=FIELD2(START_U_UPDATE+1) APB0F401.1686
*ENDIF APB0F401.1687
ATD1F400.812
C---------------------------------------------------------------------- ATD1F400.813
CL SECTION 1.3 COMPLETE DELTALAMBDA TERM ATD1F400.814
C---------------------------------------------------------------------- ATD1F400.815
ATD1F400.816
DO I= START_U_UPDATE+1,END_U_UPDATE ATD1F400.818
FIELD3(I-1)=(DIFFUSION_EW(I)*FIELD1(I)- ATD1F400.822
& DIFFUSION_EW(I-1)*FIELD1(I-1))* ATD1F400.823
& SEC_U_LATITUDE(I-1) ATD1F400.824
FIELD4(I-1)=(DIFFUSION_EW(I)*FIELD2(I)- ATD1F400.825
& DIFFUSION_EW(I-1)*FIELD2(I-1))* ATD1F400.826
& SEC_U_LATITUDE(I-1) ATD1F400.827
END DO ATD1F400.828
ATD1F400.829
C CORRECT END POINT ATD1F400.830
*IF -DEF,MPP APB0F401.1688
ATD1F400.831
DO I= START_U_UPDATE,END_U_UPDATE,ROW_LENGTH ATD1F400.832
IJ=I+ROW_LENGTH-1 ATD1F400.833
FIELD3(IJ)=(DIFFUSION_EW(I)*FIELD1(I)- ATD1F400.834
& DIFFUSION_EW(IJ)*FIELD1(IJ))* ATD1F400.835
& SEC_U_LATITUDE(IJ) ATD1F400.836
FIELD4(IJ)=(DIFFUSION_EW(I)*FIELD2(I)- ATD1F400.837
& DIFFUSION_EW(IJ)*FIELD2(IJ))* ATD1F400.838
& SEC_U_LATITUDE(IJ) ATD1F400.839
END DO ATD1F400.840
*ELSE APB0F401.1689
FIELD3(END_U_UPDATE)=FIELD3(END_U_UPDATE-1) APB0F401.1690
FIELD4(END_U_UPDATE)=FIELD4(END_U_UPDATE-1) APB0F401.1691
*ENDIF APB0F401.1692
ATD1F400.841
CL ATD1F400.842
CL--------------------------------------------------------------------- ATD1F400.843
CL SECTION 2. CALCULATE PHI DIRECTION TERM AND ADD ATD1F400.844
CL ONTO FIRST TO GET TOTAL INCREMENT. ATD1F400.845
CL--------------------------------------------------------------------- ATD1F400.846
ATD1F400.847
! Loop over field, missing top row APB0F401.1693
DO I=START_POINT_NO_HALO,LAST_U_VALID_PT APB0F401.1694
FIELD1(I)=FIELDU(I-ROW_LENGTH)-FIELDU(I) ATD1F400.849
FIELD2(I)=FIELDV(I-ROW_LENGTH)-FIELDV(I) ATD1F400.850
END DO ATD1F400.851
ATD1F400.852
*IF DEF,GLOBAL ATD1F400.853
C CALCULATE POLAR TERMS USING ACROSS-POLE DIFFERENCE, REMEMBERING SIGN ATD1F400.854
C CHANGE ACROSS THE POLE ATD1F400.855
C NB: EFFECTIVE COS_P_LATITUDE IS 1/4 THAT AT ADJACENT ROW ATD1F400.856
ATD1F400.857
HALF_RL = global_ROW_LENGTH/2 APB0F401.1695
APB0F401.1696
*IF -DEF,MPP APB0F401.1697
ATD1F400.859
DO I=1,HALF_RL ATD1F400.860
C NORTH POLE (FIRST HALF OF ROW) ATD1F400.861
J = I+HALF_RL ATD1F400.862
FIELD1(I)=-(FIELDU(I)+FIELDU(J)) ATD1F400.863
FIELD2(I)=-(FIELDV(I)+FIELDV(J)) ATD1F400.864
FIELD1(J)=-(FIELDU(I)+FIELDU(J)) ATD1F400.865
FIELD2(J)=-(FIELDV(I)+FIELDV(J)) ATD1F400.866
ATD1F400.867
C SOUTH POLE (SECOND HALF OF ROW) ATD1F400.868
IJ = U_FIELD+J ATD1F400.869
JI = U_FIELD+I ATD1F400.870
FIELD1(IJ)= FIELDU(IJ-ROW_LENGTH)+ FIELDU(JI-ROW_LENGTH) ATD1F400.871
FIELD2(IJ)= FIELDV(IJ-ROW_LENGTH)+ FIELDV(JI-ROW_LENGTH) ATD1F400.872
FIELD1(JI)= FIELDU(IJ-ROW_LENGTH)+ FIELDU(JI-ROW_LENGTH) ATD1F400.873
FIELD2(JI)= FIELDV(IJ-ROW_LENGTH)+ FIELDV(JI-ROW_LENGTH) ATD1F400.874
END DO ATD1F400.875
*ELSE APB0F401.1698
*IF DEF,MPP,AND,DEF,T3E GSS2F403.194
c GSS2F403.195
c--for MPP Code, check that we have enough processors GSS2F403.196
if(nproc_x.eq.1 .or. nproc_y.eq.1) then GSS2F403.197
c GSS2F403.198
*ENDIF GSS2F403.199
IF (at_top_of_LPG) THEN APB0F401.1699
! North Pole APB0F401.1700
! Copy NP row into U/V_COPY arrays APB0F401.1701
DO I=1,ROW_LENGTH APB0F401.1702
J=TOP_ROW_START+I-1 ! point along North Pole row APB0F401.1703
U_COPY(I)=FIELDU(J) APB0F401.1704
V_COPY(I)=FIELDV(J) APB0F401.1705
ENDDO APB0F401.1706
APB0F401.1707
! and rotate these rows by half a global row length, so that item I now APB0F401.1708
! contains the value which was on the opposite side of the pole. APB0F401.1709
APB0F401.1710
CALL GCG_RVECSHIFT
(ROW_LENGTH,ROW_LENGTH-2*EW_Halo, APB0F401.1711
& FIRST_ROW_PT,1,HALF_RL,.TRUE.,U_COPY, APB0F401.1712
& GC_ROW_GROUP,info) APB0F401.1713
CALL GCG_RVECSHIFT
(ROW_LENGTH,ROW_LENGTH-2*EW_Halo, APB0F401.1714
& FIRST_ROW_PT,1,HALF_RL,.TRUE.,V_COPY, APB0F401.1715
& GC_ROW_GROUP,info) APB0F401.1716
APB0F401.1717
DO I=1,ROW_LENGTH APB0F401.1718
J=TOP_ROW_START+I-1 ! point along North Pole row APB0F401.1719
FIELD1(J)=-(FIELDU(J)+U_COPY(I)) APB0F401.1720
FIELD2(J)=-(FIELDV(J)+V_COPY(I)) APB0F401.1721
ENDDO APB0F401.1722
ENDIF ! (IF at_top_of_LPG) APB0F401.1723
APB0F401.1724
IF (at_base_of_LPG) THEN APB0F401.1725
! South Pole APB0F401.1726
! Copy SP row in U/V_COPY arrays APB0F401.1727
DO I=1,ROW_LENGTH APB0F401.1728
J=U_BOT_ROW_START+I-1 ! point along South Pole row APB0F401.1729
U_COPY(I)=FIELDU(J) APB0F401.1730
V_COPY(I)=FIELDV(J) APB0F401.1731
ENDDO APB0F401.1732
APB0F401.1733
! and rotate these rows by half a global row length, so that item I now APB0F401.1734
! contains the value which was on the opposite side of the pole. APB0F401.1735
APB0F401.1736
CALL GCG_RVECSHIFT
(ROW_LENGTH,ROW_LENGTH-2*EW_Halo, APB0F401.1737
& FIRST_ROW_PT,1,HALF_RL,.TRUE.,U_COPY, APB0F401.1738
& GC_ROW_GROUP,info) APB0F401.1739
CALL GCG_RVECSHIFT
(ROW_LENGTH,ROW_LENGTH-2*EW_Halo, APB0F401.1740
& FIRST_ROW_PT,1,HALF_RL,.TRUE.,V_COPY, APB0F401.1741
& GC_ROW_GROUP,info) APB0F401.1742
APB0F401.1743
DO I=1,ROW_LENGTH APB0F401.1744
J=P_BOT_ROW_START+I-1 APB0F401.1745
FIELD1(J)=U_COPY(I)+FIELDU(J-ROW_LENGTH) APB0F401.1746
FIELD2(J)=V_COPY(I)+FIELDV(J-ROW_LENGTH) APB0F401.1747
ENDDO APB0F401.1748
ENDIF ! (IF at_base_of_LPG) APB0F401.1749
*IF DEF,MPP,AND,DEF,T3E GSS2F403.200
c GSS2F403.201
else ! MPP/T3E and only 1 processor along either direction GSS2F403.202
c GSS2F403.203
call barrier(
) GSS2F403.204
c GSS2F403.205
IF (at_top_of_LPG) THEN GSS2F403.206
! North Pole GSS2F403.207
! Copy NP row into U/V_COPY arrays GSS2F403.208
DO I=1,ROW_LENGTH GSS2F403.209
J=TOP_ROW_START+I-1 ! point along North Pole row GSS2F403.210
U_COPY(I)=FIELDU(J) GSS2F403.211
V_COPY(I)=FIELDV(J) GSS2F403.212
ENDDO GSS2F403.213
ENDIF ! (IF at_top_of_LPG) GSS2F403.214
GSS2F403.215
IF (at_base_of_LPG) THEN GSS2F403.216
! South Pole GSS2F403.217
! Copy SP row in U/V_COPY arrays GSS2F403.218
DO I=1,ROW_LENGTH GSS2F403.219
J=U_BOT_ROW_START+I-1 ! point along South Pole row GSS2F403.220
U_COPY(I)=FIELDU(J) GSS2F403.221
V_COPY(I)=FIELDV(J) GSS2F403.222
ENDDO GSS2F403.223
ENDIF ! (IF at_base_of_LPG) GSS2F403.224
c GSS2F403.225
call barrier(
) GSS2F403.226
c GSS2F403.227
c--process North and South Rows together GSS2F403.228
IF (at_top_of_LPG .or. at_base_of_LPG) THEN GSS2F403.229
c--work out the PE at the start of my Row GSS2F403.230
my_row_pe=(mype/nproc_x)*nproc_x GSS2F403.231
g_start(1)=1 GSS2F403.232
c--find the global start addresses for PE's in my row GSS2F403.233
do i=2, nproc_x+1 GSS2F403.234
g_start(i)=g_start(i-1)+g_blsizep(1,i-2) GSS2F403.235
end do GSS2F403.236
c write(0,*) my_pe(), (g_start(i), i=1, nproc_x+1) GSS2F403.237
c GSS2F403.238
c--set the global start address for the start of my exchange GSS2F403.239
g_new_start=g_start(mype-my_row_pe+1)+half_rl GSS2F403.240
c--set the length of the data to exchange GSS2F403.241
l_new_length=row_length-2*ew_halo GSS2F403.242
c--set the start address GSS2F403.243
l_iadd=1+ew_halo GSS2F403.244
c--loop until we have moved all the segments for this PE GSS2F403.245
1000 continue GSS2F403.246
c--check we not off the end GSS2F403.247
if(g_new_start.gt.glsize(1)) g_new_start= GSS2F403.248
2 g_new_start-glsize(1) GSS2F403.249
c--loop over the PE's in a row GSS2F403.250
do i=1, nproc_x GSS2F403.251
c--check if this glocal address is on the the current remote PE GSS2F403.252
if(g_new_start.ge.g_start(i) .and. GSS2F403.253
2 g_new_start.lt.g_start(i+1)) then GSS2F403.254
c--compute the new local address on the remote PE GSS2F403.255
l_rem_iadd=g_new_start-g_start(i) GSS2F403.256
c--compute the number of words to move on this get GSS2F403.257
current_length=min(l_new_length, GSS2F403.258
2 g_start(i+1)-g_new_start) GSS2F403.259
c write(0,*) my_pe(), ' fetch ', current_length, GSS2F403.260
c 2 ' from PE ',i-1, ' at ',l_rem_iadd+halo_4th, GSS2F403.261
c 3 ' to ', l_iadd GSS2F403.262
c--get the data GSS2F403.263
call shmem_get(
u_out_copy(l_iadd), GSS2F403.264
2 u_copy(l_rem_iadd+1+ew_halo), current_length, GSS2F403.265
3 my_row_pe+i-1) GSS2F403.266
call shmem_get(
v_out_copy(l_iadd), GSS2F403.267
2 v_copy(l_rem_iadd+1+ew_halo), current_length, GSS2F403.268
3 my_row_pe+i-1) GSS2F403.269
GSS2F403.270
c--update the global address and local addresses and lengths GSS2F403.271
g_new_start=g_new_start+current_length GSS2F403.272
l_iadd=l_iadd+current_length GSS2F403.273
l_new_length=l_new_length-current_length GSS2F403.274
c--check if we have finished GSS2F403.275
if(l_new_length.gt.0) goto 1000 GSS2F403.276
goto 1100 GSS2F403.277
endif GSS2F403.278
end do GSS2F403.279
write(0,*) 'PE ', my_pe(), ' is Lost in UV_DIF ', GSS2F403.280
2 l_new_length, current_length, l_rem_iadd+halo_4th, l_iadd, GSS2F403.281
3 g_new_start, (g_start(i), i=1, nproc_x+1) GSS2F403.282
call abort
('Lost in UV_DIF') GSS2F403.283
GSS2F403.284
1100 continue GSS2F403.285
u_out_copy(1)=u_copy(1) GSS2F403.286
u_out_copy(row_length)=u_copy(row_length) GSS2F403.287
v_out_copy(1)=v_copy(1) GSS2F403.288
v_out_copy(row_length)=v_copy(row_length) GSS2F403.289
c write(0,*) my_pe(), (v_copy(i), i=1, row_length) GSS2F403.290
GSS2F403.291
ENDIF ! (at_top_of_LPG .or. at_base_of_LPG) GSS2F403.292
c GSS2F403.293
IF (at_top_of_LPG) THEN GSS2F403.294
! North Pole GSS2F403.295
DO I=1,ROW_LENGTH GSS2F403.296
J=TOP_ROW_START+I-1 ! point along North Pole row GSS2F403.297
FIELD1(J)=-(FIELDU(J)+u_out_copy(I)) GSS2F403.298
FIELD2(J)=-(FIELDV(J)+v_out_copy(I)) GSS2F403.299
ENDDO GSS2F403.300
ENDIF ! (IF at_top_of_LPG) GSS2F403.301
c GSS2F403.302
IF (at_base_of_LPG) THEN GSS2F403.303
! South Pole GSS2F403.304
DO I=1,ROW_LENGTH GSS2F403.305
J=P_BOT_ROW_START+I-1 GSS2F403.306
FIELD1(J)=u_out_copy(I)+FIELDU(J-ROW_LENGTH) GSS2F403.307
FIELD2(J)=v_out_copy(I)+FIELDV(J-ROW_LENGTH) GSS2F403.308
ENDDO GSS2F403.309
ENDIF ! (IF at_base_of_LPG) GSS2F403.310
c GSS2F403.311
endif ! Code for more then one processor in each direction GSS2F403.312
c GSS2F403.313
*ENDIF GSS2F403.314
APB0F401.1750
*ENDIF APB0F401.1751
*ENDIF ATD1F400.876
ATD1F400.877
C---------------------------------------------------------------------- ATD1F400.878
CL SECTION 2.3 CALCULATE SECOND TERM IN EQUATION (47) AND ADD ATD1F400.879
CL ONTO FIRST TERM TO GET TOTAL CORRECTION. ATD1F400.880
C---------------------------------------------------------------------- ATD1F400.881
ATD1F400.882
DO I= START_U_UPDATE,END_U_UPDATE ATD1F400.883
SCALAR=SEC_U_LATITUDE(I)/RS_SQUARED_DELTAP(I) ATD1F400.884
FIELDU(I)=(FIELD3(I)+DIFFUSION_NS(I)*FIELD1(I) ATD1F400.885
& -DIFFUSION_NS(I+ROW_LENGTH)*FIELD1(I+ROW_LENGTH))* ATD1F400.886
& SCALAR ATD1F400.887
FIELDV(I)=(FIELD4(I)+DIFFUSION_NS(I)*FIELD2(I) ATD1F400.888
& -DIFFUSION_NS(I+ROW_LENGTH)*FIELD2(I+ROW_LENGTH))* ATD1F400.889
& SCALAR ATD1F400.890
END DO ATD1F400.891
ATD1F400.892
CL LIMITED AREA ZERO AT LATERAL BOUNDARIES ATD1F400.893
ATD1F400.894
*IF -DEF,GLOBAL ATD1F400.895
ATD1F400.896
! Set all boundaries of the increment to zero. APB0F401.1752
*IF DEF,MPP APB0F401.1753
IF (at_top_of_LPG) THEN APB0F401.1754
*ENDIF APB0F401.1755
! Northern boundary APB0F401.1756
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.1757
FIELDU(I)=0.0 APB0F401.1758
FIELDV(I)=0.0 APB0F401.1759
ENDDO APB0F401.1760
*IF DEF,MPP APB0F401.1761
ENDIF APB0F401.1762
APB0F401.1763
IF (at_base_of_LPG) THEN APB0F401.1764
*ENDIF APB0F401.1765
! Southern boundary APB0F401.1766
DO I=U_BOT_ROW_START,U_BOT_ROW_START+ROW_LENGTH-1 APB0F401.1767
FIELDU(I)=0.0 APB0F401.1768
FIELDV(I)=0.0 APB0F401.1769
ENDDO APB0F401.1770
*IF DEF,MPP APB0F401.1771
ENDIF APB0F401.1772
APB0F401.1773
IF (at_left_of_LPG) THEN APB0F401.1774
*ENDIF APB0F401.1775
! Western boundary APB0F401.1776
DO I=START_U_UPDATE+FIRST_ROW_PT-1,END_U_UPDATE,ROW_LENGTH APB0F401.1777
FIELDU(I)=0.0 APB0F401.1778
FIELDV(I)=0.0 APB0F401.1779
ENDDO APB0F401.1780
*IF DEF,MPP APB0F401.1781
ENDIF APB0F401.1782
APB0F401.1783
IF (at_right_of_LPG) THEN APB0F401.1784
*ENDIF APB0F401.1785
! Eastern boundary - set last two points of each row to zero APB0F401.1786
DO I=START_U_UPDATE+LAST_ROW_PT-2,END_U_UPDATE,ROW_LENGTH APB0F401.1787
FIELDU(I)=0.0 APB0F401.1788
FIELDU(I+1)=0.0 APB0F401.1789
FIELDV(I)=0.0 APB0F401.1790
FIELDV(I+1)=0.0 APB0F401.1791
ENDDO APB0F401.1792
*IF DEF,MPP APB0F401.1793
ENDIF APB0F401.1794
*ENDIF APB0F401.1795
ATD1F400.913
*ENDIF ATD1F400.914
CL END OF ROUTINE UV_DIF UVDIF1A.267
UVDIF1A.268
RETURN UVDIF1A.269
END UVDIF1A.270
*ENDIF UVDIF1A.271