*IF DEF,CONTROL UMSHELL1.2
C ******************************COPYRIGHT****************************** GTS2F400.10765
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.10766
C GTS2F400.10767
C Use, duplication or disclosure of this code is subject to the GTS2F400.10768
C restrictions as set forth in the contract. GTS2F400.10769
C GTS2F400.10770
C Meteorological Office GTS2F400.10771
C London Road GTS2F400.10772
C BRACKNELL GTS2F400.10773
C Berkshire UK GTS2F400.10774
C RG12 2SZ GTS2F400.10775
C GTS2F400.10776
C If no contract has been raised with this copy of the code, the use, GTS2F400.10777
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.10778
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.10779
C Modelling at the above address. GTS2F400.10780
C ******************************COPYRIGHT****************************** GTS2F400.10781
C GTS2F400.10782
CLL Program: UM_SHELL ------------------------------------------------- UMSHELL1.3
CLL UMSHELL1.4
CLL Purpose: Outermost shell of control program for the Unified Model. UMSHELL1.5
CLL Acquires size information needed for dynamic allocation of UMSHELL1.6
CLL configuration-dependent arrays and calls U_MODEL (the UMSHELL1.7
CLL master control routine) to allocate the arrays and perform UMSHELL1.8
CLL the top-level control functions and timestepping. UMSHELL1.9
CLL UMSHELL1.10
CLL Tested under compiler: cft77 UMSHELL1.11
CLL Tested under OS version: UNICOS 6.1.5A UMSHELL1.12
CLL UMSHELL1.13
CLL Model Modification history: UMSHELL1.14
CLL version date UMSHELL1.15
CLL 3.2 30/03/93 Introduced as new DECK to allow dynamic allocation UMSHELL1.16
CLL of main data arrays in U_MODEL. UMSHELL1.17
CLL 3.3 30/09/93 Option on frequency of convection scheme calls. RB300993.151
CLL R.T.H.Barnes. RB300993.152
! 3.5 28/03/95 Open UNIT05 as a file rather than stdin GPB0F305.1
! P. Burton GPB0F305.2
CLL 3.5 Apr. 95 Submodels project: GSS1F305.843
CLL Introduce CALL STASH_PROC. This is the top-level GSS1F305.844
CLL control routine for processing of STASH requests GSS1F305.845
CLL and STASH addressing. Up to UM vn. 3.4, these GSS1F305.846
CLL functions were performed by the user interface GSS1F305.847
CLL processing routines. Introduce argument ppxRecs GSS1F400.722
CLL into U_MODEL - for dynamic allocation of ppxref GSS1F400.723
CLL look-up arrays in U_MODEL. GSS1F400.724
CLL S.J.Swarbrick GSS1F305.851
CLL 4.0 18/10/95 Add ICODE error return to GET_FILE call. RTHBarnes GRB2F400.3
CLL 4.1 14/03/96 Introduce Wave sub-model. RTHBarnes. WRB1F401.1117
CLL 4.1 22/05/96 Replaced *DEF FAST with FRADIO to allow fast GGH3F401.34
CLL radiation i/o code to be used. G Henderson GGH3F401.35
CLL 4.1 May 96 Restructure calls to HDPPXRF - for new GSS2F401.464
CLL STASHmaster file system. GSS2F401.465
CLL STASHmaster now read by FORTRAN i/o (not C i/o), so GSS2F401.466
CLL unit no. changed from 1 to 22 - unit 1 already in GSS2F401.467
CLL use for FORTRAN i/o (HK_FILE). GSS2F401.468
CLL Unit 22 was lowest unit no. (apparently) GSS2F401.469
CLL available for FORTRAN i/o. S.J.Swarbrick GSS2F401.470
!LL 4.2 21/08/96 MPP code : Added flexible decompositions, GPB0F402.293
!LL replacing DECOMPOSE_DATA by DECOMPOSE_ATMOS GPB0F402.294
!LL and adding DECOMPOSE_OCN, and calling GPB0F402.295
!LL CHANGE_DECOMP to set to atmosphere decomposition. GPB0F402.296
!LL Removed the calls to set up GCOM groups. GPB0F402.297
!LL Added code to find out ocean decomposition GPB0F402.298
!LL from environment variables GPB0F402.299
!LL P.Burton GPB0F402.300
CLL 4.2 27/11/96 Changes to parallelise writes to archiving system GLW2F402.94
CLL L. Wiles GLW2F402.95
!LL 4.3 19/03/97 Find out the clock tick rate - required for GPB3F403.162
!LL producing timer information. P.Burton GPB3F403.163
!LL 4.3 18/02/97 Added l_ocyclic arg to decomp_ocean P.Burton GPB2F403.118
!LL 4.3 30/04/97 Added code to read the UM_SECTOR_SIZE from the GBC0F403.1
!LL Shell variable of the same name. GBC0F403.2
!LL B. Carruthers Cray Research. GBC0F403.3
!LL 4.3 09/05/97 Added code to read the UM_RNL_SKIP from the GBC0F403.4
!LL Shell variable of the same name. GBC0F403.5
!LL B. Carruthers Cray Research. GBC0F403.6
!LL 4.4 11/07/97 Check nproc_max is LE to MAXPROC P.Burton GPB1F404.75
CLL 4.4 Oct. 1997 Changed the error handling from subroutine GDW1F404.99
CLL HDPPXRF. Now a -ve error code indicates GDW1F404.100
CLL a warning and a +ve indicates a fatal GDW1F404.101
CLL problem. Currently the latter only occurs GDW1F404.102
CLL if the STASHmaster version differs from the GDW1F404.103
CLL running version of the UM. GDW1F404.104
CLL Shaun de Witt GDW1F404.105
! 4.4 30/09/97 Added code to permit the SHMEM/NAM timeout GBCAF404.8
! value to be set from a shell variable. GBCAF404.9
! Author: Bob Carruthers Cray Research. GBCAF404.10
! 4.4 18/09/97 Remove the code for GET_CHAR_LEN, and turn GBC6F404.314
! it into a separate deck. GBC6F404.315
! Author: Bob Carruthers Cray Research. GBC6F404.316
!LL 4.5 08/01/98 Ensure any old unit6 output files are deleted GPB0F405.19
!LL before the new one is opened. P.Burton GPB0F405.20
! 4.5 08/07/98 Print only the leading non-blank GBC1F405.29
! characters in 'cmessage' GBC1F405.30
! Author: Bob Carruthers, Cray Research GBC1F405.31
! 4.5 17/08/98 Check return codes from calls to HDPPXRF. GBCKF405.1
! Author: Bob Carruthers Cray Research. GBCKF405.2
!LL 4.5 29/07/98 Call DERV_INTF_A. D. Robinson. GDR2F405.167
! 4.5 17/08/98 Print date/time at start and end of UM Job. GDR3F405.1
! D. Robinson. GDR3F405.2
!LL 4.5 15/04/98 Call DERV_LAND_FIELD. D. Robinson. GDR5F405.1
!LL 4.5 29/07/98 Call DERV_INTF_O. P. Horrocks. GMB1F405.560
! 4.5 20/01/98 Changed default sector size to 2048 P.Burton GPB0F405.27
CLL UMSHELL1.18
CLL Programming standard: UM Doc Paper 3, version 2 (7/9/90) UMSHELL1.19
CLL UMSHELL1.20
CLL Logical components covered: C0 UMSHELL1.21
CLL UMSHELL1.22
CLL Project task: C0 UMSHELL1.23
CLL UMSHELL1.24
CLL External documentation: On-line UM document C1 - The top-level UMSHELL1.25
CLL dynamic allocation UMSHELL1.26
CLL UMSHELL1.27
CLL ------------------------------------------------------------------- UMSHELL1.28
C*L Interface and arguments: ------------------------------------------ UMSHELL1.29
C UMSHELL1.30
PROGRAM UM_SHELL ,45UMSHELL1.31
C UMSHELL1.32
C*---------------------------------------------------------------------- UMSHELL1.33
IMPLICIT NONE UMSHELL1.34
C UMSHELL1.35
C Subroutines called UMSHELL1.36
C UMSHELL1.37
EXTERNAL TIMER,READSIZE,UM_INDEX,U_MODEL,ABORT UMSHELL1.38
*IF DEF,ATMOS,AND,DEF,MPP GDR5F405.2
& ,DERV_LAND_FIELD GDR5F405.3
*ENDIF GDR5F405.4
& ,HDPPXRF,STASH_PROC GSS1F305.852
*IF DEF,ATMOS GDR2F405.168
& ,DERV_INTF_A GDR2F405.169
*ENDIF GDR2F405.170
*IF DEF,OCEAN GMB1F405.561
& ,DERV_INTF_O GMB1F405.562
*ENDIF GMB1F405.563
C UMSHELL1.39
C Local variables UMSHELL1.40
C UMSHELL1.41
*IF DEF,CRI_FFIO GBC0F403.72
real secondr, close_time GBC0F403.73
*ENDIF GBC0F403.74
INTEGER ICODE ! Work - Internal return code UMSHELL1.42
INTEGER ISTATUS ! RETURN STATUS FROM OPEN GPB0F305.3
CHARACTER*80 FILENAME ! RETURN FILENAME FROM GET_FILE GPB0F305.4
CHARACTER*256 CMESSAGE ! Work - Internal error message UMSHELL1.43
*IF DEF,MPP GPB0F305.97
INTEGER local_row_len, ! new row_len after decomposition GPB0F305.98
& local_p_rows, ! new number of rows afer decomposition GPB0F305.99
*IF DEF,ATMOS GPB0F402.301
& atm_nprocx, ! number of procs EW for atmosphere GPB0F402.302
& atm_nprocy, ! number of procs NS for atmosphere GPB0F402.303
*ENDIF GPB0F402.304
*IF DEF,OCEAN GPB0F402.305
& ocn_nprocx, ! number of procs EW for ocean GPB0F402.306
& ocn_nprocy, ! number of procs NS for ocean GPB0F402.307
*ENDIF GPB0F402.308
& err ! error return from FORT_GET_ENV GPB0F402.309
GPB0F402.310
CHARACTER*8 c_nproc ! to get nproc_x and nproc_y from GPB0F402.311
! ! environment variables. GPB0F401.212
CHARACTER*100 parexe_env ! to hold the name of the parallel GPB0F401.213
! ! executable script GPB0F401.214
CHARACTER*200 stdout_filename ! file to write stdout to APB1F402.277
CHARACTER*180 stdout_basename ! base of filename APB1F402.278
CHARACTER*170 dataw_char ! value of $DATAW APB1F402.279
CHARACTER*5 runid_char ! value of $RUNID APB1F402.280
INTEGER len_basename,len_dataw,len_runid ! lengths of chars. APB1F402.281
INTEGER GET_CHAR_LEN ! function to return true length of APB1F402.282
! ! character variable APB1F402.283
GPB0F305.103
*CALL DECOMPTP
GPB0F402.312
*CALL PARVARS
GPB0F305.104
*CALL GCCOM
GBCAF404.11
c GBCAF404.12
integer um_nam_max_seconds GBCAF404.13
c GBCAF404.14
character*8 c_nam_max_seconds GBCAF404.15
*ELSE GBC1F405.32
INTEGER GET_CHAR_LEN ! function to return true length of a GBC1F405.33
! ! character GBC1F405.34
*ENDIF GPB0F305.105
C UMSHELL1.44
C Configuration-dependent sizes for dynamic arrays UMSHELL1.45
C UMSHELL1.46
*CALL CSUBMODL
GSS1F305.853
*CALL TYPSIZE
UMSHELL1.47
C UMSHELL1.48
C Super array sizes for dynamic allocation in U_MODEL UMSHELL1.49
C UMSHELL1.50
*CALL TYPSZSP
UMSHELL1.51
*CALL TYPSZSPA
UMSHELL1.52
*CALL TYPSZSPO
UMSHELL1.53
*CALL TYPSZSPW
WRB1F401.1118
*CALL TYPSZSPC
UMSHELL1.54
C UMSHELL1.55
! Declare ppxref look-up arrays, pointer array, and associated GSS1F305.854
! sizes. The lengths (ppxRecs) of the ppx look-up arrays are GSS1F305.855
! dynamically allocated. GSS1F305.856
*CALL CPPXREF
GSS1F305.857
*CALL VERSION
GSS1F305.858
*CALL CSTASH
GRB0F401.1
! Length of ppx look-up arrays - for dynamic allocation GSS1F400.726
INTEGER ppxRecs GSS1F400.727
*CALL CHSUNITS
GSM1F401.22
*CALL CCONTROL
GSM1F401.23
*CALL CNTL_IO
GBC0F403.7
c GBC0F403.8
*IF DEF,SGI PXUMSHEL.1
integer sect_err, rnl_err PXUMSHEL.2
integer (kind=4) um_rnl_skip PXUMSHEL.3
*ELSE PXUMSHEL.4
integer sect_err, rnl_err, um_rnl_skip PXUMSHEL.5
*ENDIF PXUMSHEL.6
c GBC0F403.10
character*8 c_um_sector_size, c_um_rnl_skip GBC0F403.11
character*8 ch_date2 ! Date returned from date_and_time GDR3F405.3
character*10 ch_time2 ! Time returned from date_and_time GDR3F405.4
GSS1F305.862
*IF DEF,T3E GPB3F403.164
*CALL T3ECLKTK
GPB3F403.165
INTEGER iclktck,ierr GPB3F403.166
*ENDIF GPB3F403.167
! Fortran unit numbers GSS1F305.863
INTEGER NFTPPXREF GSS1F305.864
INTEGER NFTSTMSTU GSS1F305.865
DATA NFTPPXREF/22/,NFTSTMSTU/2/ GSS2F401.471
GSS1F305.867
GDW1F404.106
cmessage = ' ' GDW1F404.107
CL---------------------------------------------------------------------- UMSHELL1.56
CL 0. Start Timer running UMSHELL1.57
CL UMSHELL1.58
*IF DEF,T3E GPB3F403.168
! Find out the number of clock ticks per second on this machine. GPB3F403.169
! This information is required to calculate the wallclock times GPB3F403.170
! in TIMER GPB3F403.171
GPB3F403.172
iclktck=0 GPB3F403.173
ticks_per_second=0 GPB3F403.174
GPB3F403.175
CALL PXFCONST(
'CLK_TCK',iclktck,ierr) GPB3F403.176
GPB3F403.177
IF (ierr .NE. 0) THEN GPB3F403.178
WRITE(6,*) 'UMSHELL : Failure in PXFCONST, err= ',ierr GPB3F403.179
ICODE=1 GPB3F403.180
GOTO 999 GPB3F403.181
ENDIF GPB3F403.182
GPB3F403.183
CALL PXFSYSCONF(
iclktck,ticks_per_second,ierr) GPB3F403.184
GPB3F403.185
IF (ierr .NE. 0) THEN GPB3F403.186
WRITE(6,*) 'UMSHELL : Failure in PXFSYSCONF, err= ',ierr GPB3F403.187
ICODE=1 GPB3F403.188
GOTO 999 GPB3F403.189
ENDIF GPB3F403.190
GPB3F403.191
*ENDIF GPB3F403.192
*IF -DEF,SGI PXUMSHEL.7
! Open file for UNIT 5 before initialisation of model. All runtime GPB0F305.5
! control variables subsequently read in from UNIT 5 by namelist. GPB0F305.6
CALL GET_FILE
(5,FILENAME,80,ICODE) GRB2F400.4
OPEN(5,FILE=FILENAME,IOSTAT=ISTATUS,DELIM='APOSTROPHE') PXNAMLST.21
IF(ISTATUS.NE.0) THEN GPB0F305.9
ICODE=500 GPB0F305.10
WRITE(6,*) ' ERROR OPENING FILE ON UNIT 5' GPB0F305.11
WRITE(6,*) ' FILENAME =',FILENAME GPB0F305.12
WRITE(6,*) ' IOSTAT =',ISTATUS GPB0F305.13
GOTO 999 GPB0F305.14
END IF GPB0F305.15
CL------------------------------------------------------------------ GRR2F305.293
CL 0.1 Get submodel/internal model components of model run. GRR2F305.294
CL GRR2F305.295
ICODE=0 GRR2F305.296
CALL UM_Submodel_Init
(ICODE) GRR2F305.297
*ENDIF PXUMSHEL.8
GBC0F403.12
CL GBC0F403.13
CL Get the current sector size for disk I/O GBC0F403.14
CL GBC0F403.15
GBC0F403.16
CALL FORT_GET_ENV
('UM_SECTOR_SIZE',14,c_um_sector_size,8,sect_err) GBC0F403.17
IF (sect_err .NE. 0) THEN GBC0F403.18
WRITE(6,*) 'Warning: Environment variable UM_SECTOR_SIZE has ', GBC0F403.19
& 'not been set.' GBC0F403.20
WRITE(6,*) 'Setting um_sector_size to 2048' GPB0F405.28
um_sector_size=2048 GPB0F405.29
ELSE GBC0F403.23
READ(c_um_sector_size,'(I4)') um_sector_size GBC0F403.24
ENDIF GBC0F403.25
*IF DEF,CRAY GBC0F403.26
GBC0F403.27
CL GBC0F403.28
CL Get the current NAMELIST Skip value GBC0F403.29
CL GBC0F403.30
GBC0F403.31
CALL FORT_GET_ENV
('UM_RNL_SKIP',11,c_um_rnl_skip,8,rnl_err) GBC0F403.32
IF (rnl_err .NE. 0) THEN GBC0F403.33
WRITE(6,*) 'Warning: Environment variable UM_RNL_SKIP has ', GBC0F403.34
& 'not been set.' GBC0F403.35
WRITE(6,*) 'Setting um_rnl_skip to 0 - Omit Skipped Messages' GBC0F403.36
um_rnl_skip=0 GBC0F403.37
ELSE GBC0F403.38
READ(c_um_rnl_skip,'(I4)') um_rnl_skip GBC0F403.39
ENDIF GBC0F403.40
call rnlskip(
um_rnl_skip) GBC0F403.41
*ENDIF GBC0F403.42
GRR2F305.298
CL---------------------------------------------------------------------- UMSHELL1.60
*IF DEF,MPP GPB0F305.106
!---------------------------------------------------------------------- GPB0F305.107
! 1.0 Initialise Message Passing Libraries GPB0F305.108
! GPB0F305.109
GPB0F305.110
*IF DEF,ATMOS GPB0F402.313
! Get the atmosphere decomposition GPB0F402.314
GPB0F305.113
CALL FORT_GET_ENV
('UM_ATM_NPROCX',13,c_nproc,8,err) GPB0F402.315
IF (err .NE. 0) THEN GPB0F305.115
WRITE(6,*) 'Warning: Environment variable UM_ATM_NPROCX has ', GPB0F402.316
& 'not been set.' GPB0F305.117
WRITE(6,*) 'Setting nproc_x to 1' GPB0F305.118
atm_nprocx=1 GPB0F402.317
ELSE GPB0F305.120
READ(c_nproc,'(I4)') atm_nprocx GPB0F402.318
ENDIF GPB0F305.122
CALL FORT_GET_ENV
('UM_ATM_NPROCY',13,c_nproc,8,err) GPB0F402.319
IF (err .NE. 0) THEN GPB0F305.124
WRITE(6,*) 'Warning: Environment variable UM_ATM_NPROCY has ', GPB0F402.320
& 'not been set.' GPB0F305.126
WRITE(6,*) 'Setting nproc_y to 1' GPB0F305.127
atm_nprocy=1 GPB0F402.321
ELSE GPB0F305.129
READ(c_nproc,'(I4)') atm_nprocy GPB0F402.322
ENDIF GPB0F305.131
*ENDIF GPB0F402.323
GPB0F402.324
*IF DEF,OCEAN GPB0F402.325
! Get the ocean decomposition GPB0F402.326
GPB0F402.327
CALL FORT_GET_ENV
('UM_OCN_NPROCX',13,c_nproc,8,err) GPB0F402.328
IF (err .NE. 0) THEN GPB0F402.329
WRITE(6,*) 'Warning: Environment variable UM_OCN_NPROCX ', GPB0F402.330
& 'has not been set.' GPB0F402.331
WRITE(6,*) 'Setting nproc_x to 1' GPB0F402.332
ocn_nprocx=1 GPB0F402.333
ELSE GPB0F402.334
READ(c_nproc,'(I4)') ocn_nprocx GPB0F402.335
IF (ocn_nprocx .NE. 1) THEN GPB0F402.336
WRITE(6,*) 'Warning : The ocean code does not yet support ', GPB0F402.337
& 'decomposition along rows.' GPB0F402.338
WRITE(6,*) 'Setting nproc_x to 1' GPB0F402.339
ENDIF GPB0F402.340
ENDIF GPB0F402.341
GPB0F402.342
CALL FORT_GET_ENV
('UM_OCN_NPROCY',13,c_nproc,8,err) GPB0F402.343
IF (err .NE. 0) THEN GPB0F402.344
WRITE(6,*) 'Warning: Environment variable UM_OCN_NPROCY ', GPB0F402.345
& 'has not been set.' GPB0F402.346
WRITE(6,*) 'Setting nproc_y to 1' GPB0F402.347
ocn_nprocy=1 GPB0F402.348
ELSE GPB0F402.349
READ(c_nproc,'(I4)') ocn_nprocy GPB0F402.350
ENDIF GPB0F402.351
GPB0F402.352
*ENDIF GPB0F402.353
GPB0F402.354
GPB0F305.149
! Find out the maximum number of processors to be used in this GPB0F402.355
! run of the model GPB0F402.356
GPB0F402.357
CALL FORT_GET_ENV
('UM_NPES',7,c_nproc,8,err) GPB0F402.358
IF ( (err .NE. 0) .OR. (c_nproc .EQ. 'UNSET') ) THEN GPB0F402.359
WRITE(6,*) 'Error : Environment variable UM_NPES has ', GPB0F402.360
& 'not been set.' GPB0F402.361
WRITE(6,*) 'Exiting' GPB0F402.362
GOTO 999 GPB0F402.363
ENDIF GPB0F402.364
GPB0F402.365
READ(c_nproc,'(I4)') nproc_max GPB0F402.366
GPB1F404.76
! Check MAXPROC is big enough for nproc_max GPB1F404.77
GPB1F404.78
IF (nproc_max .GT. MAXPROC) THEN GPB1F404.79
WRITE(6,*) 'Error : MAXPROC is not big enough.' GPB1F404.80
WRITE(6,*) 'You will need to edit the parameter in comdeck ', GPB1F404.81
& 'PARPARM.' GPB1F404.82
WRITE(6,*) 'MAXPROC= ',MAXPROC,' nproc_max= ',nproc_max GPB1F404.83
WRITE(6,*) 'Exiting' GPB1F404.84
GOTO 999 GPB1F404.85
ENDIF GPB1F404.86
GPB0F402.367
*IF DEF,ATMOS GPB0F402.368
! Check that there are enough processors to support the GPB0F402.369
! decompositions that have been requested. GPB0F402.370
GPB0F402.371
IF ((atm_nprocx*atm_nprocy) .NE. nproc_max ) THEN GPB0F402.372
WRITE(6,*) 'Error : Atmosphere decomposition of ',atm_nprocx, GPB0F402.373
& ' x ',atm_nprocy,' processors cannot be supported ', GPB0F402.374
& 'using ',nproc_max,' processors.' GPB0F402.375
WRITE(6,*) 'Exiting' GPB0F402.376
GOTO 999 GPB0F402.377
ENDIF GPB0F402.378
*ENDIF GPB0F402.379
GPB0F402.380
*IF DEF,OCEAN GPB0F402.381
IF ((ocn_nprocx*ocn_nprocy) .NE. nproc_max ) THEN GPB0F402.382
WRITE(6,*) 'Error : Ocean decomposition of ',ocn_nprocx, GPB0F402.383
& ' x ',ocn_nprocy,' processors cannot be supported ', GPB0F402.384
& 'using ',nproc_max,' processors.' GPB0F402.385
WRITE(6,*) 'Exiting' GPB0F402.386
GOTO 999 GPB0F402.387
ENDIF GPB0F402.388
*ENDIF GPB0F402.389
GPB0F402.390
*IF -DEF,T3D,AND,-DEF,T3E GPB0F402.391
CALL FORT_GET_ENV
('PAREXE',6,parexe_env,100,err) GPB0F401.215
IF (err .NE. 0) THEN GPB0F401.216
WRITE(6,*) 'Failed to get the name of the parallel executable ', GPB0F401.217
& 'script from $PAREXE' GPB0F401.218
WRITE(6,*) '*** Model Exiting.' GPB0F401.219
GOTO 999 GPB0F401.220
ENDIF GPB0F401.221
*ELSE GPB0F402.392
parexe_env=' ' GPB0F402.393
*ENDIF GPB0F402.394
GPB0F402.395
GPB0F401.222
CALL GC_INIT(
parexe_env,mype,nproc_max) GPB0F402.396
IF (nproc_max .LT. 0) THEN GPB0F402.397
WRITE(6,*) 'Parallel initialisation failed' GPB0F305.155
GOTO 999 GPB0F305.156
ELSE GPB0F305.157
APB1F402.284
! Send output to unique filename on every PE APB1F402.285
APB1F402.286
CALL FORT_GET_ENV
('UM_STDOUT_FILE',14,stdout_basename,180,err) APB1F402.287
IF (err .NE. 0) THEN APB1F402.288
! Environment variable UM_STDOUT_FILE has not been set, so we will APB1F402.289
! construct a default stdout_basename of $DATAW/$RUNID.fort6.pe APB1F402.290
CALL FORT_GET_ENV
('DATAW',5,dataw_char,170,err) APB1F402.291
IF (err .NE. 0) THEN APB1F402.292
WRITE(6,*) 'UMSHELL : Failed to get value of $DATAW' APB1F402.293
WRITE(6,*) '*** Model Exiting.' APB1F402.294
GOTO 999 APB1F402.295
ENDIF APB1F402.296
CALL FORT_GET_ENV
('RUNID',5,runid_char,5,err) APB1F402.297
IF (err .NE. 0) THEN APB1F402.298
WRITE(6,*) 'UMSHELL : Failed to get value of $RUNID' APB1F402.299
WRITE(6,*) '*** Model Exiting.' APB1F402.300
GOTO 999 APB1F402.301
ENDIF APB1F402.302
len_dataw=GET_CHAR_LEN
(dataw_char) APB1F402.303
len_runid=GET_CHAR_LEN
(runid_char) APB1F402.304
stdout_basename=dataw_char(1:len_dataw)//'/'// APB1F402.305
& runid_char(1:len_runid)//'.fort6.pe' APB1F402.306
ENDIF APB1F402.307
APB1F402.308
! Now add PE number (mype) to stdout_basename to get the complete APB1F402.309
! stdout_filename for this PE. APB1F402.310
APB1F402.311
len_basename=GET_CHAR_LEN
(stdout_basename) APB1F402.312
IF (mype .LT. 10) THEN APB1F402.313
WRITE(stdout_filename,'(A,I1)') APB1F402.314
& stdout_basename(1:len_basename),mype APB1F402.315
ELSEIF (mype .LT. 100) THEN APB1F402.316
WRITE(stdout_filename,'(A,I2)') APB1F402.317
& stdout_basename(1:len_basename),mype APB1F402.318
ELSEIF (mype .LT. 1000) THEN APB1F402.319
WRITE(stdout_filename,'(A,I3)') APB1F402.320
& stdout_basename(1:len_basename),mype APB1F402.321
ELSE APB1F402.322
WRITE(stdout_filename,'(A,I4)') APB1F402.323
& stdout_basename(1:len_basename),mype APB1F402.324
ENDIF APB1F402.325
APB1F402.326
! and close unit 6, then reopen to new filename APB1F402.327
APB1F402.328
CLOSE(6) APB1F402.329
OPEN(6,FILE=stdout_filename) APB1F402.330
! Force a close with a delete action - so if there is an existing GPB0F405.21
! unit6 output file it will be deleted, and the output from this GPB0F405.22
! run will go to a fresh file GPB0F405.23
CLOSE(6,STATUS='DELETE') GPB0F405.24
GPB0F405.25
OPEN(6,FILE=stdout_filename) GPB0F405.26
! Force a close with a delete action - so if there is an existing GPB1F404.139
! unit6 output file it will be deleted, and the output from this GPB1F404.140
! run will go to a fresh file GPB1F404.141
CLOSE(6,STATUS='DELETE') GPB1F404.142
GPB1F404.143
OPEN(6,FILE=stdout_filename) GPB1F404.144
APB1F402.331
WRITE(6,*) nproc_max,' Processors initialised.' GPB0F402.398
WRITE(6,*) 'I am PE ',mype GPB0F305.159
ENDIF GPB0F305.160
c GBCAF404.16
GDR3F405.5
*IF DEF,MPP GDR3F405.6
if (mype.eq.0) then GDR3F405.7
*ENDIF GDR3F405.8
call date_and_time(
ch_date2, ch_time2) GDR3F405.9
write(6,*) 'Start of UM Job : ', GDR3F405.10
& ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ', GDR3F405.11
& ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4) GDR3F405.12
*IF DEF,MPP GDR3F405.13
endif GDR3F405.14
*ENDIF GDR3F405.15
GDR3F405.16
c See if the SHMEM/NAM Timeout value has been set in a shell GBCAF404.17
c variable. GBCAF404.18
c GBCAF404.19
call fort_get_env
('UM_NAM_MAX_SECONDS', 18, c_nam_max_seconds, GBCAF404.20
& 8, err) GBCAF404.21
if (err .ne. 0) then GBCAF404.22
um_nam_max_seconds=300. GBCAF404.23
if(mype.eq.0) then GBCAF404.24
write(6,*) GBCAF404.25
& 'Warning: Environment variable UM_NAM_MAX_SECONDS ', GBCAF404.26
& 'has not been set.' GBCAF404.27
write(6,*) 'Setting UM_NAM_MAX_SECONDS to ', GBCAF404.28
& um_nam_max_seconds GBCAF404.29
*IF DEF,T3E GBCAF404.30
write(0,*) GBCAF404.31
& 'Warning: Environment variable UM_NAM_MAX_SECONDS ', GBCAF404.32
& 'has not been set.' GBCAF404.33
write(0,*) 'Setting UM_NAM_MAX_SECONDS to ', GBCAF404.34
& um_nam_max_seconds GBCAF404.35
*ENDIF GBCAF404.36
endif GBCAF404.37
else GBCAF404.38
read(c_nam_max_seconds,'(i8)') um_nam_max_seconds GBCAF404.39
if(mype.eq.0) then GBCAF404.40
write(6,*) 'Setting UM_NAM_MAX_SECONDS to ', GBCAF404.41
& um_nam_max_seconds GBCAF404.42
*IF DEF,T3E GBCAF404.43
write(0,*) 'Setting UM_NAM_MAX_SECONDS to ', GBCAF404.44
& um_nam_max_seconds GBCAF404.45
*ENDIF GBCAF404.46
endif GBCAF404.47
endif GBCAF404.48
c GBCAF404.49
c--now set the value GBCAF404.50
call gc_setopt(
GC_NAM_TIMEOUT, um_nam_max_seconds, err) GBCAF404.51
if(err. ne. GC_OK) then GBCAF404.52
write(6,*)'Response from GC_SETOPT was ', err GBCAF404.53
*IF DEF,T3E GBCAF404.54
if(mype.eq.0) then GBCAF404.55
write(6,*)'Response from GC_SETOPT was ', err GBCAF404.56
endif GBCAF404.57
*ENDIF GBCAF404.58
call abort
() GBCAF404.59
endif GBCAF404.60
GPB0F305.161
!---------------------------------------------------------------------- GPB0F305.162
*ENDIF GPB0F305.163
! Start timer PXUMSHEL.9
CALL TIMER
('UM_SHELL',1) PXUMSHEL.10
*IF DEF,SGI PXUMSHEL.11
! Open file for UNIT 5 before initialisation of model. All runtime PXUMSHEL.12
! control variables subsequently read in from UNIT 5 by namelist. PXUMSHEL.13
CALL GET_FILE
(5,FILENAME,80,ICODE) PXUMSHEL.14
OPEN(5,FILE=FILENAME,IOSTAT=ISTATUS) PXUMSHEL.15
IF(ISTATUS.NE.0) THEN PXUMSHEL.16
ICODE=500 PXUMSHEL.17
WRITE(6,*) ' ERROR OPENING FILE ON UNIT 5' PXUMSHEL.18
WRITE(6,*) ' FILENAME =',FILENAME PXUMSHEL.19
WRITE(6,*) ' IOSTAT =',ISTATUS PXUMSHEL.20
GOTO 999 PXUMSHEL.21
END IF PXUMSHEL.22
PXUMSHEL.23
CL------------------------------------------------------------------ PXUMSHEL.24
CL 0.1 Get submodel/internal model components of model run. PXUMSHEL.25
CL PXUMSHEL.26
ICODE=0 PXUMSHEL.27
CALL UM_Submodel_Init
(ICODE) PXUMSHEL.28
*ENDIF PXUMSHEL.29
CL GLW2F402.96
CL Open unit 8 for server requests and send wakeup message GLW2F402.97
CL GLW2F402.98
*IF DEF,MPP GLW2F402.99
IF (mype.eq.0) THEN GLW2F402.100
CALL GET_FILE
(8,FILENAME,80,ICODE) GLW2F402.101
OPEN(8,FILE=FILENAME) GLW2F402.102
WRITE(8,10) GLW2F402.103
ENDIF GLW2F402.104
10 FORMAT('** WAKEUP **') GLW2F402.105
*ELSE GLW2F402.106
CALL GET_FILE
(8,FILENAME,80,ICODE) GLW2F402.107
OPEN(8,FILE=FILENAME) GLW2F402.108
WRITE(8,10) GLW2F402.109
10 FORMAT('** WAKEUP **') GLW2F402.110
*ENDIF GLW2F402.111
!---------------------------------------------------------------------- GLW2F402.112
CL 1.1 Get configuration-dependent sizes needed for dynamic allocation. UMSHELL1.61
CL UMSHELL1.62
CALL READSIZE
( UMSHELL1.64
& ICODE,CMESSAGE) UMSHELL1.65
IF (ICODE.GT.0) GOTO 999 GRB1F305.704
GRB1F305.705
CL Read history and control files for NRUN; also interim control GRB1F305.706
CL file for CRUN, and housekeeping file for operational run. GRB1F305.707
CL GRB1F305.708
CALL UM_SETUP
( GRB1F305.709
& ICODE,CMESSAGE) GRB1F305.710
GRB1F305.711
IF (ICODE.GT.0) GOTO 999 GRB1F305.712
CL---------------------------------------------------------------------- GRB1F305.713
UMSHELL1.66
*IF DEF,MPP GPB0F305.164
*IF DEF,ATMOS GPB0F402.399
GPB0F402.400
! Decompose atmosphere data and find new local data size GPB0F402.401
GPB0F402.402
CALL DECOMPOSE_ATMOS
( ROW_LENGTH , P_ROWS, P_LEVELS , GPB0F402.403
& atm_nprocx, atm_nprocy, GPB0F402.404
& local_row_len , local_p_rows) GPB0F402.405
GPB0F402.406
! Set up the atmosphere decomposition in PARVARS GPB0F402.407
CALL CHANGE_DECOMPOSITION
(decomp_standard_atmos,ICODE) GPB0F402.408
GPB0F402.409
IF (ICODE .NE. 0) GOTO 999 GPB0F402.410
GPB0F402.411
GPB0F305.169
! And replace ROW_LENGTH and P_ROWS which are currently set up GPB0F305.170
! with the global values, with the values returned from DECOMPOSE_DATA GPB0F305.171
GPB0F305.172
ROW_LENGTH = local_row_len GPB0F305.173
P_ROWS = local_p_rows GPB0F305.174
GPB0F305.175
*ENDIF GPB0F402.412
GPB0F402.413
*IF DEF,OCEAN GPB0F402.414
! Decompose ocean data and find new local data size GPB0F402.415
GPB0F402.416
CALL DECOMPOSE_OCEAN
( IMT_UI , JMT_UI , KM_UI , GPB0F402.417
& ocn_nprocx, ocn_nprocy, GPB0F402.418
& local_row_len , local_p_rows, GPB2F403.119
& CYCLIC_OCEAN) GPB2F403.120
GPB0F402.420
IMT_UI=local_row_len GPB0F402.421
JMT_UI=local_p_rows GPB0F402.422
GPB0F402.423
*IF -DEF,ATMOS GPB0F402.424
! Set up the ocean decomposition in PARVARS GPB0F402.425
CALL CHANGE_DECOMPOSITION
(decomp_standard_ocean,ICODE) GPB0F402.426
*ENDIF GPB0F402.427
*ENDIF GPB0F402.428
GPB0F401.231
*ENDIF GPB0F305.176
! Call DERVSIZE (the call in READSIZE has been deleted) GPB0F305.177
GPB0F305.178
ICODE=0 GPB0F305.179
CALL DERVSIZE
(ICODE,CMESSAGE) GPB0F305.180
IF (ICODE .NE. 0) GOTO 999 GPB0F305.181
GPB0F305.182
*IF DEF,ATMOS,AND,DEF,MPP GDR5F405.5
GDR5F405.6
! Ensure that domain decomposition is set for Atmosphere GDR5F405.7
call change_decomposition
(decomp_standard_atmos,icode) GDR5F405.8
if (icode.ne.0) then GDR5F405.9
write (6,*) ' Error returned in CHANGE_DECOMPOSITION', GDR5F405.10
& ' before DERV_LAND_FIELD.' GDR5F405.11
write (6,*) ' Error code ',icode GDR5F405.12
write (cmessage,*) 'UM_SHELL : Error in CHANGE_DECOMPOSITION.' GDR5F405.13
go to 999 ! Exit GDR5F405.14
endif GDR5F405.15
GDR5F405.16
! For MPP jobs, calculate the no of land-points on each PE. GDR5F405.17
CALL DERV_LAND_FIELD
(21,icode,cmessage) GDR5F405.18
if (icode.gt.0) then GDR5F405.19
write (6,*) 'Error returned from DERV_LAND_FIELD.' GDR5F405.20
write (6,*) 'Error code ',icode GDR5F405.21
go to 999 ! Exit GDR5F405.22
endif GDR5F405.23
GDR5F405.24
*ENDIF GDR5F405.25
*IF DEF,ATMOS GDR2F405.171
! Derive lengths involved with output boundary files - atmos. GDR2F405.172
CALL DERV_INTF_A
(TOT_LEN_INTFA_P,TOT_LEN_INTFA_U, GDR2F405.173
& MAX_INTF_P_LEVELS,N_INTF_A,U_FIELD,U_FIELD_INTFA) GDR2F405.174
GDR2F405.175
*ENDIF GDR2F405.176
GDR2F405.177
C SF011193.30
*IF DEF,OCEAN GMB1F405.564
! Derive lengths involved with output boundary files - atmos. GMB1F405.565
CALL DERV_INTF_O
(TOT_LEN_INTFO_P,TOT_LEN_INTFO_U, GMB1F405.566
& MAX_INTF_P_LEVELS_O,N_INTF_O) GMB1F405.567
*ENDIF GMB1F405.568
C Copy NAMELIST values of OCEAN variables into main variables SF011193.31
C becuase portable model cannot use dynamic allocation for arrays SF011193.32
C whose dimensions are in COMMON SF011193.33
C SF011193.34
NT=NT_UI SF011193.35
IMT=IMT_UI SF011193.36
JMT=JMT_UI SF011193.37
KM=KM_UI SF011193.38
IF (ICODE.GT.0) GOTO 999 UMSHELL1.67
!----------------------------------------------------------------------- GSS1F305.868
! 1.2 Call STASH_PROC: top level control routine for processing of GSS1F305.869
! STASH requests and STASH addressing. GSS1F305.870
GSS1F305.871
! Open STASHmaster file(s) and count number of records GSS2F401.472
! This number is assigned to ppxRecs and used to dynamically GSS2F401.473
! allocate the PPX_ arrays in which stash master records are held GSS2F401.474
ppxRecs = 1 GSS2F401.475
ICODE = 0 GSS2F401.476
IF (INTERNAL_MODEL_INDEX(A_IM).GT.0) GSS2F401.477
& CALL HDPPXRF
GSS2F401.478
&(NFTPPXREF,'STASHmaster_A',ppxRecs,ICODE,CMESSAGE) GSS2F401.479
IF (ICODE.NE.0) GO TO 999 GBCKF405.3
IF (INTERNAL_MODEL_INDEX(O_IM).GT.0) GSS2F401.480
& CALL HDPPXRF
GSS2F401.481
&(NFTPPXREF,'STASHmaster_O',ppxRecs,ICODE,CMESSAGE) GSS2F401.482
IF (ICODE.NE.0) GO TO 999 GBCKF405.4
IF (INTERNAL_MODEL_INDEX(S_IM).GT.0) GSS2F401.483
& CALL HDPPXRF
GSS2F401.484
&(NFTPPXREF,'STASHmaster_S',ppxRecs,ICODE,CMESSAGE) GSS2F401.485
IF (ICODE.NE.0) GO TO 999 GBCKF405.5
IF (INTERNAL_MODEL_INDEX(W_IM).GT.0) GSS2F401.486
& CALL HDPPXRF
GSS2F401.487
&(NFTPPXREF,'STASHmaster_W',ppxRecs,ICODE,CMESSAGE) GSS2F401.488
IF (ICODE.NE.0) GO TO 999 GBCKF405.6
! Add number of user stash records GSS2F401.489
CALL HDPPXRF
(0,' ',ppxRecs,ICODE,CMESSAGE) GSS2F401.490
GSS1F305.874
IF (icode .lt. 0) then GDW1F404.108
*IF DEF,MPP GDW1F404.109
IF (mype .eq. 0) then GDW1F404.110
write (0,*) 'WARNING : Problem in STASHmaster file(s)' GDW1F404.111
write (0,*) ' ',cmessage(1:get_char_len(cmessage)) GBC1F405.35
END IF GDW1F404.113
*ELSE GDW1F404.114
write (0,*) 'WARNING : Problem in STASHmaster file(s)' GDW1F404.115
write (0,*) ' ',cmessage(1:get_char_len(cmessage)) GBC1F405.36
*ENDIF GDW1F404.117
ELSE IF (icode .gt. 0) then GDW1F404.118
*IF DEF,MPP GDW1F404.119
IF (mype .eq. 0) then GDW1F404.120
write (0,*) 'ERROR : Problem in STASHmaster files(s)' GDW1F404.121
write (0,*) ' ',cmessage(1:get_char_len(cmessage)) GBC1F405.37
END IF GDW1F404.123
*ELSE GDW1F404.124
write (0,*) 'ERROR : Problem in STASHmaster files(s)' GDW1F404.125
write (0,*) ' ',cmessage(1:get_char_len(cmessage)) GBC1F405.38
*ENDIF GDW1F404.127
goto 999 ! Always abort on fatal error. GDW1F404.128
END IF GDW1F404.129
GSS1F305.877
CALL STASH_PROC
(NFTPPXREF,NFTSTMSTU,.FALSE., GSS1F305.878
& ppxRecs,ICODE,CMESSAGE ) GSS1F400.729
IF (ICODE.GT.0) GOTO 999 GSS1F305.880
GSS1F305.881
! Total number of entries (N_PPXRECS) in STASH-addresses array IN_S has GSS1F305.882
! obtained by WSTLST in STASH_PROC. Reset ppxRecs to equal this value. GSS1F400.730
! This is used to dynamically GSS1F400.731
! allocate the ppx look-up arrays PPXI, PPXC in U_MODEL. GSS1F400.732
GSS1F305.886
ppxRecs = N_PPXRECS GSS1F400.733
GSS1F305.888
CL---------------------------------------------------------------------- UMSHELL1.68
CL 1.3 Calculate addresses of super arrays passed down for dynamic GSS1F305.889
CL allocation. UMSHELL1.70
CL UMSHELL1.71
ICODE=0 UMSHELL1.72
CALL UM_INDEX
( UMSHELL1.73
*CALL ARGSIZE
SF011193.39
*CALL ARGSZSP
UMSHELL1.74
*CALL ARGSZSPA
UMSHELL1.75
*CALL ARGSZSPO
UMSHELL1.76
*CALL ARGSZSPW
WRB1F401.1119
*CALL ARGSZSPC
UMSHELL1.77
& ICODE,CMESSAGE) UMSHELL1.78
UMSHELL1.79
IF (ICODE.GT.0) GOTO 999 UMSHELL1.80
CL---------------------------------------------------------------------- UMSHELL1.81
CL 2. Call U_MODEL master routine to allocate the main data arrays UMSHELL1.82
CL and do the calculations. UMSHELL1.83
CL UMSHELL1.84
CALL U_MODEL
( UMSHELL1.85
& NFTPPXREF,NFTSTMSTU, GSS2F401.491
*CALL ARGSZSP
UMSHELL1.86
*CALL ARGSZSPA
UMSHELL1.87
*CALL ARGSZSPO
UMSHELL1.88
*CALL ARGSZSPW
WRB1F401.1120
*CALL ARGSZSPC
UMSHELL1.89
*CALL ARGSIZE
UMSHELL1.90
& P_FIELD_CONV, ! copies for portability of dynamic allocation RB300993.153
& Q_LEVELS, ! of convective increment storage arrays. RB300993.154
*IF DEF,FRADIO GGH3F401.36
& P_FIELD,P_LEVELS, ! copies for portability of dynamic allocation UMSHELL1.92
*ENDIF UMSHELL1.93
& ppxRecs,ICODE,CMESSAGE) GSS1F400.734
C UMSHELL1.95
999 CONTINUE UMSHELL1.96
CLOSE(5) GPB0F305.16
CL---------------------------------------------------------------------- UMSHELL1.97
CL 3. Exit processing: Call ABORT if non-zero completion code. UMSHELL1.98
CL UMSHELL1.99
CALL TIMER
('UM_SHELL',2) GSM1F401.25
IF (iCode .ne. 0) then GDW1F404.130
*IF DEF,MPP GDW1F404.131
IF (mype .eq. 0) then GDW1F404.132
*ENDIF GDW1F404.133
write (0,*) '*****************************************' GDW1F404.134
write (0,*) '*****************************************' GDW1F404.135
write (0,*) 'Model completed with the following :' GDW1F404.136
write (0,*) ' Error Code : ', iCode GDW1F404.137
write (0,*) ' Message : ', GBC1F405.39
& cMessage(1:get_char_len(cmessage)) GBC1F405.40
write (0,*) '*****************************************' GDW1F404.139
write (0,*) '*****************************************' GDW1F404.140
*IF DEF,MPP GDW1F404.141
ENDIF GDW1F404.142
*ENDIF GDW1F404.143
ENDIF GDW1F404.144
IF (ICODE.GT.0) CALL ABORT
UMSHELL1.101
*IF DEF,MPP GPB0F305.189
! Close down parallel process communication GPB0F305.190
CALL GC_EXIT(
) GPB0F305.191
GPB0F305.192
WRITE(6,*) 'Process ',mype,' has exited.' GPB0F305.193
*ENDIF GPB0F305.194
*IF DEF,CRI_FFIO GBC0F403.75
call barrier(
) GBC0F403.76
close_time=secondr() GBC0F403.77
call close_all_files
() GBC0F403.78
call barrier(
) GBC0F403.79
close_time=secondr()-close_time GBC0F403.80
*IF DEF,MPP GBC0F403.81
if(mype.eq.0) write(0,9976) close_time GBC0F403.82
if(mype.eq.0) write(6,9976) close_time GBC0F403.83
*ELSE GBC0F403.84
write(6,9976) close_time GBC0F403.85
*ENDIF GBC0F403.86
9976 format(/'Time to Close All Files was ',f7.3,' Seconds'/) GBC0F403.87
*ENDIF GBC0F403.88
C UMSHELL1.102
*IF DEF,MPP GDR3F405.17
if (mype.eq.0) then GDR3F405.18
*ENDIF GDR3F405.19
call date_and_time(
ch_date2, ch_time2) GDR3F405.20
write(6,*) 'End of UM Job : ', GDR3F405.21
& ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ', GDR3F405.22
& ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4) GDR3F405.23
*IF DEF,MPP GDR3F405.24
endif GDR3F405.25
*ENDIF GDR3F405.26
GDR3F405.27
STOP UMSHELL1.103
END UMSHELL1.104
*ENDIF UMSHELL1.105