*IF DEF,C90_1A,OR,DEF,C90_2A,OR,DEF,C90_2B AAD2F404.292
C ******************************COPYRIGHT****************************** GTS2F400.2701
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.2702
C GTS2F400.2703
C Use, duplication or disclosure of this code is subject to the GTS2F400.2704
C restrictions as set forth in the contract. GTS2F400.2705
C GTS2F400.2706
C Meteorological Office GTS2F400.2707
C London Road GTS2F400.2708
C BRACKNELL GTS2F400.2709
C Berkshire UK GTS2F400.2710
C RG12 2SZ GTS2F400.2711
C GTS2F400.2712
C If no contract has been raised with this copy of the code, the use, GTS2F400.2713
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.2714
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.2715
C Modelling at the above address. GTS2F400.2716
C ******************************COPYRIGHT****************************** GTS2F400.2717
C GTS2F400.2718
CLL Subroutine EXTDIAG ------------------------------------------------ EXTDIA1A.3
CLL EXTDIA1A.4
CLL Purpose : To extend a set of arrays of diagnostic values to full EXTDIA1A.5
CLL horizontal arrays for STASH processing. The number of EXTDIA1A.6
CLL levels in each array is found from STASH control routine. EXTDIA1A.7
CLL Service routine EXTDIA1A.8
CLL version for Cray YMP EXTDIA1A.9
CLL EXTDIA1A.10
CLL CW, WI <- programmer of some or all of previous code or changes EXTDIA1A.11
CLL EXTDIA1A.12
CLL Model Modification history from model version 3.0: EXTDIA1A.13
CLL version Date EXTDIA1A.14
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.57
CLL portability. Author Tracey Smith. TS150793.58
!LL 4.3 12/02/97 Added PPX arguments and MPP code P.Burton GPB1F403.1310
!LL 4.4 05/09/97 Initialise superpolar rows to prevent NaNs getting GSM1F404.26
!LL into fields. S.D.Mullerworth GSM1F404.27
CLL EXTDIA1A.15
CLL Programming Standard : Unified Model Documentation paper number 4 EXTDIA1A.16
CLL : Version no2, dated 18/01/90 EXTDIA1A.17
CLL EXTDIA1A.18
CLL System components covered : D3 EXTDIA1A.19
CLL EXTDIA1A.20
CLL System task : P0 EXTDIA1A.21
CLL EXTDIA1A.22
CLL Documentaton : UM Documentation Paper No P0, version 11 dated EXTDIA1A.23
CLL version 11 dated (26/22/90) EXTDIA1A.24
CLLEND ------------------------------------------------------------ EXTDIA1A.25
EXTDIA1A.26
C*L ARGUMENTS: EXTDIA1A.27
EXTDIA1A.28
SUBROUTINE EXTDIAG (DATA,SI,SF,I1,I2, 16,2EXTDIA1A.29
& LEN_DATA,ROW_LENGTH,STLIST,LEN_STLIST, EXTDIA1A.30
& STINDEX,LEN_STINDEX, EXTDIA1A.31
& STASH_LEVELS, LEN_STASHLEVELS, EXTDIA1A.32
& STASH_PSEUDO_LEVELS, NUM_STASH_PSEUDO, EXTDIA1A.33
& im_ident,is, GPB1F403.1311
*CALL ARGPPX
GPB1F403.1312
& ICODE, CMESSAGE) EXTDIA1A.34
EXTDIA1A.35
IMPLICIT NONE EXTDIA1A.36
EXTDIA1A.37
INTEGER EXTDIA1A.38
& I1, ! Item numbers of diagnostic EXTDIA1A.39
& I2, ! values to be extended EXTDIA1A.40
& SI(I2), ! Address of fields in DATA array EXTDIA1A.41
& LEN_DATA, ! Length of input data array EXTDIA1A.42
& ROW_LENGTH, ! Number of points in row, assumed the EXTDIA1A.43
C ! same for all fields. EXTDIA1A.44
& LEN_STLIST, ! EXTDIA1A.45
& STLIST(LEN_STLIST,*), !STASH list EXTDIA1A.46
& LEN_STINDEX, EXTDIA1A.47
& STINDEX(LEN_STINDEX,I2), !STASH index EXTDIA1A.48
& LEN_STASHLEVELS, ! EXTDIA1A.49
& STASH_LEVELS(LEN_STASHLEVELS,*), ! STASH levels list. EXTDIA1A.50
& NUM_STASH_PSEUDO, ! Size of: EXTDIA1A.51
& STASH_PSEUDO_LEVELS(NUM_STASH_PSEUDO+1,*), ! STASH pseudo EXTDIA1A.52
C ! levels list EXTDIA1A.53
& ICODE ! Return code =0 Normal exit EXTDIA1A.54
C >1 Error EXTDIA1A.55
INTEGER GPB1F403.1313
& im_ident ! IN: internal model identifier of STASH data GPB1F403.1314
&, is ! IN: section number of STASH data GPB1F403.1315
EXTDIA1A.56
CHARACTER*80 CMESSAGE TS150793.59
EXTDIA1A.58
REAL EXTDIA1A.59
& DATA(LEN_DATA)! Input data EXTDIA1A.60
EXTDIA1A.61
LOGICAL EXTDIA1A.62
& SF(I2) ! Logical switch set .TRUE. if field to EXTDIA1A.63
C ! be extended. EXTDIA1A.64
C* EXTDIA1A.65
*CALL CSUBMODL
GPB1F403.1316
*CALL CPPXREF
GPB1F403.1317
*CALL PPXLOOK
GPB1F403.1318
*IF DEF,MPP GPB1F403.1319
*CALL PARVARS
GPB1F403.1320
*ENDIF GPB1F403.1321
*CALL AMAXSIZE
GPB1F403.1322
C Local variables EXTDIA1A.66
EXTDIA1A.67
REAL EXTDIA1A.68
& NP_MEAN(P_LEVELS_MAX) ! NP mean value GPB1F403.1323
&, SP_MEAN(P_LEVELS_MAX) ! SP mean value GPB1F403.1324
EXTDIA1A.71
INTEGER EXTDIA1A.72
& ITEM, ! STASH item number EXTDIA1A.73
& FIELD, ! Length of individual diagnostic field EXTDIA1A.74
& I, ! EXTDIA1A.75
& J, ! LAM E boundary pointer EXTDIA1A.76
& K, ! EXTDIA1A.77
& INDEX, ! Position within STASH list, refering to EXTDIA1A.78
C ! current ITEM EXTDIA1A.79
& LEVELS, ! EXTDIA1A.80
& START ! Position of first point of field at level EXTDIA1A.81
C ! to be processed. EXTDIA1A.82
GPB1F403.1325
*IF DEF,MPP GPB1F403.1326
INTEGER GPB1F403.1327
& gr ! grid type of field being processed GPB1F403.1328
&, fld_type ! field type (P or U) of the field being processed GPB1F403.1329
&, sp_row_start ! start point of south pole GPB1F403.1330
&, np_row_start ! start point of north pole GPB1F403.1331
&, lvl,lsl,lso,nv,info ! arguments to RVECSUMR GPB1F403.1332
GPB1F403.1333
! Functions: GPB1F403.1334
INTEGER GPB1F403.1335
& EXPPXI,GET_FLD_TYPE GPB1F403.1336
GPB1F403.1337
*ENDIF GPB1F403.1338
EXTDIA1A.83
DO ITEM=I1,I2 EXTDIA1A.84
IF(SF(ITEM)) THEN EXTDIA1A.85
EXTDIA1A.86
CL Calculate number of levels at which each diagnostic is held EXTDIA1A.87
EXTDIA1A.88
INDEX=STINDEX(1,ITEM) EXTDIA1A.89
EXTDIA1A.90
IF(STLIST(10,INDEX).LT.0) THEN EXTDIA1A.91
EXTDIA1A.92
C Levels list present EXTDIA1A.93
EXTDIA1A.94
LEVELS=STASH_LEVELS(1,-STLIST(10,INDEX)) EXTDIA1A.95
ELSEIF(STLIST(10,INDEX).LT.100) THEN EXTDIA1A.96
EXTDIA1A.97
C Top and bottom levels EXTDIA1A.98
EXTDIA1A.99
LEVELS=STLIST(11,INDEX)-STLIST(10,INDEX)+1 EXTDIA1A.100
IF(LEVELS.LE.0) THEN EXTDIA1A.101
ICODE=1 EXTDIA1A.102
CMESSAGE='EXTDIAG: Illegal levels limits.' EXTDIA1A.103
WRITE(6,*)'EXTDIAG illegal levels, STLIST(10,11)=', GIE0F403.148
& STLIST(10,INDEX),STLIST(11,INDEX) EXTDIA1A.105
WRITE(6,*)' SECTION AND ITEM NUMBER ', GIE0F403.149
* STLIST(2,INDEX),STLIST(1,INDEX) EXTDIA1A.107
RETURN EXTDIA1A.108
END IF EXTDIA1A.109
ELSE EXTDIA1A.110
LEVELS=1 EXTDIA1A.111
END IF EXTDIA1A.112
EXTDIA1A.113
C The 26th entry of STLIST indicates if the diagnostic is input to STASH EXTDIA1A.114
C on pseudo-levels and, if so, which - zero for none, otherwise the EXTDIA1A.115
C number of the list of pseudo-levels the data will be input to STASH EXTDIA1A.116
C on, and the first element of this list is the total number in it. EXTDIA1A.117
C (NUM_PSEUDO_LEVELS being the maximum value over all pseudo-levels EXTDIA1A.118
C lists.) So LEVELS, which is currently the number of physical levels EXTDIA1A.119
C the data is on, must be multiplied by this to give the number of EXTDIA1A.120
C combinations of physical levels and pseudo-levels. EXTDIA1A.121
EXTDIA1A.122
IF ( STLIST(26,INDEX) .GT. 0 ) EXTDIA1A.123
& LEVELS = LEVELS * STASH_PSEUDO_LEVELS(1,STLIST(26,INDEX)) EXTDIA1A.124
EXTDIA1A.125
CL Define length of field EXTDIA1A.126
EXTDIA1A.127
*IF -DEF,MPP GPB1F403.1339
FIELD=STLIST(17,INDEX)/LEVELS EXTDIA1A.128
*ELSE GPB1F403.1340
! Find out the gridtype of the field GPB1F403.1341
GR = EXPPXI
(im_ident,IS,ITEM,ppx_grid_type, GPB1F403.1342
*CALL ARGPPX
GPB1F403.1343
& ICODE,CMESSAGE) GPB1F403.1344
GPB1F403.1345
IF (ICODE .GT. 0) GOTO 9999 GPB1F403.1346
GPB1F403.1347
! and use this to find the field type (p field or u field) GPB1F403.1348
GPB1F403.1349
fld_type=GET_FLD_TYPE
(GR) GPB1F403.1350
GPB1F403.1351
IF (atbase) THEN GPB1F403.1352
IF (fld_type .EQ. fld_type_p) THEN GPB1F403.1353
sp_row_start=(lasize(2)-Offy-2)*ROW_LENGTH+Offx+1 GPB1F403.1354
ELSEIF (fld_type .EQ. fld_type_u) THEN GPB1F403.1355
sp_row_start=(lasize(2)-Offy-3)*ROW_LENGTH+Offx+1 GPB1F403.1356
ELSE GPB1F403.1357
ICODE=1 GPB1F403.1358
CMESSAGE='EXTDIAG : Unrecognized field type' GPB1F403.1359
GOTO 9999 GPB1F403.1360
ENDIF GPB1F403.1361
ENDIF GPB1F403.1362
IF (attop) GPB1F403.1363
& np_row_start=(Offy+1)*ROW_LENGTH+1+Offx GPB1F403.1364
GPB1F403.1365
FIELD=lasize(1)*lasize(2) GPB1F403.1366
GPB1F403.1367
*ENDIF GPB1F403.1368
EXTDIA1A.129
CL Extend diagnostic to full field EXTDIA1A.130
EXTDIA1A.131
*IF DEF,GLOBAL GPB1F403.1369
*IF DEF,MPP GPB1F403.1370
! Calculate polar mean values GPB1F403.1371
GPB1F403.1372
DO K=1,LEVELS GPB1F403.1373
NP_MEAN(K)=0.0 GPB1F403.1374
SP_MEAN(K)=0.0 GPB1F403.1375
ENDDO GPB1F403.1376
GPB1F403.1377
lvl=FIELD ! size of each field GPB1F403.1378
lsl=ROW_LENGTH-2*Offx ! size of vector to sum GPB1F403.1379
nv=LEVELS ! number of vectors GPB1F403.1380
GPB1F403.1381
IF (attop) THEN GPB1F403.1382
GPB1F403.1383
lso=np_row_start ! start address of vector GPB1F403.1384
GPB1F403.1385
*IF DEF,REPROD GPB1F403.1386
CALL GCG_RVECSUMR(
lvl,lsl,lso,nv,DATA(SI(ITEM)), GPB1F403.1387
& gc_proc_row_group,info,NP_MEAN) GPB1F403.1388
*ELSE GPB1F403.1389
CALL GCG_RVECSUMF(
lvl,lsl,lso,nv,DATA(SI(ITEM)), GPB1F403.1390
& gc_proc_row_group,info,NP_MEAN) GPB1F403.1391
*ENDIF GPB1F403.1392
DO K=1,LEVELS GPB1F403.1393
NP_MEAN(K)=NP_MEAN(K)/glsize(1) GPB1F403.1394
ENDDO GPB1F403.1395
GPB1F403.1396
ENDIF GPB1F403.1397
GPB1F403.1398
IF (atbase) THEN GPB1F403.1399
GPB1F403.1400
lso=sp_row_start ! start address of vector GPB1F403.1401
GPB1F403.1402
*IF DEF,REPROD GPB1F403.1403
CALL GCG_RVECSUMR(
lvl,lsl,lso,nv,DATA(SI(ITEM)), GPB1F403.1404
& gc_proc_row_group,info,SP_MEAN) GPB1F403.1405
*ELSE GPB1F403.1406
CALL GCG_RVECSUMF(
lvl,lsl,lso,nv,DATA(SI(ITEM)), GPB1F403.1407
& gc_proc_row_group,info,SP_MEAN) GPB1F403.1408
*ENDIF GPB1F403.1409
DO K=1,LEVELS GPB1F403.1410
SP_MEAN(K)=SP_MEAN(K)/glsize(1) GPB1F403.1411
ENDDO GPB1F403.1412
GPB1F403.1413
ENDIF GPB1F403.1414
*ELSE GPB1F403.1415
GPB1F403.1416
DO K=1,LEVELS GPB1F403.1417
GPB1F403.1418
START=FIELD*(K-1)+SI(ITEM)-1 GPB1F403.1419
GPB1F403.1420
NP_MEAN(K)=0.0 GPB1F403.1421
SP_MEAN(K)=0.0 GPB1F403.1422
GPB1F403.1423
DO I=1,ROW_LENGTH GPB1F403.1424
NP_MEAN(K)=NP_MEAN(K)+ DATA(START+I+ROW_LENGTH) GPB1F403.1425
SP_MEAN(K)=SP_MEAN(K)+ DATA(START+I+FIELD-2*ROW_LENGTH) GPB1F403.1426
ENDDO GPB1F403.1427
GPB1F403.1428
NP_MEAN(K)=NP_MEAN(K)/ROW_LENGTH GPB1F403.1429
SP_MEAN(K)=SP_MEAN(K)/ROW_LENGTH GPB1F403.1430
GPB1F403.1431
ENDDO GPB1F403.1432
GPB1F403.1433
*ENDIF GPB1F403.1434
*ENDIF GPB1F403.1435
DO K=1,LEVELS EXTDIA1A.132
START=FIELD*(K-1)+SI(ITEM)-1 EXTDIA1A.133
EXTDIA1A.134
CL Copy diagnostic information to N and S boundaries EXTDIA1A.135
EXTDIA1A.136
! Update Northern boundary / Pole GPB1F403.1436
*IF DEF,MPP GPB1F403.1437
IF (attop) THEN GPB1F403.1438
!L Initialise unused row GSM1F404.28
! *DIR$ CACHE_BYPASS DATA GPB0F405.201
DO I=1,Offy*ROW_LENGTH GSM1F404.30
DATA(START+I)=0. GSM1F404.31
ENDDO GSM1F404.32
GSM1F404.33
DO I=Offy*ROW_LENGTH+1,(Offy+1)*ROW_LENGTH GPB1F403.1439
*ELSE GPB1F403.1440
DO I=1,ROW_LENGTH GPB1F403.1441
*ENDIF GPB1F403.1442
*IF DEF,GLOBAL GPB1F403.1443
DATA(START+I)=NP_MEAN(K) GPB1F403.1444
*ELSE GPB1F403.1445
DATA(START+I)=DATA(START+I+ROW_LENGTH) GPB1F403.1446
*ENDIF GPB1F403.1447
ENDDO GPB1F403.1448
*IF DEF,MPP GPB1F403.1449
ENDIF GPB1F403.1450
*ENDIF GPB1F403.1451
GPB1F403.1452
! Update Southern boundary / Pole GPB1F403.1453
*IF DEF,MPP GPB1F403.1454
IF (atbase) THEN GPB1F403.1455
!L Initialise unused row GSM1F404.34
! *DIR$ CACHE_BYPASS DATA GPB0F405.202
DO I=sp_row_start+2*ROW_LENGTH-Offx+1, GSM1F404.36
& lasize(1)*lasize(2) GSM1F404.37
DATA(START+I)=0. GSM1F404.38
ENDDO GSM1F404.39
GSM1F404.40
DO I=sp_row_start-Offx+ROW_LENGTH, GPB1F403.1456
& sp_row_start+2*ROW_LENGTH-Offx GPB1F403.1457
*ELSE GPB1F403.1458
DO I=FIELD-ROW_LENGTH+1,FIELD GPB1F403.1459
*ENDIF GPB1F403.1460
*IF DEF,GLOBAL GPB1F403.1461
DATA(START+I)=SP_MEAN(K) GPB1F403.1462
*ELSE GPB1F403.1463
DATA(START+I)=DATA(START+I-ROW_LENGTH) GPB1F403.1464
*ENDIF GPB1F403.1465
ENDDO GPB1F403.1466
*IF DEF,MPP GPB1F403.1467
ENDIF GPB1F403.1468
*ENDIF GPB1F403.1469
GPB1F403.1470
*IF -DEF,GLOBAL GPB1F403.1471
! Update Western boundary GPB1F403.1472
*IF DEF,MPP GPB1F403.1473
IF (atleft) THEN GPB1F403.1474
DO I=Offx+1,FIELD,ROW_LENGTH GPB1F403.1475
*ELSE GPB1F403.1476
DO I=1,FIELD,ROW_LENGTH GPB1F403.1477
*ENDIF GPB1F403.1478
DATA(START+I)=DATA(START+I+1) GPB1F403.1479
ENDDO GPB1F403.1480
*IF DEF,MPP GPB1F403.1481
ENDIF GPB1F403.1482
*ENDIF GPB1F403.1483
GPB1F403.1484
! Update Eastern boundary GPB1F403.1485
*IF DEF,MPP GPB1F403.1486
IF (atright) THEN GPB1F403.1487
DO I=ROW_LENGTH-Offx,FIELD,ROW_LENGTH GPB1F403.1488
*ELSE GPB1F403.1489
DO I=ROW_LENGTH,FIELD,ROW_LENGTH GPB1F403.1490
*ENDIF GPB1F403.1491
DATA(START+I)=DATA(START+I-1) GPB1F403.1492
ENDDO GPB1F403.1493
*IF DEF,MPP GPB1F403.1494
ENDIF GPB1F403.1495
*ENDIF GPB1F403.1496
GPB1F403.1497
*ENDIF GPB1F403.1498
EXTDIA1A.171
END DO EXTDIA1A.172
END IF EXTDIA1A.173
END DO EXTDIA1A.174
EXTDIA1A.175
9999 CONTINUE GPB1F403.1499
RETURN EXTDIA1A.176
END EXTDIA1A.177
*ENDIF EXTDIA1A.178