[comp.os.vms] Multiple runs in the background.

dillon@uhccux.UUCP (Ian Dillon) (05/21/88)

This may seem trivial to you UNIX gurus, but as I'm fairly new
to UNIX please bare with me.  
 
What follows is a section from a DCL file which assigns fortran
I/O units to logical names.  I realise you can do something similar
using the "setenv FORxxx CUO_Cxxx.DAT" on UNIX.  What I'd like to
do is set up a procedure which will prompt the user to supply the
name of a data file, use this name for all output, and then
submit the fortran program to run in the background of an Ultrix
system.

I'd like to do multiple runs using various data files.  Would it be
simpler to write: (1) a "makefile", (2) a fortran subroutine, or
(3) a "C" program, and pass the name to my main routine written
in fortran? 

DCL procedure ...

	$ ! ***************************************************
	$ ! CUO_C
	$ ! ***************************************************
	$ ASSIGN/USER [DILLON.SCRATCH]CUO_C01.JNK FOR001
	$ ASSIGN/USER [DILLON.SCRATCH]CUO_C08.JNK FOR008
	$ ASSIGN/USER [DILLON.DATA]CUO_C.CON FOR022
	$ ASSIGN/USER [DILLON.DATA]CUO_C.OPT FOR021
	$ ASSIGN/USER [DILLON.DATA]CUO_C.DAT FOR005
	$ ASSIGN/USER [DILLON.OUT]CUO_C.OUT FOR006  
                                      |          \
                                      |           \
                                      |            \
                                logical name    I/O unit

Any advice would be greatly appreciated.  Mahalo in advance! 

	Ian  
-- 
    |                      UUCP: dillon@uhccux.UUCP                     |  
    |           ARPA: dillon%uhccux.uhcc.hawaii.edu@rutgers.edu         |
    |               INTERNET: dillon@uhccux.UHCC.HAWAII.EDU             | 
    |                    BITNET: dillon@uhccux.bitnet                   | 

tsh@mace.cc.purdue.edu (Greg Kamer) (05/26/88)

> This may seem trivial to you UNIX gurus, but as I'm fairly new
> to UNIX please bare with me.  
>  
> What follows is a section from a DCL file which assigns fortran
> I/O units to logical names.  I realise you can do something similar
> using the "setenv FORxxx CUO_Cxxx.DAT" on UNIX.  What I'd like to
> do is set up a procedure which will prompt the user to supply the
> name of a data file, use this name for all output, and then
> submit the fortran program to run in the background of an Ultrix
> system.

> I'd like to do multiple runs using various data files.  Would it be
> simpler to write: (1) a "makefile", (2) a fortran subroutine, or
> (3) a "C" program, and pass the name to my main routine written
> in fortran? 

> DCL procedure ...

> 	$ ! ***************************************************
> 	$ ! CUO_C
> 	$ ! ***************************************************
> 	$ ASSIGN/USER [DILLON.SCRATCH]CUO_C01.JNK FOR001
> 	$ ASSIGN/USER [DILLON.SCRATCH]CUO_C08.JNK FOR008
> 	$ ASSIGN/USER [DILLON.DATA]CUO_C.CON FOR022
> 	$ ASSIGN/USER [DILLON.DATA]CUO_C.OPT FOR021
> 	$ ASSIGN/USER [DILLON.DATA]CUO_C.DAT FOR005
> 	$ ASSIGN/USER [DILLON.OUT]CUO_C.OUT FOR006  
>                                       |          \
>                                       |           \
>                                       |            \
>                                 logical name    I/O unit

There is a better way to do this using absolutely standard fortran 77 and
not having to write any DCL on VMS or scripts on Unix. Its called the
OPEN statement. It works well on every system I have ever worked on
(VMS, VSOS and Unix) for all files except std input and output. (There
are a few system specific peculiarities about how std input and output
are handled which make it hard to make it quite as general.

(What follows is a "canned" answer I pass on to anyone who brings this up...)

Its real simple. You make the names of the files you want to work with
the 1st part of the input from std input (unit 5). The you use open
to open the desired files. The example also shows how to open a couple
of internally used scratch files, which will automatically be made
unique by every operating system I've ever used.
e.g. -

      program sample
*      - max file length for the operating system
      parameter (maxflen = 32) 
      character*(maxflen) datin,datout
      logical batch

*      - do anything you need to do to open std input and output.
*      - I work on 3 different operating systems (VMS,Unix and Cyber 205 VSOS)
*	 but I made the calling sequence the same for all of 'em.
*        The internals are a bit operating system specific, but they
*	 do the same thing. arg 1 = unit for std input, arg 2 = unit for
*	 std output, arg 3 is a return of type logical that tells you
*	 whether you are running in batch or interactive.
*      - i stick the opensio (mnemonic for OPEN Standard IO) in a centralized
*	 libarary on whatever computer I am working with.
      call opensio (5, 6, batch)
      if (batch) then
	 read (5, '(a)') datin
	 print *,' Input atomic coords on file = ',datin
	 read (5, '(a)') datout
	 print *,' Output atomic coords on file = ',datout
      else
	 print *,' Name of Input atomic coord file ? '
	 read (5, '(a)') datin
	 print *,' Name of atomic coord file ? '
	 read (5, '(a)') datout
      endif
      open (20, file=datin, status='old', form='unformatted')
      open (21, file=datout, status='new', form='unformatted')
*      - open a couple of scratch units
      open (22, status='scratch', form='unformatted')
      open (23, status='scratch', form='formatted')
      
*      - do whatever it is the program needs to do...

      close (20)
      close (21)
      close (22)
      close (23)

      stop
      end

The advantage of this technique should be obvious if you have to run
programs on several operating systems. You don't have to write any
DCl or script language except for a few rudiments to deal with std input
and output redirection, if required. All input to the program is part
of a simple text file- no DCL or script language to confuse new users.
e.g.-
given that file user.dat looks like (on Unix)
/usr/kamer/Atomruns/atomin.dat
/usr/kamer/Atomruns/atomout.dat
(rest of user input to the program)

or (on VMS)
[KAMER.ATOMRUNS]ATOMIN.DAT
[KAMER.ATOMRUNS]ATOMOUT.DAT
(rest of user input to the program...)

you can use something like (Unix)
atomprog < run1.input > run1.output &

$ ASSIGN/USER [KAMER.ATOMRUNS]RUN1.DAT FOR005
$ ASSIGN/USER [KAMER.ATOMRUNS]RUN1.OUT FOR006  
RUN ATOMPROG

There are, of course, fancier input/output redirections which can be
used (when running interactively on Unix it is often handy to tee the
std output to a file so that you have a permanent copy) but the real
advantage is that -
a) you minimize the amount of DCL and script you have to write.
    (we do only interactive work on our VMS system, and
    for that, the ASSIGN's are not needed. In fact, no DCL at all is
    needed...).
b) even more importantly- in a "mixed" shop such as ours where we run
   on several operating systems, it cuts the learning curve for new
   users to a minimum. All programs read the names of the files that
   they have to deal with from std input; the amount of DCL/VSOS JCL/script
   that the user has to learn is cut to an absolute minimum.
   This is the real beauty of the setup. I have been working on VMS
   for about 3 years, VSOS for about 6 and Unix for about 10 years.
   To this day I would have to find a document for Unix shell that
   tells me how to assign files to units in script - I simply have
   never had a need to do it. The same also holds true for VMS, with
   the occasional exception of std input and output. VSOS is another
   matter- there is a bit of jcl required to attach the files (the
   old local .vs. batch file environment problem).
c) last but not least, the only thing I have to do to port the programs
   is to change the value of the maximum file length parameter to
   port the programs. Since there is no DCL/script associated with
   running the program, all I have to do is move the program, data
   files and user input file to another operating system, change
   the names of the files in the user input stream to match the
   conventions of operating system, and I'm off and running.

Hope this helps....now if the Fortran 88 standard would only some into
reality and I could forget about changing crap like
integer*2,real*2 and real*4 to integer, half precision and real
when I port things to/from UNIX / Cyber 205 VSOS...


-- 
Greg Kamer
Purdue Macromolecular Crystallography Computer Specialist

info-vax-request%kl.sri.COM%KL.SRI.COM%lbl%sfsu1.hepnet@LBL.GOV (05/28/88)

Received: from KL.SRI.COM by LBL.Gov with INTERNET ;
          Fri, 27 May 88 07:53:41 PDT
Received: from ucbvax.Berkeley.EDU by KL.SRI.COM with TCP; Thu 26 May 88 02:16:19-PDT
Received: by ucbvax.Berkeley.EDU (5.59/1.28)
	id AA12879; Wed, 25 May 88 18:03:56 PDT
Received: from USENET by ucbvax.Berkeley.EDU with netnews
	for info-vax@kl.sri.com (info-vax@kl.sri.com)
	(contact usenet@ucbvax.Berkeley.EDU if you have questions)
Date: 20 May 88 18:54:18 GMT
From: uhccux!dillon@humu.nosc.mil  (Ian Dillon)
Organization: U. of Hawaii, Manoa (Honolulu)
Subject: Multiple runs in the background.
Message-Id: <1869@uhccux.UUCP>
Sender: info-vax-request@kl.sri.com
To: info-vax@kl.sri.com
 
This may seem trivial to you UNIX gurus, but as I'm fairly new
to UNIX please bare with me.  
 
What follows is a section from a DCL file which assigns fortran
I/O units to logical names.  I realise you can do something similar
using the "setenv FORxxx CUO_Cxxx.DAT" on UNIX.  What I'd like to
do is set up a procedure which will prompt the user to supply the
name of a data file, use this name for all output, and then
submit the fortran program to run in the background of an Ultrix
system.
 
I'd like to do multiple runs using various data files.  Would it be
simpler to write: (1) a "makefile", (2) a fortran subroutine, or
(3) a "C" program, and pass the name to my main routine written
in fortran? 
 
DCL procedure ...
 
	$ ! ***************************************************
	$ ! CUO_C
	$ ! ***************************************************
	$ ASSIGN/USER [DILLON.SCRATCH]CUO_C01.JNK FOR001
	$ ASSIGN/USER [DILLON.SCRATCH]CUO_C08.JNK FOR008
	$ ASSIGN/USER [DILLON.DATA]CUO_C.CON FOR022
	$ ASSIGN/USER [DILLON.DATA]CUO_C.OPT FOR021
	$ ASSIGN/USER [DILLON.DATA]CUO_C.DAT FOR005
	$ ASSIGN/USER [DILLON.OUT]CUO_C.OUT FOR006  
                                      |          \
                                      |           \
                                      |            \
                                logical name    I/O unit
 
Any advice would be greatly appreciated.  Mahalo in advance! 
 
	Ian  
-- 
    |                      UUCP: dillon@uhccux.UUCP                     |  
    |           ARPA: dillon%uhccux.uhcc.hawaii.edu@rutgers.edu         |
    |               INTERNET: dillon@uhccux.UHCC.HAWAII.EDU             | 
    |                    BITNET: dillon@uhccux.bitnet                   |