external_functions_aix.html How to build external functions for FERRET with AIX 4.3?

Dynamic linking for AIX 4.2 (and higher versions) works basically as on other platforms. However, some defaults of the FORTRAN compiler seem to be different and require some modification of the Makefile and the FORTRAN code of the external functions itself. The first two items concern ther FERRET executable, which usually is not build by the FERRET user. Some useful hints can be found in the man-page of "ld".

- The FERRET executable must be ready for run-time linking. This is not the case for previous versions. The linker option -b rtl must be enabled bulding the FERRET executable.

- Some objects (subroutines and the COMMON block ef_mem_subsc)  used by the external functions are defined in the main FERRET program. The definition of these objects must be visible for the external functions during run-time and is passed from the main programm to the external function by the run-time linker when an external function is called. The following objects are exported in the currect version:

ef_version_test
ef_bail_out
ef_set_desc
ef_set_num_args
ef_set_num_work_arrays
ef_set_work_array_lens
ef_set_work_array_dims
ef_set_has_vari_args
ef_set_piecemeal_ok
ef_set_axis_inheritance
ef_set_axis_influence
ef_set_axis_reduction
ef_set_axis_extend
ef_set_axis_limits
ef_set_arg_type
ef_set_arg_name
ef_set_arg_unit
ef_set_arg_desc
ef_set_custom_axis
ef_get_bad_flags
ef_get_one_val
ef_get_cx_list
ef_get_mr_list
ef_get_mres
ef_get_arg_subscripts
ef_get_arg_ss_extremes
ef_get_arg_info
ef_get_arg_string
ef_get_res_subscripts
ef_get_axis_info
ef_get_axis_dates
ef_get_coordinates
ef_get_box_size
ef_get_box_limits
ef_mem_subsc

This has been done by means of an export list ef_util.exp, which has been processed with the linker option -bE:$(TMAP_LOCAL)/fer/special/ef_util.exp. The last object is the common block, which must not occur in the corresponding import list of the external function.

-The shared library for the external functions must import the information on the objects which will be used. This is done during run-time if an external function is called from FERRET. To prepare run-time linking an import list must be processed by the linker if the shared library for the external functions is build. It has the form:

file ef_util.inp\
#! .
ef_version_test
ef_bail_out
ef_set_desc
ef_set_num_args
ef_set_num_work_arrays
ef_set_work_array_lens
ef_set_work_array_dims
ef_set_has_vari_args
ef_set_piecemeal_ok
ef_set_axis_inheritance
ef_set_axis_influence
ef_set_axis_reduction
ef_set_axis_extend
ef_set_axis_limits
ef_set_arg_type
ef_set_arg_name
ef_set_arg_unit
ef_set_arg_desc
ef_set_custom_axis
ef_get_bad_flags
ef_get_one_val
ef_get_cx_list
ef_get_mr_list
ef_get_mres
ef_get_arg_subscripts
ef_get_arg_ss_extremes
ef_get_arg_info
ef_get_arg_string
ef_get_res_subscripts
ef_get_axis_info
ef_get_axis_dates
ef_get_coordinates
ef_get_box_size
ef_get_box_limits

The following flags must be enabled:

LD_DYN_FLAGS    =  -bnoquiet -bshared -ldl -lxlf -lxlf90 -lc -lm -bexpall -G -bI:ef_util.inp

Flag -G tells the linker to build a shared library for use with the run-time linker. -bexpall export all objects defined in the external function. The FORTRAN libraries as well as the mathematical library are linked with the FERRET executable but not exported. Hence, they must be linked to the external function explicitly.

Now, what to do?

1. Get a new version of the FERRET executables. It should be at least 5.2. Please be aware, that a first release of the 5.2 executable for AIX 4.3 does not support external functions.

2. Get and unpack the tar-file for external functions. Follow the instructions on the FERRET HOME-page.

3. Open a new aixterm and define the shell variables WORKDIR, DESTDIR and HOSTTYPE. For the Korn shell use

export WORKDIR=/home/username/external_functions (This depends on where you will do the installation!)
export DESTDIR=/usr/local/ferret                 (This depends on your FERRET configuration!)
export HOSTTYPE=aix

Use this terminal, to run make.

4. Check for an input list ef_util.inp. If  this list is not part of the tar-file generate one from the above file list. Put the file in the ef_utility subdirectory.

5. Go to directory examples. Edit the Makefile. Make sure, that the definition of SUFFIXES has the form

.SUFFIXES: .F .so

6. Edit the file platform_specific_includes.mk.aix. If there is no file platform_specific_includes.mk.aix, generate one. Check the include path and the compiler options. Consider that -u  -c is specified in the Makefile. In most cases the C-compiler is not needed. The following configuration works:

#
# platform_specific_includes.mk.aix
#
# This file is included in the External Function Makefiles and defines
# platform specific macros

INCLUDES        = -I. -I$(WORKDIR)/external_functions/include   # Not needed here.

FINCLUDES       =  -I. -I$(WORKDIR)/examples/ferret_cmn

FER_LOCAL_EXTFCNS = $(DESTDIR)/ext_func/lib
CCSHFLAG        =
CC              = /usr/ibmcxx/bin/xlc
CPP             = /usr/lib/cpp
RANLIB          = /usr/bin/ranlib
CFLAGS          = -O2 $(CCSHFLAG) $(INCLUDES)
F77             = xlf
F77SHFLAG       = -bshared
FFLAGS          = -qfixed=85 -O2 $(FINCLUDES)
LD_DYN_FLAGS    =  -bnoquiet -bshared -ldl -lxlf -lxlf90 -lc -lm -bexpall -bM:SRE  -G \
                   -bI:$(WORKDIR)/ef_utility/ef_util.inp
LD  = ld

If an external function uses objects from other libraries (NAG, ESSL ...) add these libraries to the link list here.

The FERRET executable has been generated with xlf 7.1.N. Use a similar or newer version to compile the external functions.

7. There is an "underscore" problem in the communication between FORTRAN and C which could not be solved for the external functions. Hence, edit the .F-files for all external functions you want to compile. Replace the definition of subroutine ef_fname_init by  ef_fname_init_ and ef_name_compute by ef_name_compute_. I tried to change the corresponding entry points in the FERRET executable. This enables external functions without the underscores, but the build-in functions SORTI, SORTJ ... SCATT2GAUSS... do not work in this case.

8.  Now run make as described at the FERRRET HOME-page. Hence, it is implemented as a fortran external function. How to install? Put the subdirectory "fill" into "your_ferret"/ext_func/src This can be also $HOME/ferret/ext_func/src Modify fill_xy.F and Makefile for your system. Please follow the templates as found in the exaples delivered with ferret, e.g. in "your_ferret"/ext_func/src/examples Please compare in fill_xy.F and add_9.F, how underscores have to be defined. It should be either fill_xy_init_(id) and fill_xy_compute_(.... or fill_xy_init(id) and fill_xy_compute(.... Adjust the Makefile to your compiler. Follow the template delivered with ferret for your system. The Makefile in "fill" works for AIX. Only the system issues for AIX are described in external_functions_aix.html. ferret_cmn is from the version 5.41 for AIX. I suggest to should replace it by the version delivered for your system. Otherwise follow the instructions on the Ferret web pages on external functions. If the function is installed, start ferret sh func/external should list fill_xy (among all other functions ...) use coads_climatology set win 1 shade/l=1 sst !Now test, what fill does. set win 2 let mask = missing(sst,0)*0 + 1 ! 1 at the sst-grid, all points may be filled if missing let sst_fill = fill_xy(sst,mask,1) shade/l=1 sst_fill -missing(sst,0) ! shows what happens ! Now fill only in the southern ocean let mask1 =if y[gy=sst] lt 0 then mask else 1/0 let sst_fill = fill_xy(sst,mask1,20) shade/l=1 sst_fill Good luck! Martin Schmidt martin.schmidt@io-warnemuende.de # Makefile for Ferret External Functions # # January 20 1998 # Jonathan Callahan # # 15-Nov-1999 Ansley Manke # remove refs to ef_utility/*.o (now in ferret executable) # 2-Jan-2001 Ansley Manke add -debug option (as in SH files) # # include platform specific macro definitions # include ../ef_utility/platform_specific_flags.mk.$(HOSTTYPE) # # Macros # .SUFFIXES: .F .so # # Rules # .F.so: $(F77) $(FFLAGS) -u -c $< -o $*.o $(LD) $(LD_DYN_FLAGS) $(SYSLIBS) $*.o -o $*.so # # Targets # all: ferret_cmn fill_xy.so debug: $(MAKE) "FFLAGS = $(FFLAGS) -g -C -Ddebug" "CFLAGS = $(CFLAGS) -g -Ddebug" all ferret_cmn: ln -s ../ef_utility/ferret_cmn ferret_cmn install: cp *.so $(FER_LOCAL_EXTFCNS) clean: -rm -f *.o *.so core a.out temp.* ferret_cmn # # End of Makefile # * fill_xy.F * * Martin Schmidt * Sept. 2001 * * This function fill missing values by averaging over the neigbourhood * * * In this subroutine we provide information about * the function. The user configurable information * consists of the following: * * descr Text description of the function * * num_args Required number of arguments * * axis_inheritance Type of axis for the result * ( CUSTOM, IMPLIED_BY_ARGS, NORMAL, ABSTRACT ) * CUSTOM - user defined axis * IMPLIED_BY_ARGS - same axis as the incoming argument * NORMAL - the result is normal to this axis * ABSTRACT - an axis which only has index values * * piecemeal_ok For memory optimization: * axes where calculation may be performed piecemeal * ( YES, NO ) * * * For each argument we provide the following information: * * name Text name for an argument * * unit Text units for an argument * * desc Text description of an argument * * axis_influence Are this argument's axes the same as the result grid? * ( YES, NO ) * * axis_extend How much does Ferret need to extend arg limits relative to result * SUBROUTINE fill_xy_init_(id) INCLUDE 'ferret_cmn/EF_Util.cmn' INTEGER id, arg CALL ef_version_test(ef_version) * ********************************************************************** * USER CONFIGURABLE PORTION | * | * V CALL ef_set_desc(id, . 'fills missing values with average nearest neighbour values' ) CALL ef_set_num_args(id, 3) CALL ef_set_axis_inheritance(id, IMPLIED_BY_ARGS, . IMPLIED_BY_ARGS, IMPLIED_BY_ARGS, IMPLIED_BY_ARGS) CALL ef_set_piecemeal_ok(id, NO, NO, NO, NO) arg = 1 CALL ef_set_arg_name(id, arg, 'A') CALL ef_set_arg_unit(id, arg, ' ') CALL ef_set_arg_desc(id, arg, 'this arg is filled') CALL ef_set_axis_influence(id, arg, YES, YES, YES, YES) arg = 2 CALL ef_set_arg_name(id, arg, 'B') CALL ef_set_arg_unit(id, arg, ' ') CALL ef_set_arg_desc(id, arg, & 'mask (1 -> fill, missing -> do not fill)') CALL ef_set_axis_influence(id, arg, YES, YES, YES, YES) arg = 3 CALL ef_set_arg_name(id, arg, 'C') CALL ef_set_arg_unit(id, arg, ' ') CALL ef_set_arg_desc(id, arg, 'the maximum number of fill-passes') CALL ef_set_axis_influence(id, arg, NO, NO, NO, NO ) * ^ * | * USER CONFIGURABLE PORTION | * ********************************************************************** RETURN END * * In this subroutine we compute the result * SUBROUTINE fill_xy_compute_(id, arg_1, arg_2, arg_3, result) INCLUDE 'ferret_cmn/EF_Util.cmn' INCLUDE 'ferret_cmn/EF_mem_subsc.cmn' INTEGER id REAL bad_flag(1:EF_MAX_ARGS), bad_flag_result REAL arg_1(mem1lox:mem1hix, mem1loy:mem1hiy, . mem1loz:mem1hiz, mem1lot:mem1hit) REAL arg_2(mem2lox:mem2hix, mem2loy:mem2hiy, . mem2loz:mem2hiz, mem2lot:mem2hit) REAL arg_3(mem3lox:mem3hix, mem3loy:mem3hiy, . mem3loz:mem3hiz, mem3lot:mem3hit) REAL result(memreslox:memreshix, memresloy:memreshiy, . memresloz:memreshiz, memreslot:memreshit) REAL work_old (mem1lox:mem1hix, mem1loy:mem1hiy) REAL work_new (mem1lox:mem1hix, mem1loy:mem1hiy) * After initialization, the 'res_' arrays contain indexing information * for the result axes. The 'arg_' arrays will contain the indexing * information for each variable's axes. INTEGER res_lo_ss(4), res_hi_ss(4), res_incr(4) INTEGER arg_lo_ss(4,1:EF_MAX_ARGS), arg_hi_ss(4,1:EF_MAX_ARGS), . arg_incr(4,1:EF_MAX_ARGS) * ********************************************************************** * USER CONFIGURABLE PORTION | * | * V INTEGER i,j,k,l INTEGER i1, j1, k1, l1 INTEGER i2, j2, k2, l2 INTEGER i3, j3, k3, l3 integer iavr, is, js, icl, icr, jcl, jcu integer npass, npassmax real tavr logical ready, not_land CALL ef_get_res_subscripts(id, res_lo_ss, res_hi_ss, res_incr) CALL ef_get_arg_subscripts(id, arg_lo_ss, arg_hi_ss, arg_incr) CALL ef_get_bad_flags(id, bad_flag, bad_flag_result) l1 = arg_lo_ss(T_AXIS,ARG1) l2 = arg_lo_ss(T_AXIS,ARG2) l3 = arg_lo_ss(T_AXIS,ARG3) DO 400 l=res_lo_ss(T_AXIS), res_hi_ss(T_AXIS) k1 = arg_lo_ss(Z_AXIS,ARG1) k2 = arg_lo_ss(Z_AXIS,ARG2) k3 = arg_lo_ss(Z_AXIS,ARG3) DO 300 k=res_lo_ss(Z_AXIS), res_hi_ss(Z_AXIS) ready = .false. j1 = arg_lo_ss(Y_AXIS,ARG1) DO j=res_lo_ss(Y_AXIS), res_hi_ss(Y_AXIS) i1 = arg_lo_ss(X_AXIS,ARG1) DO i=res_lo_ss(X_AXIS), res_hi_ss(X_AXIS) work_new(i1,j1) = arg_1(i1,j1,k1,l1) i1 = i1 + arg_incr(X_AXIS,ARG1) enddo j1 = j1 + arg_incr(Y_AXIS,ARG1) enddo npass = 0 i3 = arg_lo_ss(X_AXIS,ARG3) j3 = arg_lo_ss(Y_AXIS,ARG3) npassmax = arg_3(i3,j3,k3,l3) do while (.not.ready) ready = .true. j1 = arg_lo_ss(Y_AXIS,ARG1) DO j=res_lo_ss(Y_AXIS), res_hi_ss(Y_AXIS) i1 = arg_lo_ss(X_AXIS,ARG1) DO i=res_lo_ss(X_AXIS), res_hi_ss(X_AXIS) work_old(i1,j1) =work_new(i1,j1) i1 = i1 + arg_incr(X_AXIS,ARG1) enddo j1 = j1 + arg_incr(Y_AXIS,ARG1) enddo j1 = arg_lo_ss(Y_AXIS,ARG1) j2 = arg_lo_ss(Y_AXIS,ARG2) DO 201 j=res_lo_ss(Y_AXIS), res_hi_ss(Y_AXIS) i1 = arg_lo_ss(X_AXIS,ARG1) i2 = arg_lo_ss(X_AXIS,ARG2) DO 101 i=res_lo_ss(X_AXIS), res_hi_ss(X_AXIS) if (arg_2(i2,j2,k2,l2) .ne. bad_flag(2) & .and.work_old(i1,j1).eq.bad_flag(1))then tavr= 0. iavr= 0 icl = max0(mem1lox,i1-1) icr = min0(mem1hix,i1+1) jcl = max0(mem1loy,j1-1) jcu = min0(mem1hiy,j1+1) do is=icl, icr do js=jcl, jcu if(work_old(is,js).ne.bad_flag(1)) then tavr=tavr+work_old(is,js) iavr=iavr+1 endif enddo enddo ! If valid surrounding points have been found, replace the missing value ! with the average over the neigbouring points ! Since something has changed, a new pass is required -> ready = .false. if (iavr.ne.0) then if (iavr.eq.1) then ! If the only only found point is at the corner, an ill posed ! cellular automaton has to be avoided if (work_old(icl,jcu).eq.bad_flag(1).and. & work_old(icr,jcu).eq.bad_flag(1).and. & work_old(icr,jcl).eq.bad_flag(1).and. & work_old(icl,jcl).eq.bad_flag(1)) then work_new(i1,j1)=tavr/iavr ready = .false. endif else work_new(i1,j1)=tavr/iavr ready = .false. endif endif endif i1 = i1 + arg_incr(X_AXIS,ARG1) i2 = i2 + arg_incr(X_AXIS,ARG2) 101 CONTINUE j1 = j1 + arg_incr(Y_AXIS,ARG1) j2 = j2 + arg_incr(Y_AXIS,ARG2) 201 CONTINUE npass = npass + 1 if (npass.eq.npassmax) ready = .true. enddo j1 = arg_lo_ss(Y_AXIS,ARG1) DO 202 j=res_lo_ss(Y_AXIS), res_hi_ss(Y_AXIS) i1 = arg_lo_ss(X_AXIS,ARG1) DO 102 i=res_lo_ss(X_AXIS), res_hi_ss(X_AXIS) result(i,j,k,l) = work_new(i1,j1) i1 = i1 + arg_incr(X_AXIS,ARG1) 102 CONTINUE j1 = j1 + arg_incr(Y_AXIS,ARG1) 202 CONTINUE k1 = k1 + arg_incr(Z_AXIS,ARG1) k2 = k2 + arg_incr(Z_AXIS,ARG2) 300 CONTINUE l1 = l1 + arg_incr(T_AXIS,ARG1) l2 = l2 + arg_incr(T_AXIS,ARG2) 400 CONTINUE * ^ * | * USER CONFIGURABLE PORTION | * ********************************************************************** RETURN END c* c* Jonathan Callahan c* July 10th 1997 c* c* This is the header file to be included by routines which c* are part of the Ferret External Function library. c* c* EXTERNAL ef_version 1.1: *jc* 9.98 Added EXTERNAL ef_max_work_arrays c* c* 1.3: *jc* 4.99 Changed "work_array_len" to "work_array_lo/hi" in EF_Util.h c* c* *ac* 7.99 Added unspecified_int4 c* *sh* 8.99 Changed unspeficied_int4 to EF_unspecified_int4 c* because of conflict with same-name parameter c* in ferret.parm c* *ac* 9.99 Separate EF_Util.parm which is all that's needed c* in the utility fcns in fer/ef_utility and the c* EXTERNAL statements, to be included in EF code. INCLUDE 'EF_Util.parm' EXTERNAL ef_bail_out EXTERNAL ef_get_arg_info EXTERNAL ef_get_arg_ss_extremes EXTERNAL ef_get_arg_string EXTERNAL ef_get_arg_subscripts EXTERNAL ef_get_axis_dates EXTERNAL ef_get_axis_info EXTERNAL ef_get_box_hi_lim EXTERNAL ef_get_box_limits EXTERNAL ef_get_box_lo_lim EXTERNAL ef_get_box_size EXTERNAL ef_get_coordinates EXTERNAL ef_get_one_val_sub EXTERNAL ef_get_one_val_sub_sub EXTERNAL ef_get_res_subscripts EXTERNAL ef_set_arg_desc EXTERNAL ef_set_arg_name EXTERNAL ef_set_arg_unit EXTERNAL ef_set_custom_axis EXTERNAL ef_set_desc c* c* Jonathan Callahan c* July 10th 1997 c* c* This is the header file to be included by routines which c* are part of the Ferret External Function library. c* c* EXTERNAL ef_version 1.1: *jc* 9.98 Added EXTERNAL ef_max_work_arrays c* c* 1.3: *jc* 4.99 Changed "work_array_len" to "work_array_lo/hi" in EF_Util.h c* c* *ac* 7.99 Added unspecified_int4 c* *sh* 8.99 Changed unspeficied_int4 to EF_unspecified_int4 c* because of conflict with same-name parameter c* in ferret.parm c* *ac* 9.99 Separate the parameters (previously EF_Util.cmn) c* external statements which will be included c* in external functions code. integer ef_c, ef_f, yes, no, x_axis, y_axis, z_axis, . arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, . t_axis, custom, implied_by_args, normal, abstract, . retained, reduced, float_arg, string_arg, . ef_max_args, ef_max_work_arrays, ef_max_name_length, . ef_max_description, ef_unspecified_int4 parameter ( ef_c = 1, . ef_f = 2, . yes = 1, . no = 0, . x_axis=1, . y_axis=2, . z_axis=3, . t_axis=4, . arg1 = 1, . arg2 = 2, . arg3 = 3, . arg4 = 4, . arg5 = 5, . arg6 = 6, . arg7 = 7, . arg8 = 8, . arg9 = 9, . custom = 101, . implied_by_args=102, . normal = 103, . abstract = 104, . retained = 201, . reduced = 202, . float_arg = 1, . string_arg = 2, . ef_max_args=9, . ef_max_work_arrays=9, . ef_max_name_length=40, . ef_max_description = 128, . ef_unspecified_int4 = -111 ) real ef_version parameter (ef_version = 1.3) * * Jonathan Callahan * September, 1998 * * Subscript limits required to use adjustable array declarations in external * functions. The "mem" subscripts will dimension arrays for Ferret * "memory resident" values (variables) while the "wrk" arrays are * dimension "working storage" arrays which are requested by the external * function. * * The subroutine efcn_compute will copy the contents of xmem_subsc.cmn * to the "mem" values before calling the external function's '_compute' * routine. The "wrk" values will also be filled in at this time. * ************************************************************************* ****** PARAMETER DEFINITIONS ****** INTEGER ef_max_mem_args PARAMETER ( ef_max_mem_args = 12 ) COMMON / EF_MEM_SUBSC / . mem1lox, mem2lox, mem3lox, mem4lox, mem5lox, mem6lox, . mem7lox, mem8lox, mem9lox, mem10lox, mem11lox, mem12lox, . mem1loy, mem2loy, mem3loy, mem4loy, mem5loy, mem6loy, . mem7loy, mem8loy, mem9loy, mem10loy, mem11loy, mem12loy, . mem1loz, mem2loz, mem3loz, mem4loz, mem5loz, mem6loz, . mem7loz, mem8loz, mem9loz, mem10loz, mem11loz, mem12loz, . mem1lot, mem2lot, mem3lot, mem4lot, mem5lot, mem6lot, . mem7lot, mem8lot, mem9lot, mem10lot, mem11lot, mem12lot, . . memreslox, memresloy, memresloz, memreslot, . . mem1hix, mem2hix, mem3hix, mem4hix, mem5hix, mem6hix, . mem7hix, mem8hix, mem9hix, mem10hix, mem11hix, mem12hix, . mem1hiy, mem2hiy, mem3hiy, mem4hiy, mem5hiy, mem6hiy, . mem7hiy, mem8hiy, mem9hiy, mem10hiy, mem11hiy, mem12hiy, . mem1hiz, mem2hiz, mem3hiz, mem4hiz, mem5hiz, mem6hiz, . mem7hiz, mem8hiz, mem9hiz, mem10hiz, mem11hiz, mem12hiz, . mem1hit, mem2hit, mem3hit, mem4hit, mem5hit, mem6hit, . mem7hit, mem8hit, mem9hit, mem10hit, mem11hit, mem12hit, . . memreshix, memreshiy, memreshiz, memreshit, . . wrk1lox, wrk2lox, wrk3lox, wrk4lox, wrk5lox, wrk6lox, . wrk7lox, wrk8lox, wrk9lox, wrk10lox, wrk11lox, wrk12lox, . wrk1loy, wrk2loy, wrk3loy, wrk4loy, wrk5loy, wrk6loy, . wrk7loy, wrk8loy, wrk9loy, wrk10loy, wrk11loy, wrk12loy, . wrk1loz, wrk2loz, wrk3loz, wrk4loz, wrk5loz, wrk6loz, . wrk7loz, wrk8loz, wrk9loz, wrk10loz, wrk11loz, wrk12loz, . wrk1lot, wrk2lot, wrk3lot, wrk4lot, wrk5lot, wrk6lot, . wrk7lot, wrk8lot, wrk9lot, wrk10lot, wrk11lot, wrk12lot, . . wrk1hix, wrk2hix, wrk3hix, wrk4hix, wrk5hix, wrk6hix, . wrk7hix, wrk8hix, wrk9hix, wrk10hix, wrk11hix, wrk12hix, . wrk1hiy, wrk2hiy, wrk3hiy, wrk4hiy, wrk5hiy, wrk6hiy, . wrk7hiy, wrk8hiy, wrk9hiy, wrk10hiy, wrk11hiy, wrk12hiy, . wrk1hiz, wrk2hiz, wrk3hiz, wrk4hiz, wrk5hiz, wrk6hiz, . wrk7hiz, wrk8hiz, wrk9hiz, wrk10hiz, wrk11hiz, wrk12hiz, . wrk1hit, wrk2hit, wrk3hit, wrk4hit, wrk5hit, wrk6hit, . wrk7hit, wrk8hit, wrk9hit, wrk10hit, wrk11hit, wrk12hit INTEGER . mem1lox, mem2lox, mem3lox, mem4lox, mem5lox, mem6lox, . mem7lox, mem8lox, mem9lox, mem10lox, mem11lox, mem12lox, . mem1loy, mem2loy, mem3loy, mem4loy, mem5loy, mem6loy, . mem7loy, mem8loy, mem9loy, mem10loy, mem11loy, mem12loy, . mem1loz, mem2loz, mem3loz, mem4loz, mem5loz, mem6loz, . mem7loz, mem8loz, mem9loz, mem10loz, mem11loz, mem12loz, . mem1lot, mem2lot, mem3lot, mem4lot, mem5lot, mem6lot, . mem7lot, mem8lot, mem9lot, mem10lot, mem11lot, mem12lot, . . memreslox, memresloy, memresloz, memreslot, . . mem1hix, mem2hix, mem3hix, mem4hix, mem5hix, mem6hix, . mem7hix, mem8hix, mem9hix, mem10hix, mem11hix, mem12hix, . mem1hiy, mem2hiy, mem3hiy, mem4hiy, mem5hiy, mem6hiy, . mem7hiy, mem8hiy, mem9hiy, mem10hiy, mem11hiy, mem12hiy, . mem1hiz, mem2hiz, mem3hiz, mem4hiz, mem5hiz, mem6hiz, . mem7hiz, mem8hiz, mem9hiz, mem10hiz, mem11hiz, mem12hiz, . mem1hit, mem2hit, mem3hit, mem4hit, mem5hit, mem6hit, . mem7hit, mem8hit, mem9hit, mem10hit, mem11hit, mem12hit, . . memreshix, memreshiy, memreshiz, memreshit, . . wrk1lox, wrk2lox, wrk3lox, wrk4lox, wrk5lox, wrk6lox, . wrk7lox, wrk8lox, wrk9lox, wrk10lox, wrk11lox, wrk12lox, . wrk1loy, wrk2loy, wrk3loy, wrk4loy, wrk5loy, wrk6loy, . wrk7loy, wrk8loy, wrk9loy, wrk10loy, wrk11loy, wrk12loy, . wrk1loz, wrk2loz, wrk3loz, wrk4loz, wrk5loz, wrk6loz, . wrk7loz, wrk8loz, wrk9loz, wrk10loz, wrk11loz, wrk12loz, . wrk1lot, wrk2lot, wrk3lot, wrk4lot, wrk5lot, wrk6lot, . wrk7lot, wrk8lot, wrk9lot, wrk10lot, wrk11lot, wrk12lot, . . wrk1hix, wrk2hix, wrk3hix, wrk4hix, wrk5hix, wrk6hix, . wrk7hix, wrk8hix, wrk9hix, wrk10hix, wrk11hix, wrk12hix, . wrk1hiy, wrk2hiy, wrk3hiy, wrk4hiy, wrk5hiy, wrk6hiy, . wrk7hiy, wrk8hiy, wrk9hiy, wrk10hiy, wrk11hiy, wrk12hiy, . wrk1hiz, wrk2hiz, wrk3hiz, wrk4hiz, wrk5hiz, wrk6hiz, . wrk7hiz, wrk8hiz, wrk9hiz, wrk10hiz, wrk11hiz, wrk12hiz, . wrk1hit, wrk2hit, wrk3hit, wrk4hit, wrk5hit, wrk6hit, . wrk7hit, wrk8hit, wrk9hit, wrk10hit, wrk11hit, wrk12hit /EF_Util.parm/1.1/Tue Jul 25 20:19:34 2000// /EF_mem_subsc.cmn/1.1/Fri Apr 9 18:06:55 1999// D