*IF DEF,CONTROL FINDPTR1.2 C ******************************COPYRIGHT****************************** GTS2F400.2935 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.2936 C GTS2F400.2937 C Use, duplication or disclosure of this code is subject to the GTS2F400.2938 C restrictions as set forth in the contract. GTS2F400.2939 C GTS2F400.2940 C Meteorological Office GTS2F400.2941 C London Road GTS2F400.2942 C BRACKNELL GTS2F400.2943 C Berkshire UK GTS2F400.2944 C RG12 2SZ GTS2F400.2945 C GTS2F400.2946 C If no contract has been raised with this copy of the code, the use, GTS2F400.2947 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.2948 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.2949 C Modelling at the above address. GTS2F400.2950 C ******************************COPYRIGHT****************************** GTS2F400.2951 C GTS2F400.2952 CLL Routine: FINDPTR ------------------------------------------------- FINDPTR1.3 CLL FINDPTR1.4 CLL Purpose: Locates address within D1 of diagnostic field which may FINDPTR1.5 CLL be required elsewhere in the model for special-purpose FINDPTR1.6 CLL diagnostic routine such as zonal mean print, or as an FINDPTR1.7 CLL internal interfacing field for coupling sub-models. FINDPTR1.8 CLL The search information is input in STASH format, and the FINDPTR1.9 CLL STASH list is scanned for a match. If the specified FINDPTR1.10 CLL field does not exist in D1 the address is returned as 0. FINDPTR1.11 CLL NB: Missing data indicators may be supplied if the search FINDPTR1.12 CLL is to ignore certain elements in the STASH list. FINDPTR1.13 CLL Tested under compiler: cft77 FINDPTR1.14 CLL Tested under OS version: UNICOS 5.1 FINDPTR1.15 CLL FINDPTR1.16 CLL FINDPTR1.17 CLL Author: T.C.Johns FINDPTR1.18 CLL FINDPTR1.19 CLL Code version no: 1.3 Date: 04 March 1992 FINDPTR1.20 CLL FINDPTR1.21 CLL Model Modification history from model version 3.0: FINDPTR1.22 CLL version Date FINDPTR1.23 CLL FINDPTR1.24 CLL 3.4 16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon ANF0F304.11 CLL 3.5 June 95 Submodels project: GSS2F305.1 CLL Added internal_model to subroutine args. GSS2F305.2 CLL Altered args in each STINDEX reference. GSS2F305.3 CLL Changed hardwired addresses in each STLIST reference GSS2F305.4 CLL to parameter addresses as defined in STPARAM GSS2F305.5 CLL Added *CALL STPARAM GSS2F305.6 CLL S.J.Swarbrick GSS2F305.7 CLL GSS2F305.8 CLL Programming standard: UM Doc Paper 3, version 2 (7/9/90) FINDPTR1.25 CLL FINDPTR1.26 CLL Logical components covered: C610 FINDPTR1.27 CLL FINDPTR1.28 CLL Project task: C4? FINDPTR1.29 CLL FINDPTR1.30 CLL External documentation: FINDPTR1.31 CLL Unified Model Doc Paper C4 - Storage Handling and FINDPTR1.32 CLL Diagnostic System. FINDPTR1.33 CLL FINDPTR1.34 CLL ------------------------------------------------------------------- FINDPTR1.35 C*L Interface and arguments: ------------------------------------------ FINDPTR1.36 C FINDPTR1.37SUBROUTINE FINDPTR ( internal_model,SECTION,ITEM, 98GSS2F305.9 * PROCESS_CODE,FREQ_CODE,START,END,PERIOD, FINDPTR1.39 * GRIDPT_CODE,WEIGHT_CODE, FINDPTR1.40 * BOTTOM_LEVEL,TOP_LEVEL, FINDPTR1.41 * GRID_N,GRID_S,GRID_W,GRID_E, FINDPTR1.42 * STASHMACRO_TAG,MDI,ADDRESS, @DYALLOC.898 *CALL ARGSIZE
@DYALLOC.899 *CALL ARGSTS
@DYALLOC.900 * ICODE,CMESSAGE) @DYALLOC.901 C FINDPTR1.46 IMPLICIT NONE FINDPTR1.47 C FINDPTR1.48 INTEGER FINDPTR1.49 * internal_model, ! IN - internal_model id. GSS2F305.10 * SECTION, ! IN - STASH section number FINDPTR1.50 * ITEM, ! IN - STASH item number FINDPTR1.51 * PROCESS_CODE, ! IN - STASH processing code FINDPTR1.52 * FREQ_CODE, ! IN - STASH frequency code FINDPTR1.53 * START, ! IN - STASH start step for processing FINDPTR1.54 * END, ! IN - STASH end step for processing FINDPTR1.55 * PERIOD, ! IN - STASH processing period FINDPTR1.56 * GRIDPT_CODE, ! IN - STASH gridpoint code FINDPTR1.57 * WEIGHT_CODE, ! IN - STASH weighting code FINDPTR1.58 * BOTTOM_LEVEL, ! IN - STASH input bottom level FINDPTR1.59 * TOP_LEVEL, ! IN - STASH input top level FINDPTR1.60 * GRID_N, ! IN - STASH N-row grid code FINDPTR1.61 * GRID_S, ! IN - STASH S-row grid code FINDPTR1.62 * GRID_W, ! IN - STASH W-col grid code FINDPTR1.63 * GRID_E, ! IN - STASH E-col grid code FINDPTR1.64 * STASHMACRO_TAG, ! IN - STASHmacro tag number FINDPTR1.65 * MDI, ! IN - Missing Data Indicator FINDPTR1.66 * ADDRESS, ! OUT - Address in D1 FINDPTR1.67 * ICODE ! OUT - Error return code FINDPTR1.68 CHARACTER*(80) ANF0F304.12 * CMESSAGE ! OUT - Error return message FINDPTR1.70 C FINDPTR1.71 C*---------------------------------------------------------------------- FINDPTR1.72 C Common blocks FINDPTR1.73 C FINDPTR1.74 *CALL CSUBMODL
GSS2F305.11 *CALL TYPSIZE
@DYALLOC.902 *CALL TYPSTS
@DYALLOC.903 *CALL STPARAM
GSS2F305.12 C FINDPTR1.79 C Local variables FINDPTR1.80 C FINDPTR1.81 INTEGER FINDPTR1.82 * ISTART,IEND,I, ! Start, end + loop index in STASHlist FINDPTR1.83 * NMATCH ! Number of matches found FINDPTR1.84 * ,im_index ! Internal model index GSS2F305.13 LOGICAL FINDPTR1.85 * MATCH ! TRUE if diagnostic matched FINDPTR1.86 CL---------------------------------------------------------------------- FINDPTR1.87 CL 0. Check that tag field is within the allowed range for user tags FINDPTR1.88 CL FINDPTR1.89 IF (STASHMACRO_TAG.NE.MDI .AND. FINDPTR1.90 & (STASHMACRO_TAG.LT.0 .OR. STASHMACRO_TAG.GT.999)) THEN FINDPTR1.91 CMESSAGE="FINDPTR : STASHMACRO_TAG must be in range 0-999" FINDPTR1.92 ICODE=ABS(STASHMACRO_TAG) FINDPTR1.93 GOTO 999 FINDPTR1.94 ENDIF FINDPTR1.95 CL---------------------------------------------------------------------- FINDPTR1.96 CL 1. Locate start/end limits within STASHlist for search; FINDPTR1.97 CL initialise output ADDRESS to zero FINDPTR1.98 CL FINDPTR1.99 ADDRESS=0 FINDPTR1.100 NMATCH=0 FINDPTR1.101 im_index=internal_model_index(internal_model) GSS2F305.14 IF (STINDEX(2,ITEM,SECTION,im_index).GT.0) THEN GSS2F305.15 ISTART=STINDEX(1,ITEM,SECTION,im_index) GSS2F305.16 IEND =STINDEX(2,ITEM,SECTION,im_index)+ISTART-1 GSS2F305.17 CL FINDPTR1.105 CL 1.1 Loop over STASHlist entries and try to find matches FINDPTR1.106 CL FINDPTR1.107 DO I=ISTART,IEND FINDPTR1.108 IF (STLIST(s_modl,I).NE.internal_model.OR. GSS2F305.18 & STLIST(s_sect,I).NE.SECTION.OR. GSS2F305.19 & STLIST(s_item,I).NE.ITEM) THEN GSS2F305.20 ICODE=1000*SECTION+ITEM FINDPTR1.110 CMESSAGE="FINDPTR : Corrupt STASHlist or STASHindex" FINDPTR1.111 GOTO 999 FINDPTR1.112 ENDIF FINDPTR1.113 MATCH=((STLIST(s_output,I).EQ.1).OR. GSS2F305.21 * (STLIST(s_output,I).EQ.2)).AND. GSS2F305.22 * (PROCESS_CODE.EQ.STLIST(s_proc,I) GSS2F305.23 * .OR.PROCESS_CODE.EQ.MDI).AND. GSS2F305.24 * (FREQ_CODE .EQ.STLIST( s_freq,I) GSS2F305.25 * .OR.FREQ_CODE .EQ.MDI) .AND. GSS2F305.26 * (START .EQ.STLIST( s_times,I) GSS2F305.27 * .OR.START .EQ.MDI) .AND. GSS2F305.28 * (END .EQ.STLIST( s_timee,I) GSS2F305.29 * .OR.END .EQ.MDI) .AND. GSS2F305.30 * (PERIOD .EQ.STLIST( s_period,I) GSS2F305.31 * .OR.PERIOD .EQ.MDI) .AND. GSS2F305.32 * (GRIDPT_CODE.EQ.STLIST( s_grid,I) GSS2F305.33 * .OR.GRIDPT_CODE.EQ.MDI) .AND. GSS2F305.34 * (WEIGHT_CODE.EQ.STLIST( s_weight,I) GSS2F305.35 * .OR.WEIGHT_CODE.EQ.MDI) .AND. GSS2F305.36 * (BOTTOM_LEVEL.EQ.STLIST(s_bottom,I) GSS2F305.37 * .OR.BOTTOM_LEVEL.EQ.MDI) .AND. GSS2F305.38 * (TOP_LEVEL .EQ.STLIST(s_top,I) GSS2F305.39 * .OR.TOP_LEVEL .EQ.MDI) .AND. GSS2F305.40 * (GRID_N .EQ.STLIST(s_north,I) GSS2F305.41 * .OR.GRID_N .EQ.MDI) .AND. GSS2F305.42 * (GRID_S .EQ.STLIST(s_south,I) GSS2F305.43 * .OR.GRID_S .EQ.MDI) .AND. GSS2F305.44 * (GRID_W .EQ.STLIST(s_west,I) GSS2F305.45 * .OR.GRID_W .EQ.MDI) .AND. GSS2F305.46 * (GRID_E .EQ.STLIST(s_east,I) GSS2F305.47 * .OR.GRID_E .EQ.MDI) .AND. GSS2F305.48 * (STASHMACRO_TAG.EQ.MOD(STLIST(st_macrotag,I),1000).OR. GSS2F305.49 * STASHMACRO_TAG.EQ.MDI) FINDPTR1.129 C FINDPTR1.130 IF (MATCH) THEN FINDPTR1.131 ADDRESS=STLIST(st_output_addr,I) GSS2F305.50 NMATCH=NMATCH+1 FINDPTR1.133 ENDIF FINDPTR1.134 ENDDO FINDPTR1.135 C FINDPTR1.136 IF (NMATCH.GT.1) THEN FINDPTR1.137 ICODE=-1000*SECTION-ITEM FINDPTR1.138 CMESSAGE="FINDPTR : Warning - multiple match for diagnostic" FINDPTR1.139 WRITE(6,*)"FINDPTR : Warning - multiple match for diagnostic ", GIE0F403.198 * SECTION,ITEM FINDPTR1.141 C FINDPTR1.142 ENDIF FINDPTR1.143 ENDIF FINDPTR1.144 C FINDPTR1.145 999 CONTINUE FINDPTR1.146 RETURN FINDPTR1.147 CL---------------------------------------------------------------------- FINDPTR1.148 END FINDPTR1.149 *ENDIF FINDPTR1.150