source: palm/trunk/SCRIPTS/mrun @ 540

Last change on this file since 540 was 540, checked in by heinze, 14 years ago

changing IP-adresses to names hicegate0/bicegate0 for lcsgih/lcsgib

  • Property svn:keywords set to Id Rev
File size: 172.5 KB
RevLine 
[71]1#!/bin/ksh
[503]2# mrun - script for running PALM jobs
[169]3# $Id: mrun 540 2010-06-15 13:51:16Z heinze $
[1]4
[503]5     # Procedure for interactive/batch PALM runs (initial runs and automatic
6     # restart runs)
[1]7
[503]8     # Last changes:
[1]9     # 03/03/94 - Siggi - Entwicklungsbeginn
10     # 21/03/94 - Siggi - Entwicklungsabschluss (Version 1.0)
11     # 09/12/94 - Siggi - allexport unterbunden; statt dessen werden jetzt ein-
12     #                    zelne Variable exportiert. Dies ist noetig, weil an-
13     #                    sonsten irgendein Speicher ueberlaeuft und von mrun
14     #                    aufgerufene Programme (z.B. stageout) mit Fehlern
15     #                    abbrechen (too many arguments)
16     # 20/06/95 - Siggi - noclobber muss explizit abgeschaltet, da jetzt
17     #                    defaultmaessig im RRZN-Profile eingeschaltet
18     # 10/06/97 - Siggi - Zusaetzliche Option -C bei cpp, damit // nicht
19     #                    wegfallen
20     # 25/04/00 - Siggi - Version 1.5
21     #                    remote_addres und remote_user in return_addres bzw.
22     #                    return_username umbenannt, return_username wird dem
23     #                    mrun-Aufruf im Job ueber Option -U mitgegeben.
24     #                    Neue Variable remote_username, die beim interaktiven
25     #                    mrun-Aufruf zwingend ueber die neue Option -u oder
26     #                    in der Konfigurationsdatei angegeben werden muss.
27     # 08/02/01 - Siggi - Alle mrun-Meldungen ins englische uebersetzt,
28     #                    Version 1.7
29     # 05/05/02 - Siggi - Uebersetzungen mittels make-Mechanismus moeglich
30     # 21/11/02 - Siggi - ENV-Variable XLFRTEOPTS wird vor Ausfuehrung auf
31     #                    IBM gesetzt, um Record-Laenge der NAMELIST-Dateien,
32     #                    zu bestimmen; Praeprozessoroptionen haben nun alle
33     #                    die Form -Dtext=text, weil auf IBM sonst text durch
34     #                    die leere Zeichenkette ersetzt wird
35     # 01/08/03 - Siggi  - Test of implementing dvrp+1PE on ibm
36     # 07/01/04 - Siggi  - additional preprocessor directive for ibm included
37     #                     (-D$OMP=OMP) in order to avoid problems with
38     #                     OMP_NUM_THREADS
39     # 04/01/05 - Siggi  - archiving on hanni and berni is done in separate
40     #                     tar files, one for each node used
41     # 07/01/04 - Siggi  - old code for t3e, vpp and hpcs eliminated
42     # 09/01/05 - Siggi  - workaround for getting the IP address on gfdl3
43     # 17/01/05 - Siggi  - job for data transfer to local machine now within
44     #                     job class c1 (HLRN)
45     # 27/01/05 - Siggi  - IP address workaround for gfdl3 removed
46     # 28/01/05 - Siggi  - tar-filenames on $PERM (HLRN) now include the
47     #                     base filename and cycle number
48     # 16/02/05 - Gerald - hababai validated
49     # 14/03/05 - Siggi  - abort on NEC after first runtime error (F_ERRCNT)
50     # 29/03/05 - Marcus - berni*-en0 validated
51     # 21/04/05 - Siggi  - transfer-job-protocol for avs-data is no more stored
52     # 24/04/05 - Siggi  - netcdf support on lcmuk
53     # 25/04/05 - Siggi  - netcdf support on gfld3 (decalpha)
54     # 11/05/05 - Siggi  - files with non-numeric extensions (.xxx after cycle
55     #                     number) can now be used within interactive runs
56     # 12/05/05 - Siggi  - netcdf support on ibm
57     # 13/05/05 - Siggi  - error in tar-filenames on $PERM (HLRN) removed
58     # 18/05/05 - Siggi  - netcdf support on nec
59     # 24/05/05 - Siggi  - netcdf support on ibms
60     # 14/06/05 - Siggi  - sleep interval after submit of restart job increased
61     #                     to 30 seconds
62     # 28/06/05 - Siggi  - bora adjusted to new intel compiler (LD_LIBRARY_
63     #                     PATH is temporarily set)
64     # 07/09/05 - Siggi  - setting of MP_EAGER_LIMIT switched off because it
65     #                     caused warnings in the job protocol
66     # 20/10/05 - Siggi  - update of netcdf-version on decalpha (gfdl3)
67     # 25/10/05 - Siggi  - error in listing files for getting the cycle number
68     #                     removed
69     # 26/10/05 - Siggi  - new paths for dvrp-library, transfer of catalogs
70     #                     realized by file attribute trpe
71     # 28/10/05 - Siggi  - if existing, the file extension is output in case
72     #                     of missing input file - no job abort in case of
73     #                     missing input files with file extensions
74     #                     (preliminary solution)
75     # 31/10/05 - Siggi  - data transfer from nech now within seperate job
76     # 04/11/05 - Siggi  - netcdf 3.6.0-p1 on ibmh/ibmb
77     # 07/12/05 - Siggi  - gallego and elephanta admitted
78     # 30/12/05 - Siggi  - gfdl5 (ibmy) admitted
79     # 10/01/06 - Siggi  - cpp directive for NetCDF 64bit support
80     # 20/01/06 - Siggi  - cpp directive for ibmy
81     # 09/02/06 - Siggi  - ibmy admitted for batch mode
82     # 13/04/06 - Siggi  - ostria admitted
83     # 18/04/06 - Siggi  - usage of OpenMP implemented (additional option -O)
84     # 10/05/06 - Siggi  - environment variable XLSMPOPTS set on IBM for
85     #                     optimization of OpenMP runs (option stacksize is
86     #                     necessary for large gridpoint numbers because
87     #                     otherwise a segmentation fault occurs)
88     # 23/05/05 - Siggi  - lctit (SUN Fire X4600) admitted
89     # 21/08/06 - Siggi  - standard mrun path on scirocco is as on bora
90     # 23/08/06 - Siggi  - netcdf support for scirocco (notebook)
91     # 20/09/06 - Marcus - add DVRP library on nech
92     # 24/10/06 - Siggi  - Environment variables for PALM steering are written
93     #                     on local NAMELIST file ENVPAR
94     # 24/11/06 - Siggi  - levanto admitted, maestro switched to ifc 9.1
95     # 28/11/06 - Siggi  - call to interpret_config.x_levanto because of SuSe 10
96     # 06/02/07 - Siggi  - add DVRP library on lcmuk
97     # 07/02/07 - Siggi  - revision of source code handling, source code is
98     #                     now expected in directory given by source_path and
99     #                     not in the current working directory, source code
100     #                     files provided in add_source_path are allways
101     #                     compiled, source code to be compiled is allways
102     #                     sampled in SOURCES_FOR_RUN_$fname which is a
103     #                     subdirectory of the current working directory,
[5]104     #                     -s TEST  changed to  -s WRITE_PERMIT  or -s WP,
[1]105     #                     adapted for RIAM (neck)
[5]106     #                     bugfix for cycle number of output file (extout)
107     #                     all hpmuk-related code removed
[14]108     # 14/02/07 - Siggi  - dvrp support for neck added
[21]109     # 28/02/07 - Siggi  - empty lines in configuration file are accepted
[26]110     #                     mrun_path replaced by PALM_BIN,
111     #                     all machines are calling interpret_config.x
[66]112     # 14/03/07 - Siggi  - fimm admitted, revision number added to terminal
113     #                     output
[69]114     # 16/03/07 - Siggi  - adjustments for lctit
[78]115     # 29/03/07 - Siggi  - global revision transfered to batch job by new
116     #                     option -G
[82]117     # 30/03/07 - Siggi  - compilation "by hand" removed, cpp-directives/options
118     #                     + netcdf/dvrp-options are read from configuration
119     #                     file, host identifier (local_host) is read from
120     #                     config file, code related to ftp filetransfer
121     #                     removed (incl. option -f)
[97]122     # 19/06/07 - Siggi  - time limit for cdata jobs increased
[102]123     # 25/07/07 - Siggi  - two sets of executables can be started on lcmuk,
124     #                     if new option -Y (coupling) is given,
125     #                     output of executables to aout_output removed,
126     #                     messages are immediately written to stdout instead
[108]127     # 03/08/07 - Marcus - add XOPT="-X $numprocs" for lcfimm
128     # 09/08/07 - Marcus - workaround on lcfimm to propagate environment
129     #                     variables out to the nodes in coupled mode -disabled-
130     # 13/08/07 - Marcus - start local restart jobs per ssh on lcfimm
[109]131     # 28/08/07 - Marcus - completely remove workaround on lcfimm to propagate
132     #                     environment variables out to the nodes in coupled mode
[118]133     # 15/10/07 - Siggi  - Preliminary adjustments for lctit, based on Jin's
134     #                     suggestions
[122]135     # 19/10/07 - Marcus - further adjustments for lctit: add new optional
136     #                     argument -g group_number, admit all sla* node_usage
137     #                     queues
[129]138     # 30/10/07 - Marcus - further adjustments for queues on lctit
[149]139     # 14/02/08 - Bjoern - link of restart files with long file name possible
140     # 28/02/08 - Marcus - If environment variable link_local_output is set to
141     #                     true, mrun tries "ln -f" on local output and resorts
142     #                     to "cp" or "cp -r" on error
[164]143     # 15/04/08 - Siggi  - argument -c introduced to most of the subjob calls,
144     #                     which allows the user to choose his own job catalog
145     #                     by setting job_catalog in the configuration file
146     #                     (default is ~/job_queue),
[172]147     #                     workaround for mpiexec with -env option,
[164]148     #                     adjustments for lcxt4 (Bergen Center for Computational
149     #                     Science)
[183]150     # 22/05/08 - Marcus - If environment variable link_local_input is set to
151     #                     true, mrun tries "ln -f" on local input and resorts
152     #                     to "cp" or "cp -r" on error
[180]153     # 27/05/08 - Siggi  - PATH is set to PALM_BIN everywhere (missing so far)
[179]154     # 14/07/08 - Siggi  - adjustments for lcsgih
[188]155     # 08/08/08 - Marcus - typo removed in lcxt4 branch
[204]156     # 17/09/08 - Siggi  - restart mechanism adjusted for lcsgi
[210]157     # 02/10/08 - BjornM - argument "-Y" modified, adjustments for coupled runs
158     # 21/10/08 - Siggi  - bugfix for the case that -K has more than one
159     #                     argument
[211]160     # 08/11/08 - Siggi  - bugfix for depository path settings in configuration
161     #                     file
162     # 11/11/08 - Siggi  - rules for using user code files changed: user
163     #                     code splitted into one file per subroutine,
164     #                     user can provide his/her own makefile, only
165     #                     default source-code filenames are allowed
[215]166     # 14/11/08 - Siggi  - cond1 and cond2 are part of the depository name
[221]167     # 08/01/09 - Siggi  - mpi module on sgi machines to be used can be set
168     #                     with environment variable mpilib
[223]169     # 13/01/09 - Siggi  - totalview on hice/bice can be used in debug mode
170     #                     using environment variable totalview
[246]171     # 25/02/09 - Siggi  - cputime-option (-t) is allowed to be omitted for
172     #                     interactive runs
[253]173     # 05/03/09 - Siggi  - adjustments for new NEC-SX9 at RIAM (necriam)
[260]174     # 16/03/09 - Siggi  - dvrp_lib, dvrp_inc replaced by dvr_lib, dvr_inc,
175     #                     dvr streaming server is automatically started using
176     #                     new variable dvr_server and a configuration file
177     #                     .dvrserver.config,
[261]178     #                     processing of dvr output files using new script
179     #                     process_dvr_output implemented, in order to make
180     #                     dvr application more user friendly
[265]181     # 20/03/09 - Marcus - update of n1ge command for lctit
[291]182     # 16/04/09 - Siggi  - new option -y for precursor (uncoupled) ocean runs
183     #                     to be followed by a coupled atmosphere-ocean run
[343]184     # 21/04/09 - Siggi  - adjustments for new IBM at DKRZ, which is now ibmh
185     # 24/06/09 - BjornM - adjustments for coupled/precursor runs on ibmy
[352]186     # 08/07/09 - Siggi  - default value for email_notification is none,
187     #                     option -e added to subjob
[359]188     # 19/08/09 - Marcus - MPI debug option
[362]189     # 21/08/09 - Marcus - totalview on hice/bice also available for mvapich2
[367]190     # 25/08/09 - BjornM - adpated for lck
[369]191     # 26/08/09 - Siggi  - additional environment variables for mpt on ice2
[372]192     # 26/08/09 - Marcus - adjustment for ice2 on lcsgib
[397]193     # 29/09/09 - Siggi  - default value for archiving is false, option "-A"
194     #                     switches on archiving, archiving on SGI-ICE enabled
[416]195     # 16/10/09 - Carolin- adjustments for archiving on SGI-ICE of binary files;
196     #                     adjustment for special1q
197     # 18/12/09 - Carolin- modification of archiving (permq)
[440]198     # 01/02/10 - Siggi  - adapted for lcxt5m and lckyoto (Fujitsu HX600)
[475]199     # 03/02/10 - Siggi  - make options (mopts) to be set by configuration file
200     #                     implemented
[493]201     # 08/02/10 - Siggi  - loading of modules now controlled via configuration
202     #                     file (modules)
[503]203     # 02/03/10 - Siggi  - for each block in the configuration file, separate
204     #                     utility programs are used, combine_plot_fields is
205     #                     directly called and must not be given by an output
206     #                     command in the configuration file any more
[540]207     # 15/06/10 - Rieke  - ssh from compute nodes to login nodes on hosts
208     #                     lcsgih/lcsgib is done using the names
209     #                     hicegate0/bicegate0 instead of the IP addresses
[437]210
211
[1]212 
213    # VARIABLENVEREINBARUNGEN + DEFAULTWERTE
214
215 set +o allexport    # SICHERHEITSHALBER UNTERBINDEN, DA SONST EVTL. STAGEOUT
216                     # NICHT LAUEFT (TOO MANY ARGUMENTS - PROBLEM)
217 set +o noclobber    # EXISTIERENDE DATEIEN DUERFEN UEBERSCHRIEBEN WERDEN
218
219 AddFilenames=""
220 additional_conditions=""
221 add_source_path=""
222 afname=""
223 archive_save=true
224 archive_system=none
225 compiler_name=""
226 cond1=""
227 cond2="" 
228 config_file=.mrun.config
[206]229 coupled_dist=""
230 coupled_mode="mpi1"
[1]231 cpp_opts=""
[82]232 cpp_options=""
[1]233 cpumax=0
234 cpurest=0
235 delete_temporary_catalog=true
236 do_batch=false
237 do_compile=true
238 do_remote=false
239 do_stagein=true
240 do_stageout=true
241 do_trace=false
[352]242 email_notification="none"
[1]243 exclude=""
244 executable=""
245 execution_error=false
[67]246 fimm=false
[1]247 fname=test
248 fromhost=""
[78]249 global_revision=""
[122]250 group_number=none
[1]251 host=""
252 host_file=""
253 hp=""
254 ignore_archive_error=false
255 input_list=""
256 interpreted_config_file=""
[164]257 job_catalog="~/job_queue"
[1]258 job_on_file=""
259 keep_data_from_previous_run=false
[183]260 link_local_input=false
[149]261 link_local_output=false
[1]262 localhost_realname=$(hostname)
263 local_compile=false
[260]264 local_dvrserver_running=.FALSE.
[1]265 locat=normal
266 mainprog=""
267 makefile=""
268 mc=$0
269 while [[ $(echo $mc | grep -c "/") != 0 ]]
270 do
271    mc=`echo $mc | cut -f2- -d"/"`
272 done
[493]273 module_calls=""
[1]274 mrun_script_name=$mc
[82]275 netcdf_inc=""
276 netcdf_lib=""
[1]277 netcdf_support=false
278 node_usage=default
279 numprocs=""
[206]280 numprocs_atmos=0
281 numprocs_ocean=0
[1]282 OOPT=""
283 openmp=false
284 output_list=""
285 package_list=""
286 punkte="..........................................................."
287 queue=none
288 read_from_config=""
[5]289 restart_run=false
[146]290 return_addres=$(nslookup `hostname` 2>&1 | grep "Address:" | tail -1 | awk '{print $2}')
[1]291 if [[ $return_addres = 130.75.105.158 ]]
292 then
293    return_addres=172.20.25.41
294    echo "+++ WARNING: return_addres changed to $return_addres !!!!!"
295 fi
296 return_password=""
297 return_username=$LOGNAME
298 remotecall=false
299 remote_username=""
[102]300 run_coupled_model=false
[1]301 run_mode=""
302 scirocco=false
[397]303 store_on_archive_system=false
[1]304 striche="  ----------------------------------------------------------------------------"
305 silent=false
306 source_list=""
307 source_path=SOURCE
308 tasks_per_node=""
309 threads_per_task=1
310 tmpcreate=false
311 tmp_data_catalog=""
312 transfer_problems=false
313 usern=$LOGNAME
[377]314 use_openmp=false
[1]315 working_directory=`pwd`
316 TOPT=""
317 XOPT=""
318 zeit=$( date | cut -c 12-19 )
319
320 typeset -i  iec=0 iic=0 iin=0 ioc=0 iout=0 memory=0 stagein_anz=0 stageout_anz=0
[206]321 typeset -i  cputime i ii iia iii iio icycle inode ival jobges jobsek maxcycle minuten nodes pes sekunden tp1
[1]322
[66]323 typeset  -R30 calltime
[1]324 typeset  -L20 spalte1
325 typeset  -L40 spalte2
326 typeset  -L60 spalte3
327 typeset  -L35 string1=`date`
328 typeset  -L12 string2=$usern
329 typeset  -L12 string3=$localhost_realname
330 typeset  -L12 string4
331 typeset  -L12 string5
[201]332 typeset  -L30 version="MRUN  2.0 Rev$Rev: 540 $"
[1]333
334
335
336    # EINZELNE VARIABLE FUER HAUPTPROGRAMM EXPORTIEREN
337 export  cpurest fname host localhost return_addres return_username remotecall tasks_per_node
338
339    # FOLGENDE VARIABLEN MUESSEN FUER DIE INTERPRETATION DER KONFIGURATIONSDATEI
340    # EXPORTIERT WERDEN
341 export  afname config_file cpp_opts cpumax do_batch do_trace fname fromhost
[127]342 export  group_number input_list memory numprocs output_list queue run_mode
[1]343
344
345 
346    # FEHLERBEHANDLUNG
347    # BEI EXIT:
[83]348 trap 'rm -rf  $working_directory/tmp_mrun
[69]349       if [[ $locat != localhost ]]
[1]350       then
[22]351#          if [[ ! -f ${mrun_path}/statistik/mrun_statistik ]]
352#          then
353#             cat  >  ${mrun_path}/statistik/mrun_statistik  <<  %STATEND%
354#MRUN-calls on $localhost
355#
356#date and time                      user        localhost   remotehost  termination mrun-command
357#--------------------------------------------------------------------------------------------------------------------
358#%STATEND%
359#             chmod  666  ${mrun_path}/statistik/mrun_statistik
360#          fi
361#
362#             # EINTRAG IN DIE STATISTIK-DATEI
363#          string4=$host
364#          string5=$locat
365#          if [[ "$job_on_file" = ""  &&  $locat != control_c  &&  $locat != user_abort ]]
366#          then
367#             if [[ $do_batch = true ]]
368#             then
369#                printf "$string1$string2$string3$string4$string5$mrun_com \n"  >>  ${mrun_path}/statistik/mrun_statistik
370#             else
371#                printf "$string1$string2$string3$string4$string5$mc \n"  >>  ${mrun_path}/statistik/mrun_statistik
372#             fi
373#          fi
[69]374          echo " " > /dev/null
[1]375       fi
376
377       if [[ $locat != normal  &&  $locat != control_c  &&  $locat != local_compile ]]
378       then
379
380              # EVENTUELLE ERROR-KOMMANDOS ABARBEITEN
381          (( i = 0 ))
382          while (( i < iec ))
383          do
384             (( i = i + 1 ))
385             printf "\n  *** Execution of ERROR-command:\n"
386             printf "  >>> ${err_command[$i]}\n"
387             eval  ${err_command[$i]}
388          done
389          if [[ -n $interpreted_config_file ]]  then
390             rm -rf  $interpreted_config_file
391          fi
[71]392          if [[ -n .mrun_environment ]]  then
393             rm -rf  .mrun_environment
394          fi
[1]395          if [[ $tmpcreate = true ]]
396          then
397             printf "\n  *** Contents of \"$TEMPDIR\":\n"
398             ls -al; cd
399             [[ $delete_temporary_catalog = true ]]  &&  rm -rf $TEMPDIR
400          fi
[260]401          if [[ "$dvrserver_id" != "" ]]
402          then
403             echo "+++ killing dvrserver_id=$dvrserver_id"
404             kill $dvrserver_id
405          fi
[1]406          if [[ -f ~/job_queue/JOBINFO.$QSUB_REQID ]]
407          then
408             rm -rf  ~/job_queue/JOBINFO.$QSUB_REQID
409          fi
410          printf "\n\n+++ MRUN killed \n\n"
411       elif [[ $locat != control_c ]]
412       then
413          printf "\n\n --> all actions finished\n\n"
414          printf "     Bye, bye $usern !!\n\n"
415       fi' exit
416
417
418    # BEI TERMINAL-BREAK:
[83]419 trap 'rm -rf  $working_directory/tmp_mrun
[69]420       [[ $tmpcreate = true ]]  &&  (cd; rm -rf $TEMPDIR)
[1]421       if [[ -f ~/job_queue/JOBINFO.$QSUB_REQID ]]
422       then
423          rm -rf  ~/job_queue/JOBINFO.$QSUB_REQID
424       fi
[260]425       if [[ "$dvrserver_id" != "" ]]
426       then
427          echo "+++ killing dvrserver_id=$dvrserver_id"
428          kill $dvrserver_id
429       fi
[1]430       printf "\n+++ MRUN killed by \"^C\" \n\n"
431       locat=control_c
432       exit
433      ' 2
434
435
[22]436    # CHECK IF THE PATH FOR THE PALM BINARIES (SCRIPTS+UTILITY-PROGRAMS) HAS
437    # BEEN SET
438 if [[ "$PALM_BIN" = "" ]]
439 then
440    printf "\n  +++ environment variable PALM_BIN has not been set"
441    printf "\n      please set it to the directory where the PALM scripts are located"
442    locat=palm_bin; exit
443 fi
[180]444 export PATH=$PALM_BIN:$PATH
[22]445
446
[1]447
448    # SHELLSCRIPT-OPTIONEN EINLESEN UND KOMMANDO NEU ZUSAMMENSETZEN, FALLS ES
449    # FUER FOLGEJOBS BENOETIGT WIRD
[291]450 while  getopts  :a:AbBc:Cd:D:Fg:G:h:H:i:IkK:m:M:n:o:Op:P:q:r:R:s:St:T:u:U:vxX:yY: option
[1]451 do
452   case  $option  in
453       (a)   afname=$OPTARG;;
[397]454       (A)   store_on_archive_system=true; mc="$mc -A";;
[1]455       (b)   do_batch=true; mc="$mc -b";;
456       (B)   delete_temporary_catalog=false; mc="$mc -B";;
457       (c)   config_file=$OPTARG; mc="$mc -c$OPTARG";;
[5]458       (C)   restart_run=true; mc="$mc -C";;
[1]459       (d)   fname=$OPTARG; mc="$mc -d$OPTARG";;
[210]460       (D)   cpp_opts="$cpp_opts $OPTARG"; mc="$mc -D'$OPTARG'";;
[79]461       (F)   job_on_file="-D"; mc="$mc -F";;
[122]462       (g)   group_number=$OPTARG; mc="$mc -g$OPTARG";;
[78]463       (G)   global_revision=$OPTARG; mc="$mc -G'$OPTARG'";;
[1]464       (h)   host=$OPTARG; mc="$mc -h$OPTARG";;
465       (H)   fromhost=$OPTARG; mc="$mc -H$OPTARG";;
466       (i)   input_list=$OPTARG; mc="$mc -i'$OPTARG'";;
467       (I)   ignore_archive_error=true; mc="$mc -I";;
468       (k)   keep_data_from_previous_run=true; mc="$mc -k";;
[210]469       (K)   additional_conditions="$OPTARG"; mc="$mc -K'$OPTARG'";;
[1]470       (m)   memory=$OPTARG; mc="$mc -m$OPTARG";;
471       (M)   makefile=$OPTARG; mc="$mc -M$OPTARG";;
472       (n)   node_usage=$OPTARG; mc="$mc -n$OPTARG";;
473       (o)   output_list=$OPTARG; mc="$mc -o'$OPTARG'";;
474       (O)   use_openmp=true; mc="$mc -O";;
475       (p)   package_list=$OPTARG; mc="$mc -p'$OPTARG'";;
476       (P)   return_password=$OPTARG; mc="$mc -P$OPTARG";;
477       (q)   queue=$OPTARG; mc="$mc -q$OPTARG";;
478       (r)   run_mode=$OPTARG; mc="$mc -r'$OPTARG'";;
479       (R)   remotecall=true;return_addres=$OPTARG; mc="$mc -R$OPTARG";;
480       (s)   source_list=$OPTARG; mc="$mc -s'$OPTARG'";;
481       (S)   read_from_config=false; mc="$mc -S";;
482       (t)   cpumax=$OPTARG; mc="$mc -t$OPTARG";;
483       (T)   tasks_per_node=$OPTARG; mc="$mc -T$OPTARG";;
484       (u)   remote_username=$OPTARG; mc="$mc -u$OPTARG";;
485       (U)   return_username=$OPTARG; mc="$mc -U$OPTARG";;
486       (v)   silent=true; mc="$mc -v";;
487       (x)   do_trace=true;set -x; mc="$mc -x";;
488       (X)   numprocs=$OPTARG; mc="$mc -X$OPTARG";;
[291]489       (y)   ocean_file_appendix=true; mc="$mc -y";;
[206]490       (Y)   run_coupled_model=true; coupled_dist=$OPTARG; mc="$mc -Y'$OPTARG'";;
[1]491       (\?)  printf "\n  +++ unknown option $OPTARG \n"
492             printf "\n  --> type \"$0 ?\" for available options \n"
493             locat=parameter;exit;;
494   esac
495 done
496
497
498    # EVTL. POSITIONSPARAMETER EINLESEN
499    # ZUR ZEIT GIBT ES NUR DEN PARAMETER ? (=KURZINFO)
500 shift OPTIND-1
501
502
503    # KURZE AUFRUFBESCHREIBUNG WIRD HIER AUSGEGEBEN
504 if [[ "$1" = "?" ]]
505 then
506   (printf "\n  *** mrun can be called as follows:\n"
[291]507    printf "\n      $mrun_script_name  -b -c.. -d.. -D.. -f.. -F -h.. -i.. -I -K.. -m.. -o.. -p.. -r.. -R -s.. -t.. -T.. -v -x -X.. -y -Y.. <modus>\n"
[1]508    printf "\n      Description of available options:\n"
509    printf "\n      Option  Description                              Default-Value"
510    printf "\n        -a    base name of input files                 equiv. -d"
[400]511    printf "\n        -A    archiving when using file-attribute fl"
[1]512    printf "\n        -b    batch-job on local machine               ---"
513    printf "\n        -B    do not delete temporary directory at end ---"
514    printf "\n        -c    configuration file                       .mrun.config"
515    printf "\n        -d    base name of files attached to program   test"
516    printf "\n        -D    preprocessor(cpp)-directives             \"\" "
517    printf "\n        -F    create remote job file only              ---"
518    printf "\n        -h    execution host                           $localhost_realname"
519    printf "\n        -i    INPUT control list                       \"\" "
520    printf "\n        -I    archiving errors of previous batch-jobs"
521    printf "\n              will be ignored"
522    printf "\n        -k    keep data from previous run"
523    printf "\n        -K    additional conditions for controling"
524    printf "\n              usage of conditional code and"
525    printf "\n              env-variables in configuration file      \"\" "
526    printf "\n        -m    memory demand in MB (batch-jobs)         0 MB"
527    printf "\n        -M    Makefile name                            Makefile"
528    printf "\n        -n    node usage (shared/not_shared)           depending on -h"
529    printf "\n        -o    OUTPUT control list                      \"\" "
530    printf "\n        -O    use OpenMP                               ---"
531    printf "\n        -p    software package list                    \"\" "
532    printf "\n        -q    queue                                    \"$queue\" "
533    printf "\n        -r    run control list (combines -i -o)        \"\" "
534    printf "\n        -s    filenames of routines to be compiled     \"\" "
535    printf "\n              must end with .f, .f90, .F, or .c !"
536    printf "\n              use \"..\" for more than one file and wildcards"
537    printf "\n              -s TEST compiles all files with w-permit"
538    printf "\n        -S    config file interpreted by shellscript   ---"
539    printf "\n        -t    allowed cpu-time in seconds (batch)      0"
540    printf "\n        -T    tasks per node                           depending on -h"
541    printf "\n        -u    username on remote machine               \"\" "
542    printf "\n        -v    no prompt for confirmation               ---"
543    printf "\n        -x    tracing of mrun for debug purposes       ---"
544    printf "\n        -X    # of processors (on parallel machines)   1"
[291]545    printf "\n        -y    add appendix \"_O\" to all local output"
546    printf "\n              files (ocean precursor runs followed by"
547    printf "\n              coupled atmosphere-ocean runs)           ---"
[206]548    printf "\n        -Y    run coupled model, \"#1 #2\" with" 
549    printf "\n              #1 atmosphere and #2 ocean processors    \"#/2 #/2\" depending on -X"
[1]550    printf "\n "
551    printf "\n      Possible values of positional parameter <modus>:"
552    printf "\n        \"?\"       -  this outline \n\n") | more
553    exit
554 elif [[ "$1" != "" ]]
555 then
556    printf "\n  +++ positional parameter $1 unknown \n"
557    locat=parameter; exit
558 fi
559
560
561
562    # KURZE STARTMELDUNG
563 printf "\n*** $version "
564 printf "\n    will be executed.     Please wait ..."
565
566
[82]567
568    # PRUEFEN, OB KONFIGURATIONS-DATEI VORHANDEN
569 if [[ ! -f $config_file ]]
570 then
571    printf "\n\n  +++ configuration file: "
572    printf "\n           $config_file"
573    printf "\n      does not exist"
574    locat=connect; exit 
575 fi
576
577
578    # HOST-IDENTIFIER (local_host) AUS KONFIGURATIONSDATEI BESTIMMEN
579 line=""
580 grep  "%host_identifier"  $config_file  >  tmp_mrun
581 while read line
582 do
[206]583    if [[ "$line" != ""  &&  $(echo $line | cut -c1) != "#" ]]
[82]584    then
585       HOSTNAME=`echo $line | cut -d" " -s -f2`
586       host_identifier=`echo $line | cut -d" " -s -f3`
[83]587       if [[ $localhost_realname = $HOSTNAME ]]
[82]588       then
589          localhost=$host_identifier
590          break
591       fi
592    fi
593 done < tmp_mrun
594
595 if [[ "$localhost" = "" ]]
596 then
597    printf "\n\n  +++ no host identifier found in configuration file \"$config_file\""
598    printf "\n      for local host \"$localhost_realname\"."
599    printf "\n      Please add line"
600    printf "\n      \"\%host_identifier $localhost_realname <identifier>\""
601    printf "\n      to the configuration file."
602    locat=localhost; exit
603 fi
604
605
606    # HOSTSPEZIFISCHE VARIABLEN SETZEN
607 case  $localhost_realname  in
[397]608     (r1*|r2*|h01*|b01*)     archive_system=tivoli;;
[82]609     (cs*)                   archive_system=ut;;
610     (fimm.bccs.uib.no)      fimm=true;;
611     (gate|n-sx)             PATH=$PALM_BIN:$PATH:/usr/bin/nqsII;;
612     (scirocco)              scirocco=true;;
613 esac
614
615
616 
[1]617    # BASISNAME DER INPUT-DATEIEN GLEICH ALLGEMEINEM BASISNAMEN SETZEN,
618    # WENN NICHT VOM BENUTZER ANDERS BESTIMMT
619 [[ "$afname" = "" ]]  &&  afname=$fname
620
621
622    # EVTL. RUN-MODUS DEN I/O-LISTEN HINZUFUEGEN
623 if [[ "$run_mode" != "" ]]
624 then
625    input_list="$input_list $run_mode"
626    output_list="$output_list $run_mode"
627 fi
628
629
630    # RECHNERNAMEN ABSPEICHERN, VON DEM AUS JOB GESTARTET WIRD,
631    # ALLERDINGS NUR DANN, WENN NICHT PER OPTION -H BEREITS EIN WERT
632    # ZUGEWIESEN WURDE (MRUN MACHT DIES IMMER, WENN ES SELBST BATCH-JOBS
633    # STARTET)
634 if [[ "$fromhost" = "" ]]
635 then
636    fromhost=$localhost
637 fi
638
639
640     # PRUEFEN, OB MRUN NUR TESTWEISE AUF DER LOKALEN MASCHINE KOMPILIEREN SOLL
641 if [[ "$source_list" = LOCAL_COMPILE_TEST ]]
642 then
643    source_list=TEST
644    local_compile=true
645    host=$localhost
646 fi
647   
648
649    # PRUEFEN, OB AUF REMOTE-MASCHINE GERECHNET WERDEN SOLL
650    # WERT VON do_remote WIRD FUER DATEIVERBINDUNGEN BENOETIGT.
651    # WENN AUF REMOTE-MASCHINE GERECHNET WIRD, IST GLEICHZEITIG KLAR,
652    # DASS EIN BATCH-JOB GESTARTET WERDEN MUSS
653 if [[ -n $host  &&  "$host" != $localhost ]]
654 then
655    do_batch=true
656    do_remote=true
657    case  $host  in
[440]658        (ibm|ibmb|ibmh|ibms|ibmy|nech|necriam|lckyoto|lcsgib|lcsgih|lctit|unics|lcxt4|lcxt5m|lck)  true;;
[1]659        (*)  printf "\n"
[83]660             printf "\n  +++ sorry: execution of batch jobs on remote host \"$host\""
661             printf "\n      is not available"
[1]662             locat=nqs; (( iec = 0 )); exit;;
663    esac
664 else
665    host=$localhost
666 fi
667
668
669     # ZUSATZBEDINGUNGEN (OPTION -K) AUSWERTEN
670 if [[ -n $additional_conditions ]]
671 then
[69]672#    echo $additional_conditions | cut -d" " -f1-3 | read  cond1  cond2  dummy
673    cond1=`echo $additional_conditions | cut -d" " -f1`
674    cond2=`echo $additional_conditions | cut -d" " -s -f2`
675    dummy=`echo $additional_conditions | cut -d" " -s -f3`
[1]676    if [[ -n $dummy ]]
677    then
678       printf "\n  +++ more than 2 additional conditions given for Option \"-K\""
679       locat=options; exit
680    fi
[503]681    block=_$cond1
682    [[ -n $cond2 ]]  &&  block=${block}_$cond2
[1]683 fi
684
685
[206]686      # KOPPLUNGSEIGENSCHAFTEN (-Y) AUSWERTEN UND coupled_mode BESTIMMEN
687 if [[ $run_coupled_model = true ]] 
688 then
689
690    if  [[ -n $coupled_dist ]]
691    then
692
693       numprocs_atmos=`echo $coupled_dist | cut -d" " -s -f1`
694       numprocs_ocean=`echo $coupled_dist | cut -d" " -s -f2`
695
696       if (( $numprocs_ocean + $numprocs_atmos != $numprocs ))
697       then
698
699          printf "\n  +++ number of processors does not fit to specification by \"-Y\"."
700          printf "\n      PEs (total)     : $numprocs"
701          printf "\n      PEs (atmosphere): $numprocs_atmos"
702          printf "\n      PEs (ocean)     : $numprocs_ocean"
703          locat=coupling; exit
704
705          # REARRANGING BECAUSE CURRENTLY ONLY 1:1 TOPOLOGIES ARE SUPPORTED
706          # THIS SHOULD BE REMOVED IN FUTURE
707       elif (( $numprocs_ocean != $numprocs_atmos ))
708       then
709
710          printf "\n  +++ currently only 1:1 topologies are supported"
711          printf "\n      PEs (total)     : $numprocs"
712          printf "\n      PEs (atmosphere): $numprocs_atmos"
713          printf "\n      PEs (ocean)     : $numprocs_ocean"
714          (( numprocs_atmos = $numprocs / 2 ))
715          (( numprocs_ocean = $numprocs / 2 ))
716          printf "\n  +++ rearranged topology to $numprocs_atmos:$numprocs_ocean"
717
718       fi
719
720    else
721
722       (( numprocs_ocean = $numprocs / 2 ))
723       (( numprocs_atmos = $numprocs / 2 ))
724
725    fi
726    coupled_dist=`echo "$numprocs_atmos $numprocs_ocean"`
727
728       # GET coupled_mode FROM THE CONFIG FILE
729    line=""
730    grep  "%cpp_options.*-D__mpi2.*$host" $config_file  >  tmp_mrun
731    while read line
732    do
733       if [[ "$line" != ""  &&  $(echo $line | cut -c1) != "#" &&  ( $(echo $line | cut -d" " -s -f4) = $cond1 || $(echo $line | cut -d" " -s -f4)  = $cond2 ) ]]
734       then
735          coupled_mode="mpi2"
736       fi
737    done < tmp_mrun
738
739 fi
740
741
[1]742    # PRUEFEN, OB EVTL. BEI VORHERGEHENDEM LAUF (KETTENJOB) EINE
743    # ARCHIVIERUNG FEHLGESCHLAGEN IST
744 if [[ -f ~/job_queue/ARCHIVE_ERROR_$fname ]]
745 then
746    if [[ $ignore_archive_error = false ]]
747    then
748       printf "\n  +++ data archiving of previous run failed"
749       printf "\n      see directory \~/job_queue on remote machine"
750       locat=archive; exit
751    else
752       printf "\n  +++ warning: data archiving in a previous run failed"
753       printf "\n      MRUN continues, trying to get backup copy"
754    fi
755 fi
756
757
758
759    # LESEN UND INTERPRETIEREN DER KONFIGURATIONS-DATEI VOM SHELLSCRIPT AUS
760    # VORUEBERGEHEND ZWINGEND AUF LINUX-RECHNERN
761 if [[ "$read_from_config" = false ]]
762 then
763
764    [[ $silent = false ]]  &&  printf "\n    Reading the configuration file... "
765    while  read zeile
766    do
767        [[ $silent = false ]]  &&  printf "."
768
769
770          # ZUERST EVENTUELL VORKOMMENDE ENVIRONMENT-VARIABLEN DURCH IHRE WERTE
771          # ERSETZEN
772       eval  zeile=\"$zeile\"
773
774
775          # INTERPRETATION DER ZEILE
[21]776       if [[ "$(echo $zeile)" = "" ]]
[1]777       then
[21]778             # LEERZEILE, KEINE AKTION
779          continue
[1]780
[21]781       elif [[ "$(echo $zeile | cut -c1)"  =  "#" ]]
782       then
783
[1]784             # ZEILE IST KOMMENTARZEILE
785          true
786
787       elif [[ "$(echo $zeile | cut -c1)"  =  "%" ]]
788       then
789
790             # ZEILE DEFINIERT ENVIRONMENT-VARIABLE
791          zeile=$(echo $zeile | cut -c2-)
[69]792#          echo $zeile | cut -d" " -f1-5 | read  var  value  for_host  for_cond1  for_cond2
793          var=`echo $zeile | cut -d" " -f1`
794          value=`echo $zeile | cut -d" " -s -f2`
795          for_host=`echo $zeile | cut -d" " -s -f3`
796          for_cond1=`echo $zeile | cut -d" " -s -f4`
797          for_cond2=`echo $zeile | cut -d" " -s -f5`
[1]798
799          if [[ "$for_host" = ""  ||  ( "$for_host" = $host  &&  "$for_cond1" = "$cond1"  &&  "$for_cond2" = "$cond2" )  ||  $(echo "$input_list$output_list"|grep -c "$for_host") != 0 ]]
800          then
801
802                # BEI COMPILER- CPP- ODER LINKEROPTIONEN EVTL ":" DURCH " "
803                # ERSETZEN. "::" WIRD DURCH ":" ERSETZT.
804             value=`echo $value | sed 's/::/%DUM%/g' | sed 's/:/ /g' | sed 's/%DUM%/:/g'`
805
806
807                # ENVIRONMENT-VARIABLE WIRD WERT AUS KONFIGURATIONSDATEI
808                # ZUGEWIESEN, WENN SIE SELBST NOCH KEINEN WERT UEBER DIE
809                # ENTSPRECHENDE SCRIPT-OPTION ERHALTEN HAT. SOLCHE
810                # VARIABLEN HAETTEN DANN DEN WERT "" ODER IM INTEGER-FALL DEN
811                # WERT 0.  ALLGEMEINE REGEL ALSO: SCRIPT-OPTION GEHT UEBER
812                # KONFIGURATIONSDATEI
813             if [[ "$(eval echo \$$var)" = ""  ||  "$(eval echo \$$var)" = "0" ]]
814             then
815                eval  $var=\$value
816
817                   # EVTL. BILDSCHIRMAUSGABEN DER ENVIRONMENT-VARIABLEN
818                if [[ $do_trace = true ]]
819                then
820                   printf "\n*** ENVIRONMENT-VARIABLE $var = $value"
821                fi
822             fi
823
824                # WENN ENVIRONMENT-VARIABLE HOST VEREINBART, DANN SOFORT AUSWERTEN
825                # WERT VON do-remote WIRD BEI DATEIVERBINDUNGEN BENOETIGT
826                # WENN AUF REMOTE-MASCHINE GERECHNET WIRD, IST GLEICHZEITIG KLAR,
827                # DASS EIN BATCH-JOB GESTARTET WERDEN MUSS
828             if [[ $var = host ]]
829             then
830                if [[ -n $host  &&  "$host" != $localhost ]]
831                then
832                   do_batch=true
833                   do_remote=true
834                   case  $host  in
[440]835                       (ibm|ibms|ibmy|lckyoto|lcsgib|lcsgih|lctit|nech|necriam|unics|lcxt4|lcxt5m|lck)  true;;
[83]836                       (*)  printf "\n  +++ sorry: execution of batch jobs on remote host \"$host\""
837                            printf "\n      is not available"
[1]838                            locat=nqs; exit;;
839                   esac
840                else
841                   host=$localhost
842                fi
843             fi
844
845                # VOM BENUTZER DEFINIERTE ENVIRONMENT VARIABLEN MUESSEN PRINZIPIELL
846                # EXPORTIERT WERDEN, DA SIE VIELLEICHT IN WEITER UNTEN AUFZURUFEN-
847                # DEN PROGRAMMEN BENOETIGT WERDEN
848             export  $var
849          fi
850
851
852
853
854       elif [[ "$(echo $zeile | cut -c1-3)" = "EC:" ]]
855       then
856
857             # ZEILE DEFINIERT ERROR-KOMMANDO
858          (( iec = iec + 1 ))
859          zeile=$(echo $zeile | cut -c4-)
860          err_command[$iec]="$zeile"
861
862       elif [[ "$(echo $zeile | cut -c1-3)" = "IC:" ]]
863       then
864
865             # ZEILE DEFINIERT INPUT-KOMMANDO
866          (( iic = iic + 1 ))
867          zeile=$(echo $zeile | cut -c4-)
868          in_command[$iic]="$zeile"
869
870       elif [[ "$(echo $zeile | cut -c1-3)" = "OC:" ]]
871       then
872
873             # ZEILE DEFINIERT OUTPUT-KOMMANDO
874          (( ioc = ioc + 1 ))
875          zeile=$(echo $zeile | cut -c4-)
876          out_command[$ioc]="$zeile"
877
878       else
879
880             # ZEILE DEFINIERT DATEIVERBINDUNG. EINLESEN DER DATEIEIGENSCHAFTEN
881             # s2a: in/out - Feld
882             # s2b: loc    - Feld (optional)
883             # s2c: tr/ar  - Feld (optional)
[69]884#          echo $zeile | cut -d" " -f1-2 | read  s1  s2
885          s1=`echo $zeile | cut -d" " -f1`
886          s2=`echo $zeile | cut -d" " -s -f2`
[1]887          s2a=$(echo $s2 | cut -d":" -f1)
888          if [[ $(echo $s2 | grep -c ":") = 0 ]]
889          then
890             s2b=""
891             s2c=""
892          else
[69]893#             echo $s2 | cut -d":" -f2-3 | sed 's/:/ /g' | read  s2b  s2c
894             s2b=`echo $s2 | cut -d":" -f2 | sed 's/:/ /g'`
895             s2c=`echo $s2 | cut -d":" -s -f3 | sed 's/:/ /g'`
[1]896          fi
[69]897#          echo $zeile | cut -d" " -f3-6 | read  s3  s4  s5  s6
898          s3=`echo $zeile | cut -d" " -f3`
899          s4=`echo $zeile | cut -d" " -s -f4`
900          s5=`echo $zeile | cut -d" " -s -f5`
901          s6=`echo $zeile | cut -d" " -s -f6`
[1]902
903       
904             # ABSPEICHERN DER DATEIVERBINDUNG, FALLS IN INPUT- ODER OUTPUT-LIST
905             # VERMERKT. VARIABLE S3 KANN AUCH LISTE ENTHALTEN (FELDTRENNER ":")
906             # DATEIVERBINDUNG WIRD DANN NICHT ABGESPEICHERT UND GEPRUEFT, WENN
907             # PROGRAMMLAUF AUF REMOTE-MASCHINE ERFOLGT UND DATEI NUR LOKAL VOR-
908             # HANDEN SEIN MUSS (D.H. s2b = loc)
909          IFSALT="$IFS"; IFS="$IFS:"
910          if [[ "$s2a" = in  &&  ! ( $do_remote = true  &&  ( "$s2b" = loc  ||  "$s2b" = locopt ) ) ]]
911          then
912             found=false
913             for  actual  in  $input_list
914             do
915                for  formal  in  $s3
916                do
917                   [[ $actual = $formal  ||  "$formal" = "-" ]]  &&  found=true
918                done
919             done
920             if [[ $found = true ]]
921             then
922                (( iin = iin + 1 ))
923                localin[$iin]=$s1; transin[$iin]=$s2b; actionin[$iin]=$s2c;
924                typein[$iin]=$s3; pathin[$iin]=$s4; endin[$iin]=$s5;
925                extin[$iin]=$s6
926             fi
927          elif [[ "$s2a" = out  &&  ! ( $do_remote = true  &&  "$s2b" = loc ) ]]
928          then
929             found=false
930             for  actual  in  $output_list
931             do
932                for  formal  in  $s3 
933                do
934                   [[ $actual = $formal  ||  "$formal" = "-"  ]]  &&  found=true
935                done
936             done
937             if [[ $found = true ]]
938             then
939                (( iout = iout + 1 ))
940                localout[$iout]=$s1; actionout[$iout]=$s2c; typeout[$iout]=$s3;
941                pathout[$iout]=$s4; endout[$iout]=$s5; extout[$iout]=$s6
942             fi
943          elif [[ "$s2a" != in  &&  "$s2a" != out ]]
944          then
945             printf "\n  +++ I/O-attribute in configuration file $config_file has the invalid"
946             printf "\n      value \"$s2\". Only \"in\" and \"out\" are allowed!"
947             locat=connect; exit
948          fi
949          IFS="$IFSALT"
950       fi
951    done < $config_file
952
953 else
954
955
956       # INTERPRETATION DER KONFIGURATIONSDATEI MITTELS FORTRAN 90 - PROGRAMM
957    [[ $silent = false ]]  &&  printf "..."
958    export  cond1 cond2 config_file do_remote do_trace input_list localhost output_list
959    export  interpreted_config_file=.icf.$RANDOM
960
961
[69]962
963       # ENVIRONMENT-VARIABLEN FUER INTERPRET_CONFIG UEBER NAMELIST_DATEI ZUR
964       # VERFUEGUNG STELLEN
965    cat  >  .mrun_environment  <<  %%END%%
966 &mrun_environment  cond1 = '$cond1', cond2 = '$cond2',
967                    config_file = '$config_file', do_remote = '$do_remote',
968                    do_trace = '$do_trace', host = '$host',
969                    input_list = '$input_list', icf = '$interpreted_config_file',
970                    localhost = '$localhost', output_list = '$output_list' /
971
972%%END%%
973
974       # WERTE VON MRUN-OPTIONEN SICHERN UND DAMIT GEGEBENENFALLS SPAETER DIE
975       # IN DER KONFIGURAIONSDATEI ANGEGEBENEN WERTE UEBERSTEUERN
976    mrun_memory=$memory
[127]977    mrun_group_number=$group_number
[69]978    mrun_cpumax=$cpumax
979    mrun_numprocs=$numprocs
980
[251]981    if [[ $localhost_realname = "sx-fep" ]]
[66]982    then
[251]983       /home/COAR/NC/raasch/pub/interpret_config_necriam.x
[66]984    else
[503]985
986       if [[ "$host" != $localhost ]]
987       then
988
989             # REMOTE JOB FROM LOCAL HOST: JUST TAKE THE FIRST EXECUTABLE FOUND
990          interpret_config_executable=`ls -1 ${PALM_BIN}/interpret_config*.x 2>/dev/null`
991          if [[ $? != 0 ]]
992          then
993             printf "\n\n  +++ no interpret_config found"
994             printf "\n      run \"mbuild -u -h ...\" to generate utilities for this host"
995             locat=interpret_config; exit
996          fi
997          interpret_config_executable=`echo $interpret_config_executable | cut -d" " -f1`
998          $interpret_config_executable
999
1000       else
1001
1002             # CHECK, IF THERE IS AN EXECUTABLE FOR THE BLOCK
1003          if [[ ! -f ${PALM_BIN}/interpret_config${block}.x ]]
1004          then
1005             printf "\n\n  +++ no interpret_config found for given block \"$cond1 $cond2\""
1006             printf "\n      run \"mbuild -u -h ...\" to generate utilities for this block"
1007             locat=interpret_config; exit
1008          else
1009             interpret_config${block}.x
1010          fi
1011
1012       fi
[66]1013    fi
[71]1014    rm .mrun_environment
[1]1015
[71]1016
[1]1017       # AUSFUEHRUNG DER GENERIERTEN SHELL-KOMMANDOS IN DIESER SHELL
1018    chmod  u+x  $interpreted_config_file
1019    export PATH=$PATH:.
1020    . $interpreted_config_file
[71]1021    rm  $interpreted_config_file
[1]1022
[71]1023
[69]1024       # OPTIONSWERTE UEBERSTEUERN KONFIGURATIONSDATEI
[71]1025    [[ $mrun_memory     != 0  ]]  &&  memory=$mrun_memory
[127]1026    [[ "$mrun_group_number" != "none" ]]  &&  group_number=$mrun_group_number
[71]1027    [[ $mrun_cpumax     != 0  ]]  &&  cpumax=$mrun_cpumax
1028    [[ "$mrun_numprocs" != "" ]]  &&  numprocs=$mrun_numprocs
[69]1029
[1]1030 fi
1031
1032
1033    # QUELLTEXTVERZEICHNIS AUF LOKALER MASCHINE AUS KONFIGURATIONSDATEI
1034    # BESTIMMEN (WUERDE SONST EVTL. DAS VERZEICHNIS DES JEWEILS UNTER -h
1035    # ANGEGEBENEN REMOTE-RECHNERS SEIN)
1036    # BEI BATCH-JOBS SIND DIE ZU UEBERSETZENDEN PROGRAMMTEILE SCHON KOMPLETT
1037 if [[ "$SOURCES_COMPLETE" = "" ]]
1038 then
1039
1040       # ZUERST PRUEFEN, OB EIN GLOBALER QUELLTEXTPFAD FUER ALLE RECHNER
1041       # VEREINBART WURDE
1042    source_path=""
1043    line=""
1044    grep "%source_path" $config_file  >  tmp_mrun
1045    while read line
1046    do
1047       if [[ "$line" != ""  &&  $(echo $line | cut -c1) != "#" ]]
1048       then
1049          if [[ "$(echo $line | cut -d" " -f3)" = "" ]]
1050          then
1051             global_source_path=`echo $line | cut -d" " -f2`
1052          fi
1053       fi
1054    done  <  tmp_mrun
1055
1056    line=""
1057    found=false
1058    grep  " $localhost" $config_file | grep "%source_path"  >  tmp_mrun
1059    while read line
1060    do
1061       if [[ "$line" != ""  &&  $(echo $line | cut -c1) != "#" ]]
1062       then
1063          if [[ $found = true ]]
1064          then
1065             printf "\n\n  +++ more than one source path found in configuration file"
1066             printf "\n      for local host \"$localhost\" "
1067             locat=source_path; exit
1068          fi
1069          source_path=`echo $line | cut -d" " -f2`
1070          found=true
1071       fi
1072    done  <  tmp_mrun
1073    rm  tmp_mrun
1074
1075    if [[ "$source_path" = "" ]]
1076    then
1077       if [[ "$global_source_path" != "" ]]
1078       then
1079          source_path=$global_source_path
1080       else
1081          printf "\n\n  +++ no source path found in configuration file"
1082          printf "\n      for local host \"$localhost\" "
1083          locat=source_path; exit
1084       fi
1085    fi
1086    eval source_path=$source_path
1087
1088    if [[ ! -d $source_path ]]
1089    then
1090       printf "\n\n  +++ source path \"$source_path\" on local host"
1091       printf "\n      \"$localhost\" does not exist"
1092       locat=source_path; exit
1093    fi
1094
1095 fi
1096
1097
[78]1098    # GLOBALE REVISIONSNUMMER ERMITTELN (FORTSETZUNGSLAEUFEN WIRD DIESE
1099    # DURCH OPTION -G MITGETEILT)
1100 if [[ "$global_revision" = "" ]]
1101 then
1102    global_revision=`svnversion $source_path  2>/dev/null`
1103    global_revision="Rev: $global_revision"
1104 fi
[1]1105
[78]1106
[1]1107    # NOCHMAL PRUEFEN, OB AUF REMOTE-MASCHINE GERECHNET WERDEN SOLL
1108    # (HOST KANN IN KONFIGURATIONSDATEI ANDERS FESTGELEGT WORDEN SEIN)
1109    # WERT VON do_remote WIRD FUER DATEIVERBINDUNGEN BENOETIGT.
1110    # WENN AUF REMOTE-MASCHINE GERECHNET WIRD, IST GLEICHZEITIG KLAR,
1111    # DASS EIN BATCH-JOB GESTARTET WERDEN MUSS
1112 if [[ -n $host  &&  "$host" != $localhost ]]
1113 then
1114    do_batch=true
1115    do_remote=true
1116    case  $host  in
[440]1117        (ibm|ibmb|ibmh|ibms|ibmy|lckyoto|lcsgib|lcsgih|lctit|nech|necriam|unics|lcxt4|lcxt5m|lck)  true;;
[1]1118        (*)  printf "\n"
[83]1119             printf "\n  +++ sorry: execution of batch jobs on remote host \"$host\""
1120             printf "\n      is not available"
[1]1121             locat=nqs; (( iec = 0 )); exit;;
1122    esac
1123 else
1124    host=$localhost
1125 fi
1126
1127
1128    # PRUEFUNG EINIGER PROZESSORZAHLANGABEN BEI RECHNUNGEN AUF PARALLELRECHNERN
1129 if [[ "$cond1" = parallel  ||  "$cond2" = parallel ]]
1130 then
1131
1132       # PRUEFEN, OB DIE ANZAHL DER ZU VERWENDENDEN PES ANGEGEBEN WURDE
1133    if [[ ! -n $numprocs ]]
1134    then
1135       printf "\n"
1136       printf "\n  +++ option \"-K parallel\" requires additional specification"
1137       printf "\n      of the number of processors to be used by"
1138       printf "\n      mrun-option \"-X\" or by environment-variable"
1139       printf "\n      \"numprocs\" in the configuration file"
1140       locat=numprocs; (( iec = 0 )); exit
1141    fi
1142
1143       # PRUEFEN, OB DIE PROZESSORANZAHL PRO KNOTEN ANGEGEBEN WURDE (GGF.
1144       # DEFAULT-WERT SETZEN) UND OB SIE EIN GANZZAHLIGER TEILER DER
1145       # GESAMTPROZESSORANZAHL IST
[251]1146    if [[ $host = nech  ||  $host = necriam  ||  $host = ibmh  ||  $host = ibmb  ||  $host = ibms ]]
[1]1147    then
1148       [[ "$tasks_per_node" = "" ]]  &&  tasks_per_node=6
1149       (( ival = $tasks_per_node ))
1150       (( pes = numprocs ))
1151#       if [[ $(echo $package_list | grep -c dvrp_graphics+1PE) = 1 ]]
1152#       then
1153#          (( pes = pes - 1 ))
1154#       fi
1155       (( ii = pes / ival ))
1156       if (( pes - ii * ival > 0 ))
1157       then
1158          printf "\n"
1159          printf "\n  +++ tasks per node (option \"-T\") must be an integral"
1160          printf "\n      divisor of the total number of processors (option \"-X\")"
1161          printf "\n      values of this mrun-call: \"-T $tasks_per_node\" \"-X $numprocs\""
1162          locat=tasks_per_node; (( iec = 0 )); exit
1163       fi
1164    fi
1165
1166       # IBMY HAT NUR EINEN KNOTEN
1167    if [[ $host = ibmy ]]
1168    then
1169       if [[ "$tasks_per_node" != ""  &&  "$tasks_per_node" != "$numprocs" ]]
1170       then
1171          printf "\n"
1172          printf "\n  +++ on ibmy, tasks per node (option \"-T\") must be equal to the"
1173          printf "\n      total number of processors (option \"-X\")"
1174          printf "\n      values of this mrun-call: \"-T $tasks_per_node\" \"-X $numprocs\""
1175          locat=tasks_per_node; (( iec = 0 )); exit
1176       fi
1177    fi
1178
1179       # FALLS OPENMP PARALLELISIERUNG VERWENDET WERDEN SOLL, ANZAHL VON THREADS
1180       # SETZEN UND ZAHL DER TASKS PRO KNOTEN AUF 1 SETZEN
1181    if [[ $use_openmp = true ]]
1182    then
1183       threads_per_task=$tasks_per_node
1184       tasks_per_node=1
1185    fi
[377]1186
1187       # SETTINGS FOR SUBJOB-COMMAND
1188    if [[ $(echo $host | cut -c1-5) = lcsgi ]]
1189    then
1190       (( tp1 = tasks_per_node * threads_per_task ))
1191       TOPT="-T $tp1"
1192    else
1193       TOPT="-T $tasks_per_node"
1194    fi
[1]1195    OOPT="-O $threads_per_task"
1196
1197       # GESAMTZAHL DER KNOTEN BESTIMMEN
1198    if [[ "$tasks_per_node" != "" ]]
1199    then
1200       (( nodes = numprocs / ( tasks_per_node * threads_per_task ) ))
1201    fi
1202
1203       # PRUEFEN, OB NODE USAGE EINEN ERLAUBTEN WERT HAT BZW. DEN DEFAULT
1204       # SETZEN
1205    if [[ $node_usage = default ]]
1206    then
1207       if [[ $host = ibms ]]
1208       then
1209          node_usage=shared
[118]1210       elif [[ $host = lctit ]]
1211       then
[265]1212          node_usage=RAM64GB
[181]1213       elif [[ $(echo $host | cut -c1-5) = lcsgi ]]
1214       then
1215          node_usage=singlejob
[1]1216       else
1217          node_usage=not_shared
1218       fi
1219    fi
[181]1220
[265]1221    if [[ $node_usage != shared  &&  $node_usage != not_shared  &&  $node_usage != singlejob  &&  "$(echo $node_usage | cut -c1-3)" != "sla"  &&  $node_usage != RAM64GB  ]]
[1]1222    then
1223       printf "\n"
1224       printf "\n  +++ node usage (option \"-n\") is only allowed to be set"
1225       printf "\n      \"shared\" or \"not_shared\""
1226       locat=tasks_per_node; (( iec = 0 )); exit
1227    fi
1228
1229 fi
1230
1231    # PRUEFEN, OB HOSTFILE EXISTIERT
1232 if [[ -n $hostfile ]]
1233 then
1234    if [[ ! -f $hostfile ]]
1235    then
1236       printf "\n"
1237       printf "\n  +++ hostfile \"$hostfile\" does not exist"
1238       locat=hostfile; exit
1239    fi
1240 fi
1241
1242    # PRUEFEN, OB RHOSTS DATEI EXISTIERT. GEGEBENENFALLS ANLEGEN BZW. ERWEITERN
1243 if [[ $host = ibmy  &&  $do_remote = false ]]
1244 then
1245    if [[ ! -f $HOME/.rhosts ]]
1246    then
1247       echo  "gfdl5.yonsei.ac.kr"  >  $HOME/.rhosts
1248       printf "\n\n  *** file:"
1249       printf "\n           $HOME/.rhosts"
1250       printf "\n      was created\n"
1251    fi
1252    if [[ $(grep -c gfdl5.yonsei.ac.kr $HOME/.rhosts) = 0 ]]
1253    then
1254       echo  "gfdl5.yonsei.ac.kr"  >>  $HOME/.rhosts
1255       printf "\n\n  *** file:"
1256       printf "\n           $HOME/.rhosts"
1257       printf "\n      was extended by the name of the current host\n"
1258    fi
1259 fi
1260
1261
1262
1263    # FALLS NICHT VORGEGEBEN, DEFAULT-QUEUE AUF DER ZIELMASCHINE FESTLEGEN
1264 if [[ $queue = none ]]
1265 then
1266    case  $host  in
1267        (ibmb)       if [[ $node_usage = shared ]]
1268                     then
1269                        queue=cshare
1270                     else
1271                        queue=csolo
1272                     fi;;
[312]1273        (ibmh)       queue=no_class;;
[1]1274        (ibmy)       queue=parallel;;
[440]1275        (lckyoto)    queue=ph;;
[191]1276        (lcsgib)     queue=bigq;;
1277        (lcsgih)     queue=bigq;;
[265]1278        (lctit)      queue=RAM64GB;;
[1]1279        (nech)       queue=none;;
[253]1280        (necriam)    queue=SP;;
[1]1281        (unics)      queue=unics;;
1282    esac
1283 fi
1284
1285
1286    # VOLLSTAENDIGE DATEINAMEN DER INPUT-FILES BILDEN,
1287    # INPUT-DATEIEN AUF VORHANDENSEIN PRUEFEN UND EVTL. HOECHSTE ZYKLUSNUMMER
1288    # ERMITTELN
1289 (( i = 0 ))
1290 while (( i < iin ))
1291 do
1292    (( i = i + 1 ))
1293    (( maxcycle = 0 ))
1294
1295       # NAMENSBILDUNG (EVTL. IST FESTER DATEINAME VORGEGEBEN)
1296    if [[ "${actionin[$i]}" = di ]]
1297    then
1298       remotepathin[$i]=${pathin[$i]}/${endin[$i]}  # REMOTE-PFAD ERST AUF
1299                                                    # REM-MASCHINE AUSWERTEN
1300       eval filename=${pathin[$i]}/${endin[$i]}
1301    else
1302       remotepathin[$i]=${pathin[$i]}/${afname}${endin[$i]}  # REMOTE-PFAD ERST AUF
1303                                                             # REM-MASCHINE AUSWERTEN
1304       eval filename=${pathin[$i]}/${afname}${endin[$i]}
1305    fi
1306
1307       # PRUEFEN AUF VORHANDENSEIN
1308    if [[ $(ls $filename* 2>&1 | grep -c "not found") = 1  || \
1309          $(ls $filename* 2>&1 | grep -c "No such file") = 1  || \
1310          $(ls $filename* 2>&1 | grep -c "does not exist") = 1 ]]
1311    then
1312          # DATEIEN MIT EXTENSION (Z.B. NC) MUESSEN NICHT ZWINGEND VORHANDEN
1313          # SEIN, DESHALB IN SOLCHEN FAELLEN KEIN ABBRUCH. DIES IST NUR EINE
1314          # VORUEBERGEHENDE LOESUNG (OKT 05). NICHT ZWINGEND BENOETIGTE
1315          # EINGABEDATEIEN SOLLTEN EINE SPEZIELLE OPTION IN DER DATEI-
1316          # VERBINDUNGSANWEISUNG BEKOMMEN (Z.B. inopt?)
1317       if [[ "${transin[$i]}" != "locopt" ]]
1318       then
1319          printf "\n\n  +++ INPUT-file: "
1320          if [[ "${extin[$i]}" = "" ]]
1321          then
1322             printf "\n           $filename"
1323          else
1324             printf "\n           $filename.${extin[$i]}"
1325          fi
1326          printf "\n      does not exist\n"
1327          locat=input; exit
1328       else
1329          transin[$i]="unavailable"
1330       fi
1331    else
1332
1333          # ZYKLUSNUMMER FESTSTELLEN
1334       ls -1 -d $filename    >   filelist  2>/dev/null
1335       ls -1 -d $filename.*  >>  filelist  2>/dev/null
1336       while  read zeile
1337       do
1338          cycle=$(print $zeile | cut -f2 -d".")
1339          if [[ "$cycle" = "$zeile" ]]
1340          then
1341             (( icycle = 0 ))
1342          elif [[ "$cycle" = "${extin[$i]}" ]]
1343          then
1344             (( icycle = 0 ))
1345          else
1346             (( icycle = $cycle ))
1347          fi
1348          if (( icycle > maxcycle ))
1349          then
1350             (( maxcycle = icycle ))
1351             file_to_be_used=$zeile
1352          fi
1353       done <filelist
1354       rm filelist
1355
1356          # EVTL. ZYKLUSNUMMER AN DATEINAMEN ANFUEGEN
1357       if (( maxcycle > 0 ))
1358       then
1359          if [[ "${extin[$i]}" != " "  &&   "${extin[$i]}" != "" ]]
1360          then
1361             filename=${filename}.$maxcycle.${extin[$i]}
1362          else
1363             filename=${filename}.$maxcycle
1364          fi
1365       else
1366          if [[ "${extin[$i]}" != " "  &&   "${extin[$i]}" != "" ]]
1367          then
1368             filename=${filename}.${extin[$i]}
1369          fi
1370       fi
1371       
1372          # DATEINAMEN OHNE PFAD ABER MIT ZYKLUSNUMMER ABSPEICHERN,
1373          # DA SPAETER BEI RUECKSPEICHERN VOM ARCHIVSYSTEM EVTL. BENOETIGT
1374       absnamein[$i]=$filename
1375       if (( maxcycle > 0 ))
1376       then
1377          if [[ "${actionin[$i]}" = di ]]
1378          then
1379             frelin[$i]=${endin[$i]}.$maxcycle
1380          else
1381             frelin[$i]=${afname}${endin[$i]}.$maxcycle
1382          fi
1383       else
1384          if [[ "${actionin[$i]}" = di ]]
1385          then
1386             frelin[$i]=${endin[$i]}
1387          else
1388             frelin[$i]=${afname}${endin[$i]}
1389          fi
1390       fi
1391
1392    fi
1393 done
1394       
1395
1396    # VOLLSTAENDIGE DATEINAMEN (OHNE $ ODER ~) DER OUTPUT-FILES BILDEN,
1397    # OUTPUT-DATEIEN AUF VORHANDENSEIN PRUEFEN UND EVTL. HOECHSTE ZYKLUSNUMMER
1398    # ERMITTELN ODER, FALLS NICHT VORHANDEN, PRUEFEN, OB SIE SICH ANLEGEN LASSEN
1399    # DIESE AKTIONEN FINDEN NICHT STATT, WENN PROGRAMM AUF REMOTE-MASCHINE
1400    # RECHNET UND DATEI ANSCHLIESSEND TRANSFERIERT WERDEN SOLL!
1401 (( i = 0 ))
1402 while (( i < iout ))
1403 do
1404    (( i = i + 1 ))
1405    if [[ ! ( $fromhost != $localhost  &&  ( "${actionout[$i]}" = tr || "${actionout[$i]}" = tra || "${actionout[$i]}" = trpe ) ) ]]
1406    then
[260]1407       if [[ "${actionout[$i]}" = tr ]]
[1]1408       then
1409          actionout[$i]=""
[260]1410       elif [[ "${actionout[$i]}" = trpe ]]
1411       then
1412          actionout[$i]=pe
[1]1413       elif [[ "${actionout[$i]}" = tra ]]
1414       then
1415          actionout[$i]=a
1416       fi
1417       (( maxcycle = 0 ))
1418       eval filename=${pathout[$i]}/${fname}${endout[$i]}
1419       eval catalogname=${pathout[$i]}
1420       if [[ $(ls $filename* 2>&1 | grep -c "not found") = 1  || \
1421             $(ls $filename* 2>&1 | grep -c "No such file") = 1  || \
1422             $(ls $filename* 2>&1 | grep -c "does not exist") = 1 ]]
1423       then
1424     
1425             # OUTPUT-DATEI NICHT VORHANDEN. PRUEFEN, OB ANLEGEN MOEGLICH.
1426          if  cat /dev/null > $filename 
1427          then
1428             rm  $filename
1429          else
1430
1431                # PRUEFEN, OB KATALOG VORHANDEN UND EVTL. DIESEN ANLEGEN
1432             if [[ ! -d $catalogname ]]
1433             then
1434                if  mkdir -p  $catalogname
1435                then
1436                   printf "\n\n  *** directory:"
1437                   printf "\n           $catalogname"
1438                   printf "\n      was created\n"
1439                else
1440                   printf "\n\n  +++ OUTPUT-file:"
1441                   printf "\n           $filename"
1442                   printf "\n      cannot be created, because directory does not exist"
1443                   printf "\n      and cannot be created either"
1444                   printf "\n"
1445                   locat=output  ; exit
1446                fi 2>/dev/null
1447             else
1448                printf "\n\n  +++ OUTPUT-file:"
1449                printf "\n           $filename"
1450                printf "\n      cannot be created, although directory exists"
1451                printf "\n"
1452                locat=output  ; exit
1453             fi
1454          fi 2>/dev/null
1455       else
1456
1457             # ZYKLUSNUMMER FESTSTELLEN
1458          ls -1 -d $filename    >   filelist  2>/dev/null
1459          ls -1 -d $filename.*  >>  filelist  2>/dev/null
1460          while  read zeile
1461          do
1462             cycle=$(print $zeile | cut -f2 -d".")
1463             if [[ "$cycle" = "$zeile"  ||  "$cycle" = ${extout[$i]} ]]
1464             then
1465                (( icycle = 1 ))
1466             else
1467                (( icycle = $cycle + 1 ))
1468             fi
1469             if (( icycle > maxcycle ))
1470             then
1471                (( maxcycle = icycle ))
1472             fi
1473          done <filelist
1474          rm filelist
1475       fi
1476
1477          # EVTL. ZYKLUSNUMMER AN DATEINAMEN ANFUEGEN UND PRUEFEN, OB SICH
1478          # DATEI AUCH WIRKLICH ANLEGEN LAESST. IM APPEND-FALL MUSS AN DEN
1479          # HOECHSTEN VORHANDENEN ZYKLUS-ANGEHAENGT WERDEN. ANLAGEPRUEFUNG
1480          # IST DANN NATUERLICH NICHT ZULAESSIG BZW. MOEGLICH
1481       if [[ "${actionout[$i]}" != a ]]
1482       then
1483          if (( maxcycle > 0 ))
1484          then
1485             filename=${filename}.$maxcycle
1486             if  cat /dev/null > $filename 
1487             then
1488                rm  $filename
1489             else
1490                printf "\n  +++ OUTPUT-file:"
1491                printf "\n           $filename"
1492                printf "\n      cannot be created"
1493                locat=output  ; exit
1494             fi
1495          fi
1496       else
1497          (( maxcycle = maxcycle - 1 ))
1498          if (( maxcycle > 0 ))
1499          then
1500             filename=${filename}.$maxcycle
1501          fi
1502       fi
1503       
1504          # DATEINAMEN OHNE PFAD ABER MIT ZYKLUSNUMMER ABSPEICHERN,
1505          # DA SPAETER BEI ABLAGE AUF ARCHIVSYSTEM BZW. FUER
1506          # DATEI OUTPUT_FILE_CONNECTIONS EVTL. BENOETIGT
1507       pathout[$i]=$filename
1508       if (( maxcycle > 0 ))
1509       then
1510          frelout[$i]=${fname}${endout[$i]}.$maxcycle
1511       else
1512          frelout[$i]=${fname}${endout[$i]}
1513       fi
1514
1515    fi
1516 done
1517
1518
[260]1519     # DAS DVR-PAKET ERFORDERT EINE ENTSPRECHENDE BIBLIOTHEK
[83]1520 if [[ $(echo $package_list | grep -c dvrp_graphics) != 0 ]]
1521 then
[260]1522    if [[ "$dvr_inc" = "" ]]
[83]1523    then
[260]1524       printf "\n\n  +++ no value for \"dvr_inc\" given in configuration file"
[83]1525       printf "\n      This is required for the dvrp_graphics package.\n"
[260]1526       locat=dvr; exit
[83]1527    fi
[260]1528    if [[ "$dvr_lib" = "" ]]
[83]1529    then
[260]1530       printf "\n\n  +++ no value for \"dvr_lib\" given in configuration file"
[83]1531       printf "\n      This is required for the dvrp_graphics package.\n"
[260]1532       locat=dvr; exit
[83]1533    fi
1534 fi
1535
1536
[1]1537     # PRUEFEN, OB ENTWEDER HAUPTPROGRAMM ODER NUR EIN AUSFUEHRBARES
1538     # PROGRAMM VEREINBART WURDE (IN DIESEM FALL BRAUCHT IM WEITEREN NICHT
1539     # UEBERSETZT ZU WERDEN)
1540 if [[ "$mainprog" = ""  &&  "$executable" = "" ]]
1541 then
1542    printf "\n  +++ neither main program nor executable defined"
1543    locat=source; exit
1544 elif [[ "$mainprog" != ""  &&  "$executable" != "" ]]
1545 then
1546    printf "\n  +++ main program as well as executable defined"
1547    locat=source; exit
1548 elif [[ "$mainprog" = ""  &&  "$executable" != "" ]]
1549 then
1550    do_compile=false
1551 fi
1552
1553
[191]1554    # SOURCE-VERZEICHNIS ZUM AUFSAMMELN DER ZU UEBERSETZENDEN PROGRAMMTEILE
1555    # ERZEUGEN. HIERHIN WERDEN SPAETER IM FALL VON BATCH-JOBS AUCH DAS MRUN-
1556    # SCRIPTS SOWIE DIE KONFIGURATIONSDATEI KOPIERT
[193]1557 if [[ $restart_run != true  &&  "$SOURCES_COMPLETE" = "" ]]
[191]1558 then
1559    rm -rf  SOURCES_FOR_RUN_$fname
1560    mkdir   SOURCES_FOR_RUN_$fname
1561 fi
1562
1563
[1]1564    # ALLE ZU UEBERSETZENDEN PROGRAMMTEILE ZUSAMMENSAMMELN
1565    # BEI BATCH-JOBS IST DIES NICHT NOETIG, WEIL DIE PROGRAMMTEILE BEREITS DURCH
1566    # DEN MRUN-AUFRUF ERMITTELT SIND, DER DEN BATCH-JOB GENERIERT HAT, UND
1567    # IM VERZEICHNIS SOURCES_FOR_RUN_... ABGELEGT SIND
1568 if [[ $do_compile = true  &&  "$SOURCES_COMPLETE" = "" ]]
1569 then
1570
[5]1571    [[ "$source_list" = LM ]]  &&  source_list=LOCALLY_MODIFIED
1572    [[ "$source_list" = WP ]]  &&  source_list=WRITE_PERMIT
[1]1573
1574
1575       # EVTL. ZU UEBERSETZENDE PROGRAMMTEILE DADURCH BESTIMMEN, DASS GEPRUEFT
1576       # WIRD, WELCHE DATEIEN WRITE-PERMIT BESITZEN (DATEIEN SOLLTEN DESHALB
1577       # UNTER RCS-KONTROLLE STEHEN). MIT DER VARIABLEN EXCLUDE KOENNEN
1578       # BESTIMMTE DATEIEN GRUNDSAETZLICH VON DER UEBERSETZUNG AUSGESCHLOSSEN
1579       # WERDEN. DIES IST NUR BEI MANUELLEM START VON MRUN DURCH DEN BENUTZER
1580       # MOEGLICH, DA BEI AUTOMATISCHEN RESTARTS TEST DURCH DIE TATSAECHLICH
1581       # ZU UBERSETZENDEN DATEIEN ERSETZT IST.
1582       # ALLE ERMITTELTEN DATEIEN WERDEN IM VERZEICHNIS SOURCES_FOR_RUN_...
1583       # GESAMMELT
[5]1584    if [[ "$source_list" = WRITE_PERMIT ]]
[1]1585    then
1586
1587       source_list=""
1588       cd  $source_path
1589
1590
1591          # ALLE MOEGLICHEN QUELLCODEDATEIEN AUFLISTEN
1592       Names=$(ls -1 *.f90 2>&1)
1593       [[ $(echo $Names | grep -c '*.f90') = 0 ]]  &&  Filenames="$Names"
1594       Names=$(ls -1 *.F90 2>&1)
1595       [[ $(echo $Names | grep -c '*.F90') = 0 ]]  &&  Filenames="$Filenames $Names"
1596       Names=$(ls -1 *.F 2>&1)
1597       [[ $(echo $Names | grep -c '*.F') = 0   ]]  &&  Filenames="$Filenames $Names"
1598       Names=$(ls -1 *.f 2>&1)
1599       [[ $(echo $Names | grep -c '*.f') = 0   ]]  &&  Filenames="$Filenames $Names"
1600       Names=$(ls -1 *.c 2>&1)
1601       [[ $(echo $Names | grep -c '*.c') = 0   ]]  &&  Filenames="$Filenames $Names"
1602
1603
1604          # DATEIEN MIT WRITE-PERMIT NACH SOURCES_FOR_RUN_... KOPIEREN
1605       for  dateiname  in  $Filenames
1606       do
1607          if [[ -w $dateiname ]]
1608          then
1609             if [[ "$exclude" = ""  ||  $(echo $exclude | grep -c $dateiname) = 0 ]]
1610             then
1611                cp  $dateiname  $working_directory/SOURCES_FOR_RUN_$fname
1612                source_list=$source_list"$dateiname "
1613             fi
1614          fi
1615       done
1616
1617       cd -  > /dev/null
1618
1619
[5]1620    elif [[ "$source_list" = LOCALLY_MODIFIED ]]
1621    then
1622
1623          # MODIFIZIERTE DATEIEN DER SVN-ARBEITSKOPIE BESTIMMEN
1624       source_list=""
1625       cd  $source_path
1626
1627
1628          # PRUEFEN, OB VERZEICHNIS UEBERHAUPT UNTER SVN-KONTROLLE STEHT
1629       if [[ ! -d .svn ]]
1630       then
1631          printf "\n\n  +++ source directory"
1632          printf "\n         \"$source_path\" "
1633          printf "\n         is not under control of \"subversion\"."
[306]1634          printf "\n         Please do not use mrun-option \"-s LOCALLY_MODIFIED\"\n"
[5]1635       fi
1636
1637
1638          # ALLE MODIFIZIERTEN QUELLCODEDATEIEN AUFLISTEN
1639       Filenames=""
[69]1640       svn status  >  tmp_mrun
1641       while  read line
[5]1642       do
1643          firstc=`echo $line | cut -c1`
1644          if [[ $firstc = M  ||  $firstc = "?" ]]
1645          then
1646             Name=`echo "$line" | cut -c8-`
1647             extension=`echo $Name | cut -d. -f2`
1648             if [[ "$extension" = f90 || "$extension" = F90 || "$extension" = f || "$extension" = F || "$extension" = c ]]
1649             then
1650                Filenames="$Filenames "$Name
1651             fi
1652          fi
[69]1653       done < tmp_mrun
[5]1654
1655
1656          # DATEIEN NACH SOURCES_FOR_RUN_... KOPIEREN
1657       for  dateiname  in  $Filenames
1658       do
1659          cp  $dateiname  $working_directory/SOURCES_FOR_RUN_$fname
1660          source_list=$source_list"$dateiname "
1661       done
1662
1663       cd -  > /dev/null
1664
1665
[1]1666       # MITTELS OPTION -s ANGEGEBENE DATEIEN NACH SOURCES_FOR_RUN_... KOPIEREN
1667       # BEI AUTOMATISCHEN FORTSETZUNGSLAEUFEN SIND DORT SCHON ALLE DATEIEN
1668       # VORHANDEN
[5]1669    elif [[ "$source_list" != ""  &&  $restart_run != true ]]
[1]1670    then
1671
1672       cd  $source_path
1673
1674       for  filename  in  $source_list
1675       do
1676
1677             # QUELLTEXT-DATEI DARF KEINE PFADE BEINHALTEN
1678          if [[ $(print $filename | grep -c "/") != 0 ]]
1679          then
1680             printf "\n  +++ source code file:  $filename"
1681             printf "\n      must not contain (\"/\") "
1682             locat=source; exit
1683          fi
1684
1685          if [[ ! -f $filename ]]
1686          then
1687             printf "\n  +++ source code file:  $filename"
1688             printf "\n      does not exist"
1689             locat=source; exit
1690          else
1691             cp  $filename  $working_directory/SOURCES_FOR_RUN_$fname
1692          fi
1693
1694       done
1695
1696       cd -  > /dev/null
1697
1698    fi
1699
1700
1701       # PRUEFEN, OB ENTWEDER HAUPTPROGRAMM VORHANDEN UND ES EVTL. IN DER
1702       # LISTE DER ZU UEBERSETZENDEN PROGRAMMTEILE MIT ENTHALTEN IST (WENN
1703       # NICHT, WIRD ES DIESER LISTE HINZUGEFUEGT)
[5]1704    if [[ $restart_run != true ]]
[1]1705    then
1706
1707       if [[ ! -f "$source_path/$mainprog" ]]
1708       then
1709          printf "\n\n  +++ main program:  $mainprog"
1710          printf "\n      does not exist in source directory"
1711          printf "\n      \"$source_path\"\n"
1712          locat=source; exit
1713       else
1714          if [[ $(echo $source_list | grep -c $mainprog) = 0 ]]
1715          then
1716             cp  $source_path/$mainprog  SOURCES_FOR_RUN_$fname
1717             source_list=${mainprog}" $source_list"
1718          fi
1719       fi
1720    fi
1721
1722
[211]1723       # MAKEFILE AUF VORHANDENSEIN PRUEFEN UND KOPIEREN
1724       # BEI RESTART-LAEUFEN LIEGT ES SCHON IM VERZEICHNIS SOURCES_FOR_RUN...
1725    if [[ "$restart_run" != true ]]
1726    then
1727       [[ "$makefile" = "" ]]  &&  makefile=$source_path/Makefile
1728       if [[ ! -f $makefile ]]
1729       then
1730          printf "\n  +++ file \"$makefile\" does not exist"
1731          locat=make; exit
1732       else
1733          cp  $makefile  SOURCES_FOR_RUN_$fname/Makefile
1734       fi
1735    fi
1736
1737
[1]1738       # DATEIEN AUS ZUSAETZLICHEM QUELLVERZEICHNIS HINZUFUEGEN
[5]1739    if [[ $restart_run != true  &&  "$add_source_path" != "" ]]
[1]1740    then
1741
1742          # GIBT ES DAS VERZEICHNIS UEBERHAUPT?
1743       if [[ ! -d $add_source_path ]]
1744       then
1745          printf "\n\n  +++ WARNING: additional source code directory"
1746          printf "\n      \"$add_source_path\" "
1747          printf "\n      does not exist or is not a directory."
1748          printf "\n      No source code will be used from this directory!\n"
1749          add_source_path=""
1750          sleep 3
1751       else
1752
1753          cd $add_source_path
[211]1754          found=false
[1]1755
1756          Names=$(ls -1 *.f90 2>&1)
1757          [[ $(echo $Names | grep -c '*.f90') = 0 ]]  &&  AddFilenames="$Names"
1758          Names=$(ls -1 *.F90 2>&1)
1759          [[ $(echo $Names | grep -c '*.F90') = 0 ]]  &&  AddFilenames="$AddFilenames $Names"
1760          Names=$(ls -1 *.F 2>&1)
1761          [[ $(echo $Names | grep -c '*.F') = 0   ]]  &&  AddFilenames="$AddFilenames $Names"
1762          Names=$(ls -1 *.f 2>&1)
1763          [[ $(echo $Names | grep -c '*.f') = 0   ]]  &&  AddFilenames="$AddFilenames $Names"
1764          Names=$(ls -1 *.c 2>&1)
1765          [[ $(echo $Names | grep -c '*.c') = 0   ]]  &&  AddFilenames="$AddFilenames $Names"
1766
1767          cd -  > /dev/null
1768          cd  SOURCES_FOR_RUN_$fname
1769
[211]1770             # COPY MAKEFILE IF EXISTING
1771          if [[ -f $add_source_path/Makefile ]]
1772          then
1773             printf "\n\n  *** user Makefile from directory"
1774             printf "\n      \"$add_source_path\" is used \n"
1775             sleep 1
1776             cp  $add_source_path/Makefile  .
1777          fi
1778
[1]1779          for  dateiname  in  $AddFilenames
1780          do
1781             if [[ -f $dateiname ]]
1782             then
1783                printf "\n  +++ source code file \"$dateiname\" found in additional"
1784                printf "\n      source code directory \"$add_source_path\" "
[211]1785                printf "\n      but was also given with option \"-s\" which means that it should be taken"
1786                printf "\n      from directory \"$source_path\"."
[1]1787                locat=source; exit
1788             fi
1789
1790             cp  $add_source_path/$dateiname  .
1791             source_list="$source_list $dateiname"
1792
[211]1793                # CHECK IF FILE IS CONTAINED IN MAKEFILE
1794             if [[ $(grep -c $dateiname Makefile) = 0 ]]
1795             then
1796                printf "\n\n  +++ user file \"$dateiname\" "
1797                printf "\n      is not listed in Makefile \n"
1798                locat=source; exit
1799             else
1800
[1]1801                # Default User-Interface von der Liste entfernen, falls Datei
1802                # ein User-Interface enthaelt
[211]1803#             if [[ $( cat $dateiname | grep -c "END SUBROUTINE user_parin" ) != 0 ]]
1804#             then
1805#                if [[ $dateiname != user_interface.f90  &&  -f user_interface.f90 ]]
1806#                then
1807#                   rm -rf  user_interface.f90
1808#                   source_list=`echo $source_list | sed -e 's/user_interface.f90//'`
1809#                   printf "\n\n  *** default \"user_interface.f90\" removed from the files to be translated"
1810#                   printf "\n      since a user-interface is found in file"
1811#                   printf "\n      \"$add_source_path/$dateiname\" \n"
1812#                   sleep 3
1813#                else
1814                if [[ $found = false ]]
[1]1815                then
[211]1816                   found=true
1817                   printf "\n\n  *** following user file(s) added to the"
1818                   printf " files to be translated:\n      "
[1]1819                fi
[211]1820                printf "$dateiname  "
1821                sleep 0.5
[1]1822             fi
1823          done
[211]1824          [[ $found = true ]]  &&  printf "\n"
[1]1825          cd -  > /dev/null
1826       fi
1827    fi
1828
1829
1830       # ALLE UNTERPROGRAMME, DIE ZU VEREINBARTEN SOFTWAREPAKETEN GEHOEREN,
1831       # DER LISTE DER ZU UEBERSETZENDEN DATEIEN HINZUFUEGEN
[5]1832    if [[ $restart_run != true  &&  -n $package_list ]]
[1]1833    then
1834
1835       cd  $source_path
1836
1837       for  package  in  $package_list
1838       do
1839
1840          [[ $package = "dvrp_graphics+1PE" ]]  &&  package=dvrp_graphics
1841
1842             # ERMITTELE ALLE DATEIEN, DIE ZUM PAKET GEHOEREN
1843             # FEHLERMELDUNGEN WERDEN ABGEFANGEN, DA * AUCH VERZEICHNISSNAMEN
1844             # LIEFERT
1845          package_source_list=`grep "defined( __$package " * 2>/dev/null | cut -f1 -d:`
1846
1847
1848             # FUEGE DIESE DATEIEN DER LISTE DER ZU UEBERSETZENDEN DATEIEN
1849             # HINZU, FALLS SIE NOCH NICHT DAZUGEHOEREN
1850          for  source_list_name  in  $package_source_list
1851          do
1852             if [[ $(echo $source_list | grep -c $source_list_name) = 0 ]]
1853             then
1854
1855                    # NUR DATEIEN MIT GUELTIGEN ENDUNGEN VERWENDEN
1856                ending=`echo $source_list_name | cut -f2 -d.`
1857                if [[ "$ending" = f90  ||  "$ending" = F90  ||  "$ending" = f  ||  "$ending" = F  ||  "$ending" = c ]]
1858                then
1859                   cp  $source_list_name  $working_directory/SOURCES_FOR_RUN_$fname
1860                   source_list="$source_list $source_list_name"
1861                fi
1862             fi
1863          done
1864       done
1865
1866       cd -  > /dev/null
1867    fi
1868
1869
1870       # MAKEFILE AUF VORHANDENSEIN PRUEFEN UND KOPIEREN
1871       # BEI RESTART-LAEUFEN LIEGT ES SCHON IM VERZEICHNIS SOURCES_FOR_RUN...
[211]1872#    if [[ "$restart_run" != true ]]
1873#    then
1874#       [[ "$makefile" = "" ]]  &&  makefile=$source_path/Makefile
1875#       if [[ ! -f $makefile ]]
1876#       then
1877#          printf "\n  +++ file \"$makefile\" does not exist"
1878#          locat=make; exit
1879#       else
1880#          cp  $makefile  SOURCES_FOR_RUN_$fname/Makefile
1881#       fi
1882#    fi
[1]1883
1884 fi  # do_compile=true
1885
1886
1887    # FALLS PROGRAMMTEILE UEBERSETZT WERDEN SOLLEN, FOLGEN JETZT EINIGE
1888    # UEBERPRUEFUNGEN UND DAS SETZEN DER PRAEPROZESSOR-DIREKTIVEN
1889 if [[ $do_compile = true ]]
1890 then
1891
1892       # PRAEPROZESSOR-DIREKTIVEN ZUM SELEKTIVEN AUSWAEHLEN VON CODETEILEN
1893       # ZUSAMMENSETZEN
[83]1894       # DIREKTIVEN ZUM AKTIVIEREN VON RECHNERSPEZIFISCHEM CODE
[1]1895    if [[ $(echo $localhost | cut -c1-3) = ibm ]]
1896    then
[82]1897       cpp_options="${cpp_options},-D__ibm=__ibm"
[1]1898    elif [[ $(echo $localhost | cut -c1-3) = nec ]]
1899    then
[82]1900       cpp_options="$cpp_options -D__nec"
1901    elif [[ $(echo $localhost | cut -c1-2) = lc ]]
1902    then
1903       cpp_options="$cpp_options -D__lc"
[1]1904    else
[82]1905       cpp_options="$cpp_options -D__$localhost"
[1]1906    fi
[83]1907
1908       # DIREKTIVEN DIE DURCH OPTION -K BESTIMMT WERDEN (Z.B. PARALLEL)
[1]1909    if [[ $(echo $localhost | cut -c1-3) = ibm ]]
1910    then
[82]1911       [[ -n $cond1 ]]  &&  cpp_options="${cpp_options},-D__$cond1=__$cond1"
1912       [[ -n $cond2 ]]  &&  cpp_options="${cpp_options},-D__$cond2=__$cond2"
[1]1913    else
[82]1914       [[ -n $cond1 ]]  &&  cpp_options="$cpp_options -D__$cond1"
1915       [[ -n $cond2 ]]  &&  cpp_options="$cpp_options -D__$cond2"
[1]1916    fi
[83]1917
1918       # DIREKTIVEN DIE SOFTWAREPAKETE AKTIVIEREN (OPTION -p)
[1]1919    if [[ -n $package_list ]]
1920    then
1921       for  package  in  $package_list
1922       do
1923          if [[ $(echo $localhost | cut -c1-3) = ibm ]]
1924          then
1925             if [[ $package != "dvrp_graphics+1PE" ]]
1926             then
[82]1927                cpp_options="${cpp_options},-D__$package=__$package"
[1]1928             else
[82]1929                cpp_options="${cpp_options},-D__dvrp_graphics=__dvrp_graphics"
[1]1930                export use_seperate_pe_for_dvrp_output=true
1931             fi
1932          else
1933             if [[ $package != "dvrp_graphics+1PE" ]]
1934             then
[82]1935                cpp_options="$cpp_options -D__$package"
[1]1936             else
[82]1937                cpp_options="$cpp_options -D__dvrp_graphics"
[1]1938                export use_seperate_pe_for_dvrp_output=true
1939             fi
1940          fi
1941       done
1942    fi
[83]1943
1944       # DIREKTIVEN DIE DURCH OPTION -D FESTGELEGT SIND
[1]1945    if [[ -n $cpp_opts ]]
1946    then
1947       for  popts  in  $cpp_opts
1948       do
[82]1949          if [[ $(echo $localhost | cut -c1-3) = ibm ]]
1950          then
1951             cpp_options="${cpp_options},-D__$popts=__$popts"
1952          else
1953             cpp_options="$cpp_options -D__$popts"
1954          fi
[1]1955       done
1956    fi
1957
1958 else
1959
1960
1961       # BEI LOKALEN RECHNUNGEN PRUEFEN, OB EXECUTABLE VORHANDEN
1962    if [[ $do_remote = false ]]
1963    then
1964       if [[ ! -f $executable ]]
1965       then
1966          printf "\n  +++ executable file:  $executable"
1967          printf "\n      does not exist"
1968          locat=executable; exit
1969       fi
1970    fi
1971 fi
1972
1973
1974    # JOBMODUS FESTSTELLEN
1975 if [[ "$ENVIRONMENT" = BATCH  &&  $localhost != lctit  ||  "$QUEUE" != interactive  &&  $localhost = lctit ]]
1976 then
1977    jobmo=BATCH
1978 else
1979    jobmo=INTERACTIVE
1980 fi
1981
1982
1983    # HOSTSPEZIFISCHE DEFAULT-COMPILER SETZEN, FALLS NICHT BEREITS
1984    # DURCH BENUTZER ANDERWEITIG VEREINBART
1985 if [[ "$compiler_name" = "" ]]
1986 then
[82]1987
[220]1988    printf "\n  +++ no compiler specified for \"$host $cond1 $cond2\""
[82]1989    locat=compiler_name; exit
1990
[1]1991 fi
1992
1993
[251]1994    # COMPILER AUF RIAMS NEC UEBERSCHREIBEN
1995 [[ $localhost = necriam ]]  &&  compiler_name=mpif90
[1]1996
1997
1998
1999    # TEMPORAEREN KATALOGNAMEN BESTIMMEN
2000 kennung=$RANDOM
2001 if [[ "$tmp_user_catalog" = "" ]]
2002 then
[312]2003    if [[ $localhost = ibmh ]]
[1]2004    then
[312]2005       tmp_user_catalog=$SCRATCH
[1]2006    elif [[ $localhost = nech ]]
2007    then
2008       tmp_user_catalog=$WRKSHR
2009    else
2010       tmp_user_catalog=/tmp
2011    fi
2012 fi
2013 TEMPDIR=$tmp_user_catalog/${usern}.$kennung
2014
2015
2016    # KATALOGNAMEN FUER ZWISCHENSPEICHERUNG VON FORTSETZUNGSLAUFDATEIEN
2017    # BESTIMMEN
2018 if [[ "$tmp_data_catalog" = "" ]]
2019 then
[312]2020    if [[ $localhost = ibmb ]]
[1]2021    then
2022       tmp_data_catalog=$WORK/mrun_restart_data
2023    elif [[ $localhost = nech ]]
2024    then
2025       tmp_data_catalog=$WRKSHR/mrun_restart_data
2026    else
2027       tmp_data_catalog=/tmp/mrun_restart_data
2028    fi
2029 fi
2030
2031
2032    # EVENTUELL BEI LOKALEN RECHNUNGEN $-ZEICHEN IN ENVIRONMENT-VARIABLEN
2033    # ERSETZEN
2034 if [[ $do_remote = false  &&  $do_compile = true ]]
2035 then
2036    eval  fopts=\"$fopts\"
2037    eval  lopts=\"$lopts\"
2038 fi
2039
2040
2041
2042    # COMPILE- UND LINK-OPTIONEN BESTIMMEN
[260]2043 fopts="$fopts $netcdf_inc $dvr_inc"
2044 lopts="$lopts $netcdf_lib $dvr_lib"
[1]2045 ROPTS="$ropts"
[440]2046 if [[ ( $(echo $host | cut -c1-3) = nec  ||  $(echo $host | cut -c1-3) = ibm  ||  $host = lckyoto  ||  $host = lcsgih  ||  $host = lcsgib  ||  $host = lctit  ||  $host = lcfimm  ||  $host = lcxt4 ||  $host = lcxt5m || $host = lck )  &&  -n $numprocs ]]
[1]2047 then
2048    XOPT="-X $numprocs"
2049 fi
2050
2051
2052
2053    # PRUEFEN DER CPU-ZEIT. (CPUMAX WIRD ALS ENV-VARIABLE VOM HAUTPRO-
2054    # GRAMM BENOETIGT
2055 done=false
2056 while [[ $done = false ]]
2057 do
2058    cputime=$cpumax
2059    if (( $cputime == 0 ))
2060    then
[246]2061       if [[ $do_batch = true ]]
2062       then
2063          printf "\n  +++ cpu-time is undefined"
2064          printf "\n  >>> Please type CPU-time in seconds as INTEGER:"
2065          printf "\n  >>> "
2066          read  cputime  1>/dev/null  2>&1
2067       else
2068          cputime=10000000   # NO CPU LIMIT FOR INTERACTIVE RUNS
2069       fi
[1]2070    else
2071       done=true
2072    fi
2073    cpumax=$cputime
2074 done
2075
2076 (( minuten = cputime / 60 ))
2077 (( sekunden = cputime - minuten * 60 ))
2078
2079
2080    # PRUEFEN DER KERNSPEICHERANFORDERUNG
2081 if [[ $do_batch = true ]]
2082 then
2083    done=false
2084    while [[ $done = false ]]
2085    do
2086       if (( memory == 0 ))
2087       then
2088          printf "\n  +++ memory demand is undefined"
2089          printf "\n  >>> Please type memory in  MByte per process  as INTEGER:"
2090          printf "\n  >>> "
2091          read  memory  1>/dev/null  2>&1
2092       else
2093          done=true
2094       fi
2095    done
2096 fi
2097
2098
2099    # PRUEFEN, OB FUER REMOTE-RECHNUNGEN EIN BENUTZERNAME ANGEGEBEN WURDE
2100 if [[ $do_remote = true  &&  -z $remote_username ]]
2101 then
2102    while [[ -z $remote_username ]]
2103    do
2104       printf "\n  +++ username on remote host \"$host\" is undefined"
2105       printf "\n  >>> Please type username:"
2106       printf "\n  >>> "
2107       read  remote_username
2108    done
2109    mc="$mc -u$remote_username"
2110 fi
2111
[221]2112
[493]2113    # set module load command and export for subjob
2114 if [[ "$modules" != "" ]]
2115 then
2116    export module_calls="module load ${modules};"
2117 fi
2118
2119
[221]2120    # SET DEFAULT VALUE FOR MPI MODULE TO BE USED ON SGI-ALTIX
2121 if [[ $host = lcsgib  ||  $host = lcsgih ]]
2122 then
[493]2123    if [[ $(echo $modules | grep -c mpt ) != 0 ]]
2124    then
2125       mpilib=mpt
2126    elif [[ $(echo $modules | grep -c mvapich ) != 0 ]]
2127    then
2128       mpilib=mvapich
2129    fi
[221]2130 fi
2131
2132
2133
[1]2134###########################################################################
2135# HEADER-AUSGABE
2136###########################################################################
2137
2138
2139 calltime=$(date)
2140 printf "\n"
2141# [[ $silent = false ]]  &&  clear
2142 printf "#--------------------------------------------------------------# \n"
2143 printf "| $version$calltime | \n"
2144 printf "|                                                              | \n"
2145 spalte1="called on:"; spalte2=$localhost_realname
2146 printf "| $spalte1$spalte2 | \n"
2147 if [[ $local_compile = false ]]
2148 then
2149    if [[ $do_remote = true ]]
2150    then
2151       spalte1="execution on:"; spalte2="$host (username: $remote_username)"
2152    else
2153       spalte1="execution on:"; spalte2="$host ($localhost_realname)"
2154    fi
2155 else
2156    spalte1="compiling test only!"; spalte2=""
2157 fi
2158 printf "| $spalte1$spalte2 | \n"
2159 if [[ -n $numprocs ]]
2160 then
2161    spalte1="number of PEs:"; spalte2=$numprocs
2162    printf "| $spalte1$spalte2 | \n"
2163 fi
2164 if [[ -n $tasks_per_node ]]
2165 then
2166    spalte1="tasks per node:"; spalte2="$tasks_per_node (number of nodes: $nodes)"
2167    printf "| $spalte1$spalte2 | \n"
2168 fi
2169 if [[ $threads_per_task != 1 ]]
2170 then
2171    spalte1="threads per task:"; spalte2="$threads_per_task"
2172    printf "| $spalte1$spalte2 | \n"
2173 fi
2174 printf "|                                                              | \n"
2175 if [[ $do_compile = true ]]
2176 then
[475]2177    if [[ "$mopts" != "" ]]
2178    then
[493]2179       spalte1="make options:"; spalte2=$mopts
[475]2180       printf "| $spalte1$spalte2 | \n"
2181       zeile=$(echo "$mopts" | cut -c41-)
2182       while [[ "$zeile" != "" ]]
2183       do
2184          spalte1=""
2185          spalte2=$zeile
2186          printf "| $spalte1$spalte2 | \n"
2187          zeile=$(echo "$zeile" | cut -c41-)
2188       done
2189    fi
2190
[493]2191    spalte1="cpp directives:"; spalte2=$cpp_options
[1]2192    printf "| $spalte1$spalte2 | \n"
[82]2193    zeile=$(echo "$cpp_options" | cut -c41-)
[1]2194    while [[ "$zeile" != "" ]]
2195    do
2196       spalte1=""
2197       spalte2=$zeile
2198       printf "| $spalte1$spalte2 | \n"
2199       zeile=$(echo "$zeile" | cut -c41-)
2200    done
2201
[493]2202    spalte1="compiler options:"; spalte2="$fopts"
[1]2203    printf "| $spalte1$spalte2 | \n"
[82]2204    zeile=$(echo "$fopts" | cut -c41-)
[1]2205    while [[ "$zeile" != "" ]]
2206    do
2207       spalte1=""
2208       spalte2=$zeile
2209       printf "| $spalte1$spalte2 | \n"
2210       zeile=$(echo "$zeile" | cut -c41-)
2211    done
2212
[493]2213    spalte1="linker options:"; spalte2=$lopts
[1]2214    printf "| $spalte1$spalte2 | \n"
[82]2215    zeile=$(echo "$lopts" | cut -c41-)
[1]2216    while [[ "$zeile" != "" ]]
2217    do
2218       spalte1=""
2219       spalte2=$zeile
2220       printf "| $spalte1$spalte2 | \n"
2221       zeile=$(echo "$zeile" | cut -c41-)
2222    done
2223
[493]2224    spalte1="modules to be load:"; spalte2=$modules
2225    printf "| $spalte1$spalte2 | \n"
2226    zeile=$(echo "$modules" | cut -c41-)
2227    while [[ "$zeile" != "" ]]
2228    do
2229       spalte1=""
2230       spalte2=$zeile
2231       printf "| $spalte1$spalte2 | \n"
2232       zeile=$(echo "$zeile" | cut -c41-)
2233    done
2234
[1]2235    spalte1="main program":; spalte2=$mainprog
2236    printf "| $spalte1$spalte2 | \n"
2237 else
2238    spalte1=executable:; spalte2=$executable
2239    printf "| $spalte1$spalte2 | \n"
2240 fi
2241 printf "|                                                              | \n"
2242 spalte1="base name of files":; spalte2=$fname
2243 printf "| $spalte1$spalte2 | \n"
2244 if [[ $fname != $afname ]]
2245 then
2246    spalte1="base name of input files":; spalte2=$afname
2247    printf "| $spalte1$spalte2 | \n"
2248 fi
2249 spalte1="INPUT control list":; spalte2=$input_list
2250 printf "| $spalte1$spalte2 | \n"
2251 spalte1="OUTPUT control list":; spalte2=$output_list
2252 printf "| $spalte1$spalte2 | \n"
2253
2254 if [[ $do_batch = true  ||  "$LOADLBATCH" = yes ]]
2255 then
2256    spalte1="memory demand / PE":; spalte2="$memory MB"
2257    printf "| $spalte1$spalte2 | \n"
2258    spalte1=CPU-time:; spalte2="$minuten:$sekunden"
2259    printf "| $spalte1$spalte2 | \n"
2260 fi
2261
2262 if [[ $do_compile = true ]]
2263 then
2264    printf "|                                                              | \n"
2265    printf "| Files to be compiled:                                        | \n"
2266    zeile=$source_list
2267    while [[ "$zeile" != "" ]]
2268    do
2269       spalte3=$zeile
2270       printf "| $spalte3 | \n"
2271       zeile=$(echo "$zeile" | cut -c61-)
2272    done
2273 fi
2274 printf "#--------------------------------------------------------------#"
2275
2276
2277
2278    # BEDINGTE AUSGABE DER DATEIVERBINDUNGEN
2279 if [[ $do_trace = true ]]
2280 then
2281    (( i = 0 ))
2282    while (( i < iin ))
2283    do
2284       (( i = i + 1 ))
2285       if (( i == 1 ))
2286       then
2287          printf "\n\n >>> INPUT-file assignments:\n"
2288       fi
2289       printf "\n     ${localin[$i]} :  ${absnamein[$i]}"
2290    done
2291    (( i = 0 ))
2292    while (( i < iout ))
2293    do
2294       (( i = i + 1 ))
2295       if (( i == 1 ))
2296       then
2297          printf "\n\n >>> OUTPUT-file assignments:\n"
2298       fi
2299       printf "\n     ${localout[$i]} :  ${pathout[$i]}"
2300    done
2301    (( i = 0 ))
2302    while (( i < iic ))
2303    do
2304       (( i = i + 1 ))
2305       if (( i == 1 ))
2306       then
2307          printf "\n\n >>> INPUT-commands:\n"
2308       fi
2309       printf "\n     ${in_command[$i]}" 
2310    done
2311    (( i = 0 ))
2312    while (( i < ioc ))
2313    do
2314       (( i = i + 1 ))
2315       if (( i == 1 ))
2316       then
2317          printf "\n\n >>> OUTPUT-commands:\n"
2318       fi
2319       printf "\n     ${out_command[$i]}" 
2320    done
2321 fi
2322
2323
2324    # ABFRAGEN BEI AUFRUF AUF LOKALER MASCHINE
2325 if [[ $remotecall = false  &&  $silent = false  &&  $jobmo != BATCH ]]
2326 then
2327    antwort=dummy
2328    printf "\n\n"
2329    while [[ "$antwort" != y  &&  "$antwort" != Y  &&  "$antwort" != n  &&  "$antwort" != N ]]
2330    do
2331       printf " >>> everything o.k. (y/n) ?  "
2332       read  antwort
2333    done
2334    if [[ $antwort = n  ||  $antwort = N ]]
2335    then
2336       locat=user_abort; (( iec = 0 )); exit
2337    fi
2338    if [[ $do_batch = true ]]
2339    then
2340       printf " >>> batch-job will be created and submitted"
2341    else
2342       if [[ $local_compile = false ]]
2343       then
2344          printf " >>> MRUN will now continue to execute on this machine"
2345       else
2346          printf " >>> a test compilation will now be carried out on this machine"
2347       fi
2348    fi
2349 fi
2350 
2351
2352
2353
2354     # FALLS AUF DIESER MASCHINE GERECHNET WERDEN SOLL, WERDEN JETZT ENTSPRE-
2355     # CHENDE AKTIONEN DURCHGEFUEHRT
2356 if [[ $do_batch = false ]]
2357 then
2358
2359
2360       # TEMPORAEREN KATALOG ERZEUGEN
2361    mkdir -p  $TEMPDIR
2362    chmod  go+rx  $TEMPDIR
2363    tmpcreate=true
2364
[493]2365       # set striping on lustre file system
2366#    if [[ $localhost = lcsgih ]]
2367#    then
2368#       lfs setstripe -s 8192k -c 16  $TEMPDIR
2369#       lfs getstripe $TEMPDIR
2370#    fi
[1]2371
[493]2372
[1]2373       # SAEMTLICHE QUELLTEXT-DATEIEN BZW. AUSFUEHRBARES PROGRAMM IN
2374       # TEMPORAERES VERZEICHNIS KOPIEREN
2375    if [[ $do_compile = true ]]
2376    then
2377
2378          # ON NEC, COMPILATION IS DONE ON HOST CROSS VIA CROSS COMPILING
2379          # CREATE A TEMPORARY DIRECTORY ON THAT MACHINE (HOME MOUNTED VIA NFS)
2380       if [[ $localhost = nech ]]
2381       then
2382          TEMPDIR_COMPILE=$HOME/work/${usern}.$kennung
2383          if  mkdir -p  $TEMPDIR_COMPILE
2384          then
2385             printf "\n  *** \"$TEMPDIR_COMPILE\" "
2386             printf "\n      is generated as temporary directory for cross compiling\n"
2387          else
2388             printf "\n  +++ creating directory \"$TEMPDIR_COMPILE\" "
2389             printf "\n      needed for cross compilation failed"
2390             locat=compile
2391             exit
2392          fi
2393       else
2394          TEMPDIR_COMPILE=$TEMPDIR
2395       fi
2396
2397
[82]2398          # PFADNAMEN FUER DAS MAKE-DEPOSITORY ERMITTELN
2399       line=""
2400       grep "%depository_path" $config_file  >  tmp_mrun
2401       while read line
2402       do
2403          if [[ "$line" != ""  &&  $(echo $line | cut -c1) != "#" ]]
2404          then
2405             if [[ "$(echo $line | cut -d" " -s -f3)" = "" ]]
[1]2406             then
[82]2407                global_depository_path=`echo $line | cut -d" " -s -f2`
[1]2408             fi
[82]2409          fi
2410       done < tmp_mrun
[1]2411
[82]2412       line=""
2413       grep  " $localhost" $config_file | grep "%depository_path"  >  tmp_mrun
2414       while read line
2415       do
2416          if [[ "$line" != ""  &&  $(echo $line | cut -c1) != "#" ]]
[1]2417          then
[211]2418             if [[ "$(echo $line | cut -d" " -s -f4)" = "$cond1"  &&  "$(echo $line | cut -d" " -s -f5)" = "$cond2" ]]
2419             then
2420                local_depository_path=`echo $line | cut -d" " -s -f2`
2421             fi
[1]2422          fi
[82]2423       done < tmp_mrun
[1]2424
[82]2425       if [[ "$local_depository_path" = "" ]]
2426       then
2427          if [[ "$global_depository_path" != "" ]]
[1]2428          then
[82]2429             local_depository_path=$global_depository_path
[1]2430          else
[82]2431             printf "\n\n  +++ no depository path found in configuration file"
2432             printf "\n      for local host \"$localhost\" "
2433             printf "\n      please set \"\%depository_path\" in configuration file\n"
2434             locat=config_file; exit
[1]2435          fi
[82]2436       fi
2437       eval local_depository_path=$local_depository_path
[215]2438       [[ "$cond1" != "" ]]  &&  local_depository_path=${local_depository_path}_$cond1
2439       [[ "$cond2" != "" ]]  &&  local_depository_path=${local_depository_path}_$cond2
[1]2440
[215]2441
[82]2442       basename=`print $mainprog | cut -f1 -d"."`
2443       eval make_depository=${local_depository_path}/${basename}_current_version.tar
2444       if [[ ! -f $make_depository ]]
2445       then
2446          printf "\n"
2447          printf "\n  *** WARNING: make depository \"$make_depository\" not found"
2448          printf "\n               \"make\" will fail, if the Makefile or other source files are missing\n"
2449       else
2450          cp  $make_depository  $TEMPDIR_COMPILE
[1]2451          cd  $TEMPDIR_COMPILE
[82]2452          tar -xf  $make_depository  >  /dev/null  2>&1
[1]2453          cd -  > /dev/null
2454       fi
[82]2455
2456       cp  SOURCES_FOR_RUN_$fname/*  $TEMPDIR_COMPILE
2457
[1]2458    else
[475]2459
[1]2460       cp  $executable   ${TEMPDIR}/a.out
[475]2461
[1]2462    fi
2463
2464
2465       # WECHSEL IN TEMPORAEREN KATALOG
[475]2466    cd  $TEMPDIR
[1]2467    printf "\n  *** changed to temporary directory: $TEMPDIR"
2468
2469
2470       # OUTPUT-DATEI-VERBINDUNGEN AUF TEMPORAERER DATEI ABLEGEN
2471       # DIESE DATEI KANN VON SPAETER AUFZURUFENDEN BENUTZERPROZEDUREN GELESEN
2472       # WERDEN, UM ZU LOKALEN DATEINAMEN GEHOERENDE PERMANENTE NAMEN ZU
2473       # ERMITTELN
2474    (( i = 0 ))
2475    while (( i < iout ))
2476    do
2477       (( i = i + 1 ))
2478       if [[ "${actionout[$i]}" = tr  ||  "${actionout[$i]}" = tra  ||  "${actionout[$i]}" = trpe ]]
2479       then
2480          printf "${localout[$i]} ${actionout[$i]}\n${pathout[$i]}\n${localhost}_${fname}${endout[$i]}\n" >> OUTPUT_FILE_CONNECTIONS
2481       else
2482          printf "${localout[$i]} ${actionout[$i]}\n${pathout[$i]}\n${frelout[$i]}\n" >> OUTPUT_FILE_CONNECTIONS
2483       fi
2484    done
2485
2486
2487       # EVTL. UEBERSETZUNGSAKTIONEN STARTEN
2488    if [[ $do_compile = true ]]
2489    then
2490
2491
2492          # COMPILING WITH MAKE (ON NEC COMPILER IS CALLED ON HOST CROSS)
[82]2493       printf "\n\n\n  *** compilation starts \n$striche\n"
2494       printf "  *** compilation with make using following options:\n"
[211]2495       printf "      make depository:          $make_depository"
[475]2496       if [[ "$mopts" != "" ]]
2497       then
2498          printf "      make options:             $mopts\n"
2499       fi
[82]2500       printf "      compilername:             $compiler_name\n"
[475]2501       printf "      compiler options:         $fopts\n"
[493]2502       printf "      preprocessor directives:  $cpp_options \n"
2503       printf "      linker options:           $lopts \n"
2504       if [[ "$modules" != "" ]]
2505       then
2506          printf "      modules to be load:       $modules \n"
2507       fi
[82]2508       printf "      source code files:        $source_list \n"
2509
2510       if [[ $localhost = nech ]]
[1]2511       then
[493]2512          ssh  136.172.44.192 -l $usern ". /SX/opt/etc/initsx.sh; $module_calls cd \$HOME/work/${usern}.$kennung; sxmake $mopts -f Makefile PROG=a.out  F90=$compiler_name  COPT=\"$cpp_options\"  F90FLAGS=\"$fopts\"  LDFLAGS=\"$lopts\" "
[82]2513          cp  $TEMPDIR_COMPILE/a.out  .
2514          [[ $? != 0 ]]  &&  compile_error=true
2515          rm -rf  $TEMPDIR_COMPILE
[312]2516       elif [[ $localhost = ibmh ]]
2517       then
[325]2518          printf "      compiler is called via ssh on \"plogin1\" \n"
[493]2519          ssh  plogin1  -l $usern  "export PATH=/sw/ibm/xlf/12.1.0.3/usr/bin:$PATH; $module_calls cd $TEMPDIR; make $mopts -f Makefile PROG=a.out  F90=$compiler_name  COPT=\"$cpp_options\"  F90FLAGS=\"$fopts\"  LDFLAGS=\"$lopts\" "
[312]2520          [[ ! -f a.out ]]  &&  compile_error=true
2521          continue   # ANDERENFALLS IST STATUS=1, FALLS A.OUT VORHANDEN
[197]2522       elif [[ $localhost = lcsgib ]]
2523       then
[540]2524          printf "      compiler is called via ssh on \"bicegate0\" \n"
2525          ssh  bicegate0  -l $usern  ". /usr/share/modules/init/bash; $module_calls cd $TEMPDIR; make $mopts -f Makefile PROG=a.out  F90=$compiler_name  COPT=\"$cpp_options\"  F90FLAGS=\"$fopts\"  LDFLAGS=\"$lopts\" "
[197]2526          [[ ! -f a.out ]]  &&  compile_error=true
2527          continue   # ANDERENFALLS IST STATUS=1, FALLS A.OUT VORHANDEN
2528       elif [[ $localhost = lcsgih ]]
2529       then
[540]2530          printf "      compiler is called via ssh on \"hicegate0\" \n"
2531          ssh  hicegate0    -l $usern  ". /usr/share/modules/init/bash; $module_calls cd $TEMPDIR; make $mopts -f Makefile PROG=a.out  F90=$compiler_name  COPT=\"$cpp_options\"  F90FLAGS=\"$fopts\"  LDFLAGS=\"$lopts\" 2>&1 "
[197]2532          [[ ! -f a.out ]]  &&  compile_error=true
2533          continue   # ANDERENFALLS IST STATUS=1, FALLS A.OUT VORHANDEN
[1]2534       else
[118]2535          [[ $localhost = lctit ]]  &&  export LM_LICENSE_FILE=27050@tggls
[493]2536          [[ "$module_calls" != "" ]]  &&  eval $module_calls
[475]2537          make $mopts -f Makefile PROG=a.out  F90=$compiler_name  COPT="$cpp_options"  F90FLAGS="$fopts"  LDFLAGS="$lopts"
[82]2538       fi
[1]2539
2540       if [[ $? != 0  ||  "$compile_error" = true  ||  "$module_compile_error" = true ]]
2541       then
2542          printf "\n  +++ error occured while compiling or linking"
2543          locat=compile
[181]2544
[182]2545  # WORKAROUND: REMOVE IF CONSTRUCT LATER, BUT KEEP THE EXIT!
[197]2546#          if [[ $localhost != lcsgib  &&  $localhost != lcsgih ]]
2547#          then
[181]2548             exit
[197]2549#          else
2550#             locat=normal
2551#          fi
[1]2552       else
2553          printf "$striche\n  *** compilation finished \n"
2554       fi
2555    fi
2556
2557
2558       # FALLS NUR TESTWEISE KOMPILIERT WERDEN SOLLTE, IST MRUN JETZT FERTIG
2559    if [[ $local_compile = true ]]
2560    then
2561       cd  $HOME
2562       rm -rf $TEMPDIR
2563       locat=local_compile; exit
2564    fi
2565
2566
2567       # BEREITSTELLEN DER INPUT-DATEIEN
2568       # SCHLEIFE UEBER ALLE VOM BENUTZER ANGEGEBENEN DATEIEN
2569    (( i = 0 ))
2570    while (( i < iin ))
2571    do
2572       (( i = i + 1 ))
2573       if (( i == 1 ))
2574       then
2575          printf "\n\n  *** providing INPUT-files:\n$striche"
2576       fi
2577
2578
2579          # OPTIONALE DATEIEN BEI NICHTVORHANDENSEIN UEBERGEHEN
2580       if [[ "${transin[$i]}" = unavailable ]]
2581       then
2582          if [[ "${extin[$i]}" = ""  ||  "${extin[$i]}" = " " ]]
2583          then
2584             printf "\n  +++ WARNING: input file \"${pathin[$i]}/${afname}${endin[$i]}\" "
2585             printf "\n               is not available!"
2586          else
2587             printf "\n  +++ WARNING: input file \"${pathin[$i]}/${afname}${endin[$i]}.${extin[$i]}\" "
2588             printf "\n               is not available!"
2589          fi
2590          continue
2591       fi
2592
2593          # PRUEFEN, OB EINZELDATEI ODER DATEI PRO PROZESSOR
2594       files_for_pes=false; datentyp=file
2595       if [[ "${actionin[$i]}" = pe  &&  -n $numprocs ]]
2596       then
2597          files_for_pes=true; datentyp=directory
2598          actionin[$i]=""
2599       elif [[ "${actionin[$i]}" = pe  &&  ! -n $numprocs ]]
2600       then
2601          actionin[$i]=""
2602       elif [[ "${actionin[$i]}" = arpe  &&  -n $numprocs ]]
2603       then
2604          files_for_pes=true; datentyp=directory
2605          actionin[$i]="ar"
2606       elif [[ "${actionin[$i]}" = arpe  &&  ! -n $numprocs ]]
2607       then
2608          actionin[$i]="ar"
2609       elif [[ "${actionin[$i]}" = flpe  &&  -n $numprocs ]]
2610       then
2611          files_for_pes=true; datentyp=directory
2612          actionin[$i]="fl"
2613       elif [[ "${actionin[$i]}" = flpe  &&  ! -n $numprocs ]]
2614       then
2615          actionin[$i]="fl"
2616       fi
2617
2618       if [[ $files_for_pes = true ]]
2619       then
2620          printf "\n  >>> INPUT: ${absnamein[$i]}/....  to  ${localin[$i]}"
2621       else
2622          printf "\n  >>> INPUT: ${absnamein[$i]}  to  ${localin[$i]}"
2623       fi
2624
2625          # INPUT-DATEI FUER EINEN FORTSETZUNGSLAUF. ES WIRD GEPRUEFT,
2626          # OB DIESE DATEI NOCH AUF DEM TEMPORAEREN DATENKATALOG VORHANDEN
2627          # IST. FALLS NICHT, WIRD VERSUCHT, SIE ANSCHLIESSEND VOM ARCHIV-
2628          # SERVER ZU HOLEN
2629       if [[ "${actionin[$i]}" = fl ]]
2630       then
2631          printf "\n      $datentyp will be fetched from temporary directory \"${tmp_data_catalog}\" !"
2632          if [[ $files_for_pes = false ]]
2633          then
2634             if [[ -f "$tmp_data_catalog/${frelin[$i]}" ]]
2635             then
2636                ln  $tmp_data_catalog/${frelin[$i]}  ${localin[$i]}
2637                got_tmp[$i]=true
2638             elif [[ -f "$WORK/${frelin[$i]}"  &&  $ignore_archive_error = true ]]
2639             then
2640                printf "\n  +++ $datentyp not found in \"$tmp_data_catalog\" !"
2641                printf "\n  *** trying to use backup copy in \"$WORK\" "
2642                cp  $WORK/${frelin[$i]}  ${localin[$i]}
2643             else
2644                printf "\n  +++ $datentyp not found in \"$tmp_data_catalog\" "
2645                printf "\n      or \"$tmp_data_catalog\" does not exist!"
2646                printf "\n  *** trying to get copy from archive"
2647                actionin[$i]=ar
2648             fi
2649          else
2650             if [[ -d "$tmp_data_catalog/${frelin[$i]}" ]]
2651             then
2652                mkdir  ${localin[$i]}
[149]2653                cd $tmp_data_catalog/${frelin[$i]}
2654                for file in $(ls *)
2655                do
2656                   ln $file $TEMPDIR/${localin[$i]}
2657                done
2658                cd $TEMPDIR
[1]2659                got_tmp[$i]=true
2660             elif [[ -d "$WORK/${frelin[$i]}"  &&  $ignore_archive_error = true ]]
2661             then
2662                printf "\n  +++ $datentyp not found in \"$tmp_data_catalog\" !"
2663                printf "\n  *** trying to use backup copy in \"$WORK\" "
2664                cp -r  $WORK/${frelin[$i]}  ${localin[$i]}
2665             else
2666                printf "\n  +++ $datentyp not found in \"$tmp_data_catalog\" "
2667                printf "\n      or \"$tmp_data_catalog\" does not exist!"
2668                printf "\n  *** trying to get copy from archive"
2669                actionin[$i]=ar
2670             fi
2671          fi
2672       fi
2673
2674
2675          # DATEI LIEGT AUF ARCHIV-SERVER
2676       if [[ "${actionin[$i]}" = ar ]]
2677       then
2678
2679          if [[ $files_for_pes = false ]]
2680          then
2681             printf "\n      file will be restored from archive-system ($archive_system)!"
2682          else
2683             printf "\n      directory will be restored from archive-system ($archive_system)!"
2684          fi
2685
2686          file_restored=false
2687
2688          if [[ $archive_system = asterix ]]
2689          then
2690             do_stagein=true
2691             (( stagein_anz = 0 ))
2692             while [[ $do_stagein = true ]]
2693             do
2694                if [[ $files_for_pes = false ]]
2695                then
2696                   stagein  -O  ${frelin[$i]}  >  STAGEIN_OUTPUT
2697                else
2698                   stagein  -t  -O  ${frelin[$i]}  >  STAGEIN_OUTPUT
2699                fi
2700                cat  STAGEIN_OUTPUT
2701                if [[ $(grep -c "st.msg:i24"  STAGEIN_OUTPUT) != 0 ]]
2702                then
2703                   file_restored=true
2704                   do_stagein=false
2705                else
2706                   (( stagein_anz = stagein_anz + 1 ))
2707                   if (( stagein_anz == 10 ))
2708                   then
2709                      printf "\n  +++ stagein stoped after 10 tries"
2710                      locat=stage
2711                      exit
2712                   fi
2713                   printf "\n  +++ restoring from archive failed, trying again:"
2714                   sleep 900
2715                fi
2716             done
2717          elif [[ $archive_system = DMF ]]
2718          then
2719             if [[ $files_for_pes = false ]]
2720             then
2721                printf "\n  +++ restoring of single files impossible with $archive_system !\n"
2722                locat=DMF
2723                exit
2724             else
2725                find  $ARCHIVE/${frelin[$i]}  -type m  -print  |  dmget
2726                cp  -r $ARCHIVE/${frelin[$i]}  $PWD
2727                file_restored=true
2728             fi
2729          elif [[ $archive_system = tivoli ]]
2730          then
2731             if [[ $files_for_pes = false ]]
2732             then
[399]2733                if [[ $localhost = lcsgih ]]
[1]2734                then
[399]2735                   ssh  $usern@hicedata.hlrn.de  "cp  $PERM/${frelin[$i]}  $PWD"
[1]2736                else
[399]2737                   ssh  $usern@bicedata.hlrn.de  "cp  $PERM/${frelin[$i]}  $PWD"
[1]2738                fi
2739             else
2740                (( inode = 0 ))
2741                while (( inode < nodes ))
2742                do
[399]2743                   if [[ $localhost = lcsgih ]]
[1]2744                   then
[399]2745                      ssh  $usern@hicedata.hlrn.de  "cd $PWD; tar  xf  $PERM/${frelin[$i]}/${frelin[$i]}.node_$inode.tar"
[1]2746                   else
[399]2747                      ssh  $usern@bicedata.hlrn.de  "cd $PWD; tar  xf  $PERM/${frelin[$i]}/${frelin[$i]}.node_$inode.tar"
[1]2748                   fi
2749                   (( inode = inode + 1 ))
2750                done
2751             fi
2752             file_restored=true
2753          elif [[ $archive_system = ut ]]
2754          then
2755             if [[ $files_for_pes = false ]]
2756             then
2757                cp  $UT/${frelin[$i]}  .
2758             else
2759                (( inode = 0 ))
2760                while (( inode < nodes ))
2761                do
2762                   tar  xf  $UT/${frelin[$i]}/${frelin[$i]}.node_$inode.tar
2763                   (( inode = inode + 1 ))
2764                done
2765             fi
2766             file_restored=true
2767          else
2768             printf "\n  +++ archive_system=\"$archive_system\"   restore impossible!"
2769             locat=rearchive
2770             exit
2771          fi
2772
2773          if [[ $file_restored = true ]]
2774          then
2775
2776                # DATEI AUCH AUF TEMPORAERES DATENVERZEICHNIS LEGEN, DAMIT
2777                # SIE BEI WEITEREN ZUGRIFFEN NOCH VORHANDEN IST
2778             [[ ! -d $tmp_data_catalog ]]  &&  mkdir -p  $tmp_data_catalog; chmod  g+rx  $tmp_data_catalog
2779             if [[ $files_for_pes = false ]]
2780             then
2781                ln  -f  ${frelin[$i]}  $tmp_data_catalog/${frelin[$i]}
2782             else
2783                mkdir  $tmp_data_catalog/${frelin[$i]}
2784                ln  -f  ${frelin[$i]}/*  $tmp_data_catalog/${frelin[$i]}
2785             fi
2786             got_tmp[$i]=true
2787
2788                # DATEI UNTER LOKALEM NAMEN ZUR VERFUEGUNG STELLEN
2789             mv  ${frelin[$i]}  ${localin[$i]}
2790
2791          fi
2792       fi
2793
2794
2795          # DATEI LIEGT IM VOM BENUTZER ANGEGEBENEN VERZEICHNIS
2796       if [[ "${actionin[$i]}" = ""  ||  "${actionin[$i]}" = "di"  ||  "${actionin[$i]}" = "npe" ]]
2797       then
2798
2799          if [[ "${actionin[$i]}" = "npe"  &&  -n $numprocs ]]
2800          then
2801
2802                # DATEI WIRD FUER DIE PROZESSOREN EINES PARALLERECHNERS BEREITGESTELLT
2803             printf "\n      file will be provided for $numprocs processors"
2804             mkdir  ${localin[$i]}
2805             ival=$numprocs
2806             (( ii = 0 ))
2807             while (( ii <= ival-1 ))
2808             do
2809                if (( ii < 10 ))
2810                then
2811                   cp  ${absnamein[$i]}  ${localin[$i]}/_000$ii
2812                elif (( ii < 100 ))
2813                then
2814                   cp  ${absnamein[$i]}  ${localin[$i]}/_00$ii
2815                elif (( ii < 1000 ))
2816                then
2817                   cp  ${absnamein[$i]}  ${localin[$i]}/_0$ii
2818                else
2819                   cp  ${absnamein[$i]}  ${localin[$i]}/_$ii
2820                fi
2821                (( ii = ii + 1 ))
2822             done
2823
2824          else
2825
2826             if [[ $files_for_pes = true ]]
2827             then
2828
2829                   # DIE DEN PROZESSOREN EINES PARALLELRECHNERS ZUGEHOERIGEN
2830                   # DATEIEN WERDEN BEREITGESTELLT, INDEM ZUERST DER GESAMTE
2831                   # KATALOGINHALT KOPIERT UND DANN DIE EINZELNEN DATEIEN
2832                   # PER MOVE UMBENANNT WERDEN
2833                printf "\n      providing $numprocs files for the respective processors"
2834                mkdir  ${localin[$i]}
[183]2835                if [[ $link_local_input = true ]]
2836                    then
2837                    printf "      using ln -f\n"
2838                    cd ${absnamein[$i]}
2839                    for file in $(ls *)
2840                      do
2841                      ln -f $file  ${localin[$i]}
2842                    done
2843                    cd $TEMPDIR
2844                fi
2845                # If "ln -f" fails of if "$link_local_input = false" do a normal "cp -r"
2846                if [[ ! -f "${localin[$i]}/_0000" ]]
2847                    then
2848                    if [[ $link_local_input = true ]]
2849                        then
2850                        printf "      ln failed for .../_0000, using cp...\n"
2851                    fi
2852                    cp -r  ${absnamein[$i]}/*  ${localin[$i]}
2853                fi
[1]2854
2855             else
2856                   # BEREITSTELLUNG AUF EINPROZESSORRECHNERN
[183]2857                if [[ $link_local_input = true ]]
2858                then
2859                    printf "      using ln -f\n"
2860                    ln -f  ${absnamein[$i]}  ${localin[$i]}
2861                fi
2862                # If "ln -f" fails of if "$link_local_input = false" do a normal "cp"
2863                if [[ ! -f "${localin[$i]}" ]]
2864                then
2865                    if [[ $link_local_input = true ]]
2866                    then
2867                        printf "      ln failed, using cp...\n"
2868                    fi
2869                    cp  ${absnamein[$i]}  ${localin[$i]}
2870                fi
[1]2871             fi
2872          fi
2873       fi
2874
2875    done
2876    if (( i != 0 ))
2877    then
2878       printf "\n$striche\n  *** all INPUT-files provided \n"
2879    fi
2880
2881
2882       # EVENTUELLE INPUT-KOMMANDOS ABARBEITEN
2883    (( i = 0 ))
2884    while (( i < iic ))
2885    do
2886       (( i = i + 1 ))
2887       if (( i == 1 ))
2888       then
2889          printf "\n\n  *** execution of INPUT-commands:\n$striche"
2890       fi
2891       printf "\n  >>> ${in_command[$i]}"
2892       eval  ${in_command[$i]}
2893       if (( i == iic ))
2894       then
2895          printf "\n$striche\n"
2896       fi
2897    done
2898
2899
2900       # VERBLEIBENDE CPU-ZEIT BERECHNEN
2901    cpurest=${cpumax}.
2902
2903
[260]2904       # START DVR STREAMING SERVER
2905    if [[ $(echo $package_list | grep -c dvrp_graphics) != 0 ]]
2906    then
2907       if [[ "$dvr_server" != "" ]]
2908       then
2909
2910          printf "\n\n  *** preparing the dvr streaming server configuration file"
2911
2912             # Check, if a dvr server is already running
2913          running_dvrserver_id=`echo $(ps -edaf | grep .dvrserver.config | grep -v grep) | cut -d" " -f2`
2914          if [[ "$running_dvrserver_id" != "" ]]
2915          then
2916
[261]2917             printf "\n\n  +++ WARNING: A dvr server with id=$running_dvrserver_id is already running!"
[260]2918             printf "\n      This server is used instead starting a new one!"
[261]2919             printf "\n      If required, script \"process_dvr_output\" has to be run manually."
[260]2920
2921          else
2922
2923                # COPY CONFIGURATION FILE FOR STREAMING SERVER FROM REPOSITORY TO HERE
2924             if [[ -f ${PALM_BIN}/.dvrserver.config ]]
2925             then
2926                cp  ${PALM_BIN}/.dvrserver.config  .
2927
2928                   # Entering the BASEDIR, UID and GID into this file
2929                user_id=`id -u`
2930                group_id=`id -g`
2931                   # & is needed as seperator, because TEMPDIR contains /
2932                sed "s&<replace by dvr data directory>&${TEMPDIR}&g" .dvrserver.config > .dvrserver.1
2933                sed "s/<replace by user id>/$user_id/g"    .dvrserver.1 > .dvrserver.2
2934                sed "s/<replace by group id>/$group_id/g"  .dvrserver.2 > .dvrserver.3
2935                mv  .dvrserver.3  .dvrserver.config
2936                rm  .dvrserver.1  .dvrserver.2
2937
2938                   # Start dvr server in background, get his id and print on terminal
2939                $dvr_server  .dvrserver.config  >>  DVR_LOGFILE  2>&1  &
2940                dvrserver_id=`echo $(ps -edaf | grep .dvrserver.config) | cut -d" " -f2`
2941                printf "\n  *** streaming server with id=$dvrserver_id is started in background"
2942                local_dvrserver_running=.TRUE.
2943             else
2944                printf "\n  +++ missing file \".dvrserver.config\" in directory:"
2945                printf "\n      \"$PALM_BIN\" "
2946                locat=dvr
2947                exit
2948             fi
2949
2950          fi
2951
2952       else
2953          printf "\n\n  --- INFORMATIVE: no dvr streaming server will be started"
2954       fi
2955    fi
2956
2957
2958       # NAMELIST-DATEI MIT WERTEN VON ENVIRONMENT-VARIABLEN ERZEUGEN (ZU
2959       # LESEN VON PALM)
2960    cat  >  ENVPAR  <<  %%END%%
2961 &envpar  run_identifier = '$fname', host = '$localhost',
2962          write_binary = '$write_binary', tasks_per_node = $tasks_per_node,
2963          maximum_cpu_time_allowed = ${cpumax}.,
2964          revision = '$global_revision',
2965          local_dvrserver_running = $local_dvrserver_running /
2966
2967%%END%%
2968
2969
[1]2970       # PROGRAMMSTART
2971    printf "\n\n  *** execution starts in directory\n      \"`pwd`\"\n$striche\n"
2972    PATH=$PATH:$TEMPDIR
2973
[359]2974       # MPI debug option (argument checking, slows down execution due to increased latency)
2975    if [[ "$mpi_debug" = true ]]
2976    then
2977       export MPI_CHECK_ARGS=1
2978       printf "\n  +++ MPI_CHECK_ARGS=$MPI_CHECK_ARGS"
2979    fi
2980
[1]2981    if [[ "$cond1" = debug  ||  "$cond2" = debug ]]
2982    then
2983       if [[ "$ENVIRONMENT" = BATCH ]]
2984       then
[211]2985          if [[ $(echo $localhost | cut -c1-5) != lcsgi ]]
2986          then
2987             printf "\n  +++ debug is allowed in interactive mode only"
2988             locat=debug
2989             exit
2990          fi
[1]2991       fi
[5]2992       if [[ $localhost = decalpha ]]
[1]2993       then
2994          dxladebug  a.out
2995       elif [[ $localhost = ibmb  ||  $localhost = ibmh ]]
2996       then
2997
2998             # SETUP THE IBM MPI ENVIRONMENT
2999          export MP_SHARED_MEMORY=yes
3000          export AIXTHREADS_SCOPE=S
3001          export OMP_NUM_THREADS=$threads_per_task
3002          export AUTHSTATE=files
3003          export XLFRTEOPTS="nlwidth=132:err_recovery=no"    # RECORD-LENGTH OF NAMELIST-OUTPUT
3004
3005             # FOLLOWING OPTIONS ARE MANDATORY FOR TOTALVIEW
3006          export MP_ADAPTER_USE=shared
3007          export MP_CPU_USE=multiple
3008          export MP_TIMEOUT=1200
3009
3010          unset  MP_TASK_AFFINITY
3011
3012             # SO FAR, TOTALVIEW NEEDS HOSTFILE MECHANISM FOR EXECUTION
3013          #(( ii = 1 ))
3014          #while (( ii <= $numprocs ))
3015          #do
3016          #   echo  $localhost_realname  >>  hostfile
3017          #   (( ii = ii + 1 ))
3018          #done
3019          #export MP_HOSTFILE=hostfile
3020
3021          if [[ "$LOADLBATCH" = yes ]]
3022          then
3023             totalview   poe  a.out  $ROPTS
3024          else
3025             echo totalview   poe  -a a.out  -procs $numprocs  -rmpool 0  -nodes 1   $ROPTS
3026             export TVDSVRLAUNCHCMD=ssh
3027             totalview   poe  -a a.out  -procs $numprocs  -rmpool 0  -nodes 1   $ROPTS
3028          fi
[211]3029       elif [[ $(echo $localhost | cut -c1-5) = lcsgi ]]
3030       then
3031             # CURRENTLY NO DEBUGGER ON LCSGI
3032          if [[ $run_coupled_model = true ]]
3033          then
3034             printf "\n  +++ no debug in coupled mode available on \"$localhost\" "
3035             locat=debug
3036             exit
[223]3037          else
3038             echo "no_coupling"  >  runfile_atmos
[211]3039          fi
3040          (( ii = $numprocs / $threads_per_task ))
3041          export OMP_NUM_THREADS=$threads_per_task
3042          echo "OMP_NUM_THREADS=$OMP_NUM_THREADS"
3043          if [[ $threads_per_task != 1 ]]
3044          then
3045             printf "\n      threads per task: $threads_per_task"
3046          fi
3047          printf "\n\n"
[223]3048          if [[ $( echo $mpilib | cut -c1-3 ) = mpt ]]
3049          then
3050#             export MPI_LAUNCH_TIMEOUT=360
3051             if [[ "$totalview" = true ]]
3052             then
3053                printf "\n     running totalview debugger"
3054                mpiexec_mpt -tv -n $ii   ./a.out  $ROPTS  < runfile_atmos
3055             else
3056                mpiexec_mpt -np $ii   ./a.out  $ROPTS  < runfile_atmos
3057             fi
3058          elif [[ $( echo $mpilib | cut -c1-3 ) = mva ]]
3059          then
3060#             ulimit -s 300000   # A too large stack size causes problems
3061#             export MV2_NUM_PORTS=2
3062#             export MV2_CPU_MAPPING=0:1:2:3
[362]3063             if [[ "$totalview" = true ]]
3064             then
3065                printf "\n     running totalview debugger"
3066                mpiexec -tv ./a.out  $ROPTS  < runfile_atmos
3067             else
3068                mpiexec    ./a.out  $ROPTS  < runfile_atmos
3069             fi
[223]3070          fi
[1]3071       else
3072          printf "\n  +++ no debug available on \"$localhost\" "
3073          printf "\n      or not implemented in mrun so far"
3074          locat=debug
3075          exit
3076       fi
3077    else
3078       if [[ -n $numprocs ]]
3079       then
3080             # RUNNING THE PROGRAM ON PARALLEL MACHINES
3081          if [[ $(echo $host | cut -c1-3) = ibm ]]
3082          then
3083                # SETUP THE IBM MPI ENVIRONMENT
[312]3084             if [[ $host != ibmh ]]
3085             then
3086                export MP_SHARED_MEMORY=yes
3087                export AIXTHREAD_SCOPE=S
3088                export OMP_NUM_THREADS=$threads_per_task
3089                export XLSMPOPTS="spins=0:yields=0:stack=20000000"
3090                export AUTHSTATE=files
3091                export XLFRTEOPTS="nlwidth=132:err_recovery=no"    # RECORD-LENGTH OF NAMELIST-OUTPUT
3092                #  export MP_PRINTENV=yes
[1]3093
[312]3094                   # TUNING-VARIABLEN ZUR VERBESSERUNG DER KOMMUNIKATION
3095                   # ZEIGEN ABER DERZEIT (SEP 04, FEDERATION) KAUM WIRKUNG
3096                export MP_WAIT_MODE=poll
3097                [[ $node_usage = not_shared ]]  &&  export MP_SINGLE_THREAD=yes
3098             fi
[1]3099             if [[ "$LOADLBATCH" = yes ]]
3100             then
3101                printf "\n--- Control: OMP_NUM_THREADS = \"$OMP_NUM_THREADS\" \n"
3102                if [[ "$cond1" = hpmcount  ||  "$cond2" = hpmcount ]]
3103                then
[102]3104                   /opt/optibm/HPM_2_4_1/bin/hpmcount  a.out  $ROPTS
[1]3105                else
[343]3106                   if [[ $run_coupled_model = false ]]
3107                   then
3108                      if [[ "$ocean_file_appendix" = true ]]
3109                      then
3110                         echo "precursor_ocean"  >  runfile_atmos
3111                      else
3112                         echo "precursor_atmos"  >  runfile_atmos
3113                      fi
3114                   else
3115                      (( iia = $numprocs_atmos / $threads_per_task ))
3116                      (( iio = $numprocs_ocean / $threads_per_task ))
3117                      printf "\n      coupled run ($iia atmosphere, $iio ocean)"
3118                      printf "\n      using $coupled_mode coupling"
3119                      printf "\n\n"
3120                      echo "coupled_run $iia $iio"  >  runfile_atmos
3121                   fi
3122                   poe ./a.out  $ROPTS  <  runfile_atmos
[1]3123                fi
3124             else
3125                if [[ $localhost = ibmb  ||  $localhost = ibmh  ||  $localhost = ibms ]]
3126                then
[102]3127                   poe  a.out  -procs $numprocs  -nodes 1  -rmpool 0  $ROPTS
[1]3128                elif [[ $localhost = ibmy ]]
3129                then
3130                   if [[ -f $hostfile ]]
3131                   then
3132                      cp  $hostfile  hostfile
3133                   else
3134                      (( ii = 1 ))
3135                      while (( ii <= $numprocs ))
3136                      do
3137                         echo  $localhost_realname  >>  hostfile
3138                         (( ii = ii + 1 ))
3139                      done
3140                   fi
3141                   export MP_HOSTFILE=hostfile
[331]3142                   if [[ $run_coupled_model = false ]]
3143                   then
3144                      if [[ "$ocean_file_appendix" = true ]]
3145                      then
3146                         echo "precursor_ocean"  >  runfile_atmos
3147                      else
3148                         echo "precursor_atmos"  >  runfile_atmos
3149                      fi
3150                   else
3151                      (( iia = $numprocs_atmos / $threads_per_task ))
3152                      (( iio = $numprocs_ocean / $threads_per_task ))
3153                      printf "\n      coupled run ($iia atmosphere, $iio ocean)"
3154                      printf "\n      using $coupled_mode coupling"
3155                      printf "\n\n"
3156                      echo "coupled_run $iia $iio"  >  runfile_atmos
3157                   fi
3158                   ./a.out  -procs $tasks_per_node  $ROPTS  <  runfile_atmos
3159
[1]3160                else
3161                   if [[ "$host_file" = "" ]]
3162                   then
3163                      printf "\n  +++ no hostfile given in configuration file"
3164                      locat=config_file
3165                      exit
3166                   else
3167                      eval host_file=$host_file
3168                   fi
3169                   export MP_HOSTFILE=$host_file
[102]3170                   poe  a.out  -procs $numprocs  -tasks_per_node $numprocs  $ROPTS
[1]3171                fi
3172             fi
[251]3173          elif [[ $host = nech  ||  $host = necriam ]]
[1]3174          then
3175             (( ii = nodes ))
3176             if [[ $ii = 1 ]]
3177             then
3178                export F_ERRCNT=0        # acceptable number of errors before program is stopped
3179                export MPIPROGINF=YES
[61]3180                #  export F_TRACE=YES|FMT1|FMT2  # output of ftrace informations to job protocol
[1]3181                echo "*** execution on single node with mpirun"
[102]3182                mpirun  -np $numprocs  ./a.out  $ROPTS
[1]3183             else
3184                (( i = 0 ))
3185                while (( i < ii ))
3186                do
3187                   echo "-h $i  -p $tasks_per_node  -e ./mpi_exec_shell"  >>  multinode_config
3188                   (( i = i + 1 ))
3189                done
3190
3191                echo "#!/bin/sh"                         >   mpi_exec_shell
3192                echo " "                                 >>  mpi_exec_shell
3193                echo "set -u"                            >>  mpi_exec_shell
3194                echo "F_ERRCNT=0"                        >>  mpi_exec_shell
3195                echo "MPIPROGINV=YES"                    >>  mpi_exec_shell
3196                echo "OMP_NUM_THREADS=$threads_per_task" >>  mpi_exec_shell
3197                echo "cpurest=$cpurest"                  >>  mpi_exec_shell
3198                echo "fname=$fname"                      >>  mpi_exec_shell
3199                echo "localhost=$localhost"              >>  mpi_exec_shell
3200                echo "return_addres=$return_addres"      >>  mpi_exec_shell
3201                echo "return_username=$return_username"  >>  mpi_exec_shell
3202                echo "tasks_per_node=$tasks_per_node"    >>  mpi_exec_shell
3203                echo "write_binary=$write_binary"        >>  mpi_exec_shell
3204                echo "use_seperate_pe_for_dvrp_output=$use_seperate_pe_for_dvrp_output"  >>  mpi_exec_shell
3205                echo "  "                                >>  mpi_exec_shell
3206                echo "export F_ERRCNT"                   >>  mpi_exec_shell
3207                echo "export MPIPROGINV"                 >>  mpi_exec_shell
3208                echo "export OMP_NUM_THREADS"            >>  mpi_exec_shell
3209                echo "export cpurest"                    >>  mpi_exec_shell
3210                echo "export fname"                      >>  mpi_exec_shell
3211                echo "export localhost"                  >>  mpi_exec_shell
3212                echo "export return_addres"              >>  mpi_exec_shell
3213                echo "export return_username"            >>  mpi_exec_shell
3214                echo "export tasks_per_node"             >>  mpi_exec_shell
3215                echo "export write_binary"               >>  mpi_exec_shell
3216                echo "export use_seperate_pe_for_dvrp_output"  >>  mpi_exec_shell
3217                echo " "                                 >>  mpi_exec_shell
[102]3218                echo "exec  ./a.out"                     >>  mpi_exec_shell
[1]3219
3220                chmod u+x  mpi_exec_shell
3221                export MPIPROGINF=YES
3222                mpirun  -f multinode_config  &
3223                wait
3224
3225             fi
[440]3226          elif [[ $(echo $host | cut -c1-2) = lc  &&  $host != lckyoto &&  $host != lctit ]]
[1]3227          then
3228
3229                # COPY HOSTFILE FROM SOURCE DIRECTORY OR CREATE IT, IF IT
3230                # DOES NOT EXIST
[179]3231             if [[ $host != lcsgih  &&  $host != lcsgib ]]
[1]3232             then
[179]3233                if [[ -f $hostfile ]]
3234                then
3235                   cp  $hostfile  hostfile
3236                else
3237                   (( ii = 1 ))
3238                   while (( ii <= $numprocs / $threads_per_task ))
3239                   do
3240                      echo  $localhost_realname  >>  hostfile
3241                      (( ii = ii + 1 ))
3242                   done
3243                fi
3244                eval zeile=\"`head -n $ii  hostfile`\"
3245                printf "\n  *** running on: $zeile"
[1]3246             fi
[179]3247
[1]3248             (( ii = $numprocs / $threads_per_task ))
3249             export OMP_NUM_THREADS=$threads_per_task
[246]3250#             echo "OMP_NUM_THREADS=$OMP_NUM_THREADS"
[1]3251             if [[ $threads_per_task != 1 ]]
3252             then
[405]3253                   # increase stack size to unlimited, because large runs
3254                   # may abort otherwise
3255                ulimit -Ss unlimited
3256                printf "\n      threads per task: $threads_per_task  stacksize: unlimited"
[1]3257             fi
[102]3258             if [[ $run_coupled_model = false ]]
[1]3259             then
[291]3260                if [[ "$ocean_file_appendix" = true ]]
3261                then
3262                   echo "precursor_ocean"  >  runfile_atmos
3263                else
3264                   echo "precursor_atmos"  >  runfile_atmos
3265                fi
[102]3266                printf "\n\n"
[179]3267                if [[ $host = lcsgih  ||  $host = lcsgib ]]
[164]3268                then
[221]3269                   if [[ $( echo $mpilib | cut -c1-3 ) = mpt ]]
3270                   then
[366]3271                          # MPI_DSM_DISTRIBUTE not necessary when MPI_DSM_CPULIST is set
3272                          # export MPI_DSM_DISTRIBUTE=1
3273                          # MPI_DSM_CPULIST: pin MPI processes to cores
[377]3274                      if [[ $use_openmp = false ]]
3275                      then
[412]3276                         if [[ "$sgi_feature" = ice2 ]]
3277                         then
3278                            export MPI_DSM_CPULIST="0,4,1,5,2,6,3,7:allhosts"
3279                         else
3280                            export MPI_DSM_CPULIST="0,1,4,5,2,3,6,7:allhosts"
3281                         fi
[377]3282                      fi
[366]3283                          # MPI_IB_RAILS: use both IB rails on ICE2
3284                      export MPI_BUFS_PER_HOST=512
3285                      export MPI_IB_RAILS=2
[369]3286                          # NECESSARY, IF MORE THAN 4096 PEs ARE USED
3287                      export MPI_CONNECTIONS_THRESHOLD=8192
[412]3288                      echo "*** MPI_DSM_CPULIST=$MPI_DSM_CPULIST"
[223]3289                      mpiexec_mpt -np $ii   ./a.out  $ROPTS  < runfile_atmos
[388]3290
3291                          # next is test for openmp usage
3292                      # mpiexec -n $ii -pernode  ./a.out  $ROPTS  < runfile_atmos
[221]3293                   elif [[ $( echo $mpilib | cut -c1-3 ) = mva ]]
3294                   then
[374]3295                      export MV2_NUM_PORTS=2
[376]3296                      #  The default setting of MV2_CPU_MAPPING gives best results
[405]3297                      # export MV2_ENABLE_AFFINITY=1
[376]3298                      #  export MV2_CPU_MAPPING=0,1,4,5,2,3,6,7
[412]3299               #       if [[ "$sgi_feature" = ice2 ]]
3300               #       then
3301               #          export MV2_CPU_MAPPING=0,4,1,5,2,6,3,7
3302               #       else
3303               #          export MV2_CPU_MAPPING=0,1,4,5,2,3,6,7
3304               #       fi
3305                      echo "*** MV2_CPU_MAPPING=$MV2_CPU_MAPPING"
[405]3306                      if [[ $threads_per_task != 1 ]]
3307                      then
3308                         mpiexec -npernode 1  ./a.out  $ROPTS  <  runfile_atmos
3309                      else
3310                         mpiexec -np $ii  ./a.out  $ROPTS  < runfile_atmos
3311                      fi
[221]3312                   fi
[437]3313                elif [[ $host = lcxt4  ||  $host = lcxt5m ]]
[179]3314                then
[223]3315                   aprun  -n $ii  -N $tasks_per_node  a.out  $ROPTS  < runfile_atmos
[164]3316                else
[223]3317                   mpiexec  -machinefile hostfile  -n $ii  a.out  < runfile_atmos  $ROPTS
[164]3318                fi
[1]3319             else
[164]3320
[206]3321                    # currently there is no full MPI-2 support on ICE and XT4
3322                (( iia = $numprocs_atmos / $threads_per_task ))
3323                (( iio = $numprocs_ocean / $threads_per_task ))
3324                printf "\n      coupled run ($iia atmosphere, $iio ocean)"
3325                printf "\n      using $coupled_mode coupling"
[102]3326                printf "\n\n"
[164]3327
[206]3328                if [[ $coupled_mode = "mpi2" ]]
[164]3329                then
[206]3330                   echo "atmosphere_to_ocean $iia $iio"  >  runfile_atmos
3331                   echo "ocean_to_atmosphere $iia $iio"  >  runfile_ocean
3332                   if [[ $host = lcsgih  ||  $host = lcsgib ]]
3333                   then
[197]3334
[221]3335                      if [[ $( echo $mpilib | cut -c1-3 ) = mpt ]]
3336                      then
3337#                         export MPI_LAUNCH_TIMEOUT=360
3338                         mpiexec_mpt -np $iia  ./a.out  $ROPTS < runfile_atmos &
3339                         mpiexec_mpt -np $iio  ./a.out  $ROPTS < runfile_ocean &
3340                      elif [[ $( echo $mpilib | cut -c1-3 ) = mva ]]
3341                      then
3342#                         ulimit -s 300000   # A too large stack size causes problems
3343#                         export MV2_NUM_PORTS=2
3344#                         export MV2_CPU_MAPPING=0:1:2:3
3345                         mpiexec -n $iia  ./a.out  $ROPTS < runfile_atmos &
3346                         mpiexec -n $iio  ./a.out  $ROPTS < runfile_ocean &
3347                      fi
[197]3348
[437]3349                   elif [[ $host = lcxt4  ||  $host = lcxt5m ]]
[206]3350                   then
[197]3351
[206]3352                      aprun  -n $iia  -N $tasks_per_node  a.out < runfile_atmos  $ROPTS  &
3353                      aprun  -n $iio  -N $tasks_per_node  a.out < runfile_ocean  $ROPTS  &
3354
3355                   else
3356                          # WORKAROUND BECAUSE mpiexec WITH -env option IS NOT AVAILABLE ON SOME SYSTEMS
3357                       mpiexec  -machinefile hostfile  -n $iia  a.out  $ROPTS  <  runfile_atmos &
3358                       mpiexec  -machinefile hostfile  -n $iio  a.out  $ROPTS  <  runfile_ocean &
3359#                       mpiexec  -machinefile hostfile  -n $iia  -env coupling_mode atmosphere_to_ocean  a.out  $ROPTS  &
3360#                       mpiexec  -machinefile hostfile  -n $iio  -env coupling_mode ocean_to_atmosphere  a.out  $ROPTS  &
3361                   fi
3362                   wait
3363
[164]3364                else
3365
[206]3366                   echo "coupled_run $iia $iio"  >  runfile_atmos
3367                   if [[ $host = lcsgih  ||  $host = lcsgib ]]
3368                   then
3369
[221]3370                      if [[ $( echo $mpilib | cut -c1-3 ) = mpt ]]
3371                      then
3372#                         export MPI_LAUNCH_TIMEOUT=360
3373                         mpiexec_mpt -np $ii  ./a.out  $ROPTS < runfile_atmos
3374                      elif [[ $( echo $mpilib | cut -c1-3 ) = mva ]]
3375                      then
3376#                         ulimit -s 300000   # A too large stack size causes problems
3377#                         export MV2_NUM_PORTS=2
3378#                         export MV2_CPU_MAPPING=0:1:2:3
3379                         mpiexec  ./a.out  $ROPTS < runfile_atmos
3380                      fi
[206]3381
[437]3382                   elif [[ $host = lcxt4  ||  $host = lcxt5m ]]
[206]3383                   then
3384
3385                      aprun  -n $ii  -N $tasks_per_node  a.out < runfile_atmos  $ROPTS
3386
[367]3387                   elif [[ $host = lck ]]
3388                   then
3389                         mpiexec -n $ii  ./a.out  $ROPTS < runfile_atmos &
[206]3390                   fi
3391                   wait
[164]3392                fi
[102]3393
[206]3394             fi
[1]3395          elif [[ $host = decalpha ]]
3396          then
[102]3397             dmpirun  -np $numprocs  a.out  $ROPTS
[440]3398          elif [[ $host = lckyoto ]]
3399          then
3400             set -xv
3401             export P4_RSHCOMMAND=plesh
3402             echo "     P4_RSHCOMMAND = $P4_RSHCOMMAND"
3403             if [[ "$ENVIRONMENT" = BATCH ]]
3404             then
[505]3405                if [[ "$cond2" = fujitsu ]]
3406                then
3407                   mpiexec  -n $numprocs  ./a.out  $ROPTS  # for fujitsu-compiler
3408                elif [[ "cond2" = pgi ]]
3409                then
3410                   mpirun  -np $numprocs  -machinefile ${QSUB_NODEINF}  ./a.out  $ROPTS
3411                else
3412                   mpirun_rsh -np $numprocs -hostfile ${QSUB_NODEINF} MV2_USE_SRQ=0 ./a.out ${ROPTS} || /bin/true
3413                fi
[440]3414             else
[505]3415                if [[ "$cond2" = "" ]]
3416                then
3417                   mpiruni_rsh -np $numprocs ./a.out  $ROPTS  # for intel
3418                else
3419                   mpirun  -np $numprocs  ./a.out  $ROPTS
3420                fi
[440]3421             fi
3422             set +xv
[1]3423          elif [[ $host = lctit ]]
3424          then
3425             export runfile=runfile.$kennung
3426
3427             echo "cd $PWD"                                  >   $runfile
3428             echo "export OMP_NUM_THREADS=$OMP_NUM_THREADS"  >>  $runfile
3429             echo "export cpurest=$cpurest"                  >>  $runfile
3430             echo "export fname=$fname"                      >>  $runfile
3431             echo "export localhost=$localhost"              >>  $runfile
3432             echo "export return_addres=$return_addres"      >>  $runfile
3433             echo "export return_username=$return_username"  >>  $runfile
3434             echo "export tasks_per_node=$tasks_per_node"    >>  $runfile
3435             echo "export write_binary=$write_binary"        >>  $runfile
3436             echo "export use_seperate_pe_for_dvrp_output=$use_seperate_pe_for_dvrp_output"  >>  $runfile
3437             echo "./a.out"                                  >>  $runfile
3438             chmod  u+x  $runfile
3439
3440             if [[ "$QUEUE" = interactive ]]
3441             then
[102]3442                mpirun  -np $numprocs  a.out  $ROPTS
[1]3443             else
[127]3444                 (( mem_tsubame = $memory / 1024.0 ))
3445                 echo "Memory for Tsubame for each process in GB:", $mem_tsubame
[118]3446#                n1ge  -fore  -g 1S060156  -mpi $numprocs  -mem 4  -N palm  -q $queue  a.out  $ROPTS
[265]3447#               /n1ge/TITECH_GRID/tools/bin/n1ge -fore -g $group_number -mpi ${numprocs}:$tasks_per_node -mem $mem_tsubame -N palm -rt $minuten -q $queue  a.out  $ROPTS
3448                 n1ge -fore -g $group_number -mpi ${numprocs}:$tasks_per_node -mem $mem_tsubame -N palm -rt $minuten -q $queue  a.out  $ROPTS
[1]3449             fi
3450
3451             rm  $runfile
3452          else
[102]3453             mpprun  -n $numprocs  a.out  $ROPTS
[1]3454          fi
3455          [[ $? != 0 ]]  &&  execution_error=true
3456
3457
3458             # PERFORMANCE-AUSWERTUNG MIT APPRENTICE
3459          if [[ "$cond1" = apprentice  ||  "$cond2" = apprentice ]]
3460          then
3461             apprentice
3462          fi
3463       else
[102]3464          a.out  $ROPTS
[1]3465       fi
3466    fi
3467    if [[ $? != 0  ||  $execution_error = true ]]
3468    then
3469
3470          # ABBRUCH BEI LAUFZEITFEHLER
[102]3471#       [[ ! ( "$cond1" = debug  ||  "$cond2" = debug ) ]]  &&  cat  aout_output*
[1]3472       printf "\n  +++ runtime error occured"
3473       locat=execution
3474       exit
3475    else
[102]3476#       [[ ! ( "$cond1" = debug  ||  "$cond2" = debug ) ]]  &&  cat  aout_output*
[1]3477       printf "\n$striche\n  *** execution finished \n"
[260]3478
[261]3479          # Stop the dvr streaming server and process the dvr output in order
3480          # to create dvrs- and html-files containing all streams
[260]3481       if [[ "$dvrserver_id" != "" ]]
3482       then
3483          kill $dvrserver_id
3484          printf "\n  *** dvr server with id=$dvrserver_id has been stopped"
[261]3485
[262]3486             # If there is a directory, data have been output by the
3487             # streaming server. Otherwise, user has chosen dvrp_output=local
3488          if [[ -d DATA_DVR ]]
3489          then
[261]3490
[262]3491                # Add the current dvr configuration file to the dvr output
3492                # directory
3493             cp  .dvrserver.config  DATA_DVR
3494
3495                # Process the dvr output (option -s for also generating
3496                # sequence mode data)
3497             process_dvr_output  -d DATA_DVR  -f $fname  -s
3498
3499          else
3500
3501                # Process the local output
3502             process_dvr_output  -l  -d DATA_DVR  -f $fname
3503
3504          fi
3505
3506       elif [[ $(echo $package_list | grep -c dvrp_graphics) != 0 ]]
3507       then
3508
3509             # Process dvr output generated in local mode (dvrp_output=local)
3510          process_dvr_output  -l  -d DATA_DVR  -f $fname
3511
[260]3512       fi
[1]3513    fi
3514
3515
3516
[503]3517       # Call of combine_plot_fields in order to merge single files written
3518       # by each PE into one file.
3519    if [[ ! -f ${PALM_BIN}/combine_plot_fields${block}.x ]]
3520    then
3521       printf "\n\n\n  +++ WARNING: no combine_plot_fields found for given block \"$cond1 $cond2\""
3522       printf "\n      2d- and/or 3d-data may be incomplete!"
3523       printf "\n      Run \"mbuild -u -h $localhost\" to generate utilities for this block.\n"
3524    else
3525       printf "\n\n\n *** post-processing: now executing \"combine_plot_fields${block}.x\" ..."
3526       combine_plot_fields${block}.x
3527    fi
3528
3529
3530
[1]3531       # EVENTUELLE OUTPUT-KOMMANDOS ABARBEITEN
3532    (( i = 0 ))
3533    while (( i < ioc ))
3534    do
3535       (( i = i + 1 ))
3536       if (( i == 1 ))
3537       then
3538          printf "\n\n  *** execution of OUTPUT-commands:\n$striche"
3539       fi
3540       printf "\n  >>> ${out_command[$i]}"
3541       eval  ${out_command[$i]}
3542       if (( i == ioc ))
3543       then
3544          printf "\n$striche\n"
3545       fi
3546    done
3547
3548
3549       # EVTL. INHALT DES AKTUELLEN VERZEICHNISSES AUSGEBEN
3550    if [[ $do_trace = true ]]
3551    then
3552       printf "\n\n"
3553       ls -al
3554    fi
3555
3556
3557
3558       # OUTPUT-DATEIEN AN IHRE ZIELORTE KOPIEREN
3559    (( i = 0 ))
3560    while (( i < iout ))
3561    do
3562       (( i = i + 1 ))
3563       if (( i == 1 ))
3564       then
3565          printf "\n\n  *** saving OUTPUT-files:\n$striche"
3566       fi
3567
3568          # PRUEFEN, OB EINZELDATEI ODER DATEI PRO PROZESSOR
3569       files_for_pes=false; filetyp=file
3570       if [[ "${actionout[$i]}" = pe  &&  -n $numprocs ]]
3571       then
3572          files_for_pes=true; filetyp=directory
3573          actionout[$i]=""
3574       elif [[ "${actionout[$i]}" = pe  &&  ! -n $numprocs ]]
3575       then
3576          actionout[$i]=""
3577       elif [[ "${actionout[$i]}" = arpe  &&  -n $numprocs ]]
3578       then
3579          files_for_pes=true; filetyp=directory
3580          actionout[$i]="ar"
3581       elif [[ "${actionout[$i]}" = arpe  &&  ! -n $numprocs ]]
3582       then
3583          actionout[$i]="ar"
3584       elif [[ "${actionout[$i]}" = flpe  &&  -n $numprocs ]]
3585       then
3586          files_for_pes=true; filetyp=directory
3587          actionout[$i]="fl"
3588       elif [[ "${actionout[$i]}" = flpe  &&  ! -n $numprocs ]]
3589       then
3590          actionout[$i]="fl"
3591       elif [[ "${actionout[$i]}" = trpe  &&  -n $numprocs ]]
3592       then
3593          files_for_pes=true; filetyp=directory
3594          actionout[$i]="tr"
3595       elif [[ "${actionout[$i]}" = trpe  &&  ! -n $numprocs ]]
3596       then
3597          actionout[$i]="tr"
3598       fi
3599
3600       if [[ ! -f ${localout[$i]}  &&  $files_for_pes = false ]]
3601       then
3602          printf "\n  +++ temporary OUTPUT-file  ${localout[$i]}  does not exist\n"
[260]3603       elif [[ ! -d ${localout[$i]}  &&  $files_for_pes = true ]]
[1]3604       then
3605          printf "\n  +++ temporary OUTPUT-file  ${localout[$i]}/....  does not exist\n"
3606       else
3607
3608
3609             # KOPIEREN PER FTP/SCP (IMMER IM BINAERMODUS, -M: FALLS ZIELKATALOG
3610             # NICHT VORHANDEN, WIRD VERSUCHT, IHN ANZULEGEN), ABER NUR BEI
3611             # REMOTE-RECHNUNGEN
3612          if [[ "${actionout[$i]}" = tr ]]
3613          then
3614             if [[ $localhost != $fromhost ]]
3615             then
3616                if [[ $files_for_pes = false ]]
3617                then
3618                   cps=""
3619                   cst=""
3620                else
3621                   cps=-c
3622                   cst="/"
3623                fi
[325]3624                if [[ $localhost = ibmb  ||  $localhost = nech ]]
[1]3625                then
3626
3627                      # TRANSFER IN EIGENSTAENDIGEM JOB
3628                      # ZUERST KOPIE DER DATEI INS TEMPORAERE DATENVERZEICHNIS
3629                   [[ ! -d $tmp_data_catalog/TRANSFER ]]  &&  mkdir -p  $tmp_data_catalog/TRANSFER
3630                   file_to_transfer=${fname}_${localout[$i]}_to_transfer_$kennung
3631                   if [[ $files_for_pes = false ]]
3632                   then
3633                      ln -f  ${localout[$i]}  $tmp_data_catalog/TRANSFER/$file_to_transfer
3634                   else
3635                      mkdir  $tmp_data_catalog/TRANSFER/$file_to_transfer
3636                      ln  ${localout[$i]}/*  $tmp_data_catalog/TRANSFER/$file_to_transfer
3637                   fi
3638
3639                   echo "set -x"                                    >    transfer_${localout[$i]}
3640                   echo "cd  $tmp_data_catalog/TRANSFER"            >>   transfer_${localout[$i]}
[82]3641
3642                   printf "\n  >>> OUTPUT: ${localout[$i]}$cst  by SCP in seperate job to"
3643                   printf "\n              ${pathout[$i]}/${localhost}_${fname}${endout[$i]}$cst"
3644                   printf "\n              or higher cycle\n"
3645                   echo "batch_scp $cps -b -m -u $return_username $return_addres  $file_to_transfer \"${pathout[$i]}\" ${localhost}_${fname}${endout[$i]}  ${extout[$i]}"  >>  transfer_${localout[$i]}
3646
[1]3647                   echo "[[ \$? = 0 ]]  &&  rm  $file_to_transfer"  >>  transfer_${localout[$i]}
3648
3649                   if [[ $localhost = nech ]]
3650                   then
[82]3651                      subjob  -d  -c /pf/b/$usern/job_queue  -v  -q pp  -X 0  -m 1000  -t 900  transfer_${localout[$i]}
[1]3652                   else
3653                      if [[ "$LOGNAME" = b323013 ]]
3654                      then
[164]3655                         subjob  -v  -q c1  -X 0  -m 1000  -t 900  -c $job_catalog  transfer_${localout[$i]}
[1]3656                      else
[164]3657                         subjob  -d  -v  -q c1  -X 0  -m 1000  -t 900  -c $job_catalog  transfer_${localout[$i]}
[1]3658                      fi
3659                   fi
3660
3661                else
3662
3663                      # TRANSFER INNERHALB DIESES JOBS
3664                   transfer_failed=false
[82]3665                   printf "\n  >>> OUTPUT: ${localout[$i]}$cst  by SCP to"
3666                   printf "\n              ${pathout[$i]}/${localhost}_${fname}${endout[$i]}$cst\n"
3667                   batch_scp $cps -b -m -u $return_username $return_addres  ${localout[$i]} "${pathout[$i]}" ${localhost}_${fname}${endout[$i]}  ${extout[$i]}
3668                   [[ $? != 0 ]]  &&  transfer_failed=true
[1]3669
3670                      # BEI FEHLGESCHLAGENEM TRANSFER SICHERUNGSKOPIE AUF
3671                      # LOKALER MASCHINE ANLEGEN
3672                   if [[ $transfer_failed = true ]]
3673                   then
3674                      printf "  +++ transfer failed. Trying to save a copy on the local host under:\n"
3675                      printf "      ${pathout[$i]}/${localhost}_${fname}${endout[$i]}_$kennung\n"
3676
3677                         # ERSTMAL PRUEFEN, OB VERZEICHNIS EXISTIERT. GEGEBENENFALLS
3678                         # ANLEGEN.
3679                      eval  local_catalog=${pathout[$i]}
3680                      if [[ ! -d $local_catalog ]]
3681                      then
3682                         printf "  *** local directory does not exist. Trying to create:\n"
3683                         printf "      $local_catalog \n"
3684                         mkdir -p  $local_catalog
3685                      fi
3686                      eval  cp  ${localout[$i]}  ${pathout[$i]}/${localhost}_${fname}${endout[$i]}_$kennung
3687                      transfer_problems=true
3688                   fi
3689                fi
3690             else
3691
3692                   # WERTZUWEISUNG, SO DASS WEITER UNTEN NUR KOPIERT WIRD
3693                actionout[$i]=""
3694             fi
3695          fi
3696
3697
3698             # APPEND PER FTP/SCP (IMMER IM BINAERMODUS, -M: FALLS ZIELKATALOG
3699             # NICHT VORHANDEN, WIRD VERSUCHT, IHN ANZULEGEN), ABER NUR BEI
3700             # REMOTE-RECHNUNGEN
3701          if [[ "${actionout[$i]}" = tra ]]
3702          then
3703             if [[ $localhost != $fromhost ]]
3704             then
3705                if [[ $localhost = ibmh  ||  $localhost = ibmb  ||  $localhost = nech ]]
3706                then
3707
3708                      # TRANSFER IN EIGENSTAENDIGEM JOB
3709                      # ZUERST KOPIE DER DATEI INS TEMPORAERE DATENVERZEICHNIS
3710                   [[ ! -d $tmp_data_catalog/TRANSFER ]]  &&  mkdir -p  $tmp_data_catalog/TRANSFER
3711                   file_to_transfer=${fname}_${localout[$i]}_to_transfer_$kennung
3712                   ln -f  ${localout[$i]}  $tmp_data_catalog/TRANSFER/$file_to_transfer
3713
3714                   echo "set -x"                                    >    transfer_${localout[$i]}
3715                   echo "cd  $tmp_data_catalog/TRANSFER"            >>   transfer_${localout[$i]}
[82]3716
3717                   printf "\n  >>> OUTPUT: ${localout[$i]}  append by SCP in seperate job to"
3718                   printf "\n              ${pathout[$i]}/${localhost}_${fname}${endout[$i]}"
3719                   printf "\n              or higher cycle\n"
3720                   echo "batch_scp -A -b -m -u $return_username $return_addres  $file_to_transfer \"${pathout[$i]}\" ${localhost}_${fname}${endout[$i]}  ${extout[$i]}"  >>  transfer_${localout[$i]}
3721
[1]3722                   echo "[[ \$? = 0 ]]  &&  rm  $file_to_transfer"  >>  transfer_${localout[$i]}
3723
3724                   if [[ $localhost = nech ]]
3725                   then
[82]3726                      subjob  -d  -c /pf/b/$usern/job_queue  -v  -q pp  -X 0  -m 1000  -t 900  transfer_${localout[$i]}
[1]3727                   else
3728                      if [[ $LOGNAME = b323013 ]]
3729                      then
[164]3730                         subjob  -v  -q c1  -X 0  -m 1000  -t 900  -c $job_catalog  transfer_${localout[$i]}
[1]3731                      else
[164]3732                         subjob  -d  -v  -q c1  -X 0  -m 1000  -t 900  -c $job_catalog  transfer_${localout[$i]}
[1]3733                      fi
3734                   fi
3735
3736                else
3737
3738                      # TRANSFER INNERHALB DIESES JOBS
3739                   transfer_failed=false
[82]3740                   printf "\n  >>> OUTPUT: ${localout[$i]}  append by SCP to"
3741                   printf "\n              ${pathout[$i]}/${localhost}_${fname}${endout[$i]}\n"
3742                   batch_scp -A -b -m -u $return_username  $return_addres ${localout[$i]} "${pathout[$i]}" ${localhost}_${fname}${endout[$i]}  ${extout[$i]}
3743                   [[ $? != 0 ]]  &&  transfer_failed=true
[1]3744
3745                      # BEI FEHLGESCHLAGENEM TRANSFER SICHERUNGSKOPIE AUF
3746                      # LOKALER MASCHINE ANLEGEN
3747                   if [[ $transfer_failed = true ]]
3748                   then
3749                      printf "  +++ transfer failed. Trying to save a copy on the local host under:\n"
3750                      printf "      ${pathout[$i]}/${localhost}_${fname}${endout[$i]}_$kennung\n"
3751
3752                         # ERSTMAL PRUEFEN, OB VERZEICHNIS EXISTIERT. GEGEBENENFALLS
3753                         # ANLEGEN
3754                      eval  local_catalog=${pathout[$i]}
3755                      if [[ ! -d $local_catalog ]]
3756                      then
3757                         printf "  *** local directory does not exist. Trying to create:\n"
3758                         printf "      $local_catalog \n"
3759                         mkdir -p  $local_catalog
3760                      fi
3761
3762                      eval  cp  ${localout[$i]}  ${pathout[$i]}/${localhost}_${fname}${endout[$i]}_$kennung
3763                      transfer_problems=true
3764                   fi
3765                fi
3766             else
3767
3768                   # WERTZUWEISUNG, SO DASS WEITER UNTEN NUR APPEND AUF
3769                   # LOKALER MASCHINE DURCHGEFUEHRT WIRD
3770                actionout[$i]=a
3771             fi
3772          fi
3773
3774
3775             # OUTPUT-DATEI FUER EINEN FORTSETZUNGSLAUF. DATEI WIRD PER
3776             # LINK AUF DEN TEMPORAEREN DATENKATALOG GELEGT. OPTION -f WIRD
3777             # VERWENDET, FALLS DORT NOCH EINE DATEI GLEICHEN NAMENS VORHANDEN
3778             # SEIN SOLLTE. ANSCHLIESSEND WIRD SEINE ARCHIVIERUNG ANGESTOSSEN
3779          if [[ "${actionout[$i]}" = fl ]]
3780          then
3781             [[ ! -d $tmp_data_catalog ]]  &&  mkdir -p  $tmp_data_catalog
3782             chmod  g+rx  $tmp_data_catalog
3783             if [[ $files_for_pes = false ]]
3784             then
3785                printf "\n  >>> OUTPUT: ${localout[$i]}  to"
3786                printf "\n              $tmp_data_catalog/${frelout[$i]} (temporary data catalog)\n"
3787                ln -f  ${localout[$i]}  $tmp_data_catalog/${frelout[$i]}
3788             else
3789                printf "\n  >>> OUTPUT: ${localout[$i]}/....  to"
3790                printf "\n              $tmp_data_catalog/${frelout[$i]} (temporary data catalog)\n"
3791                mkdir  $tmp_data_catalog/${frelout[$i]}
[149]3792                cd ${localout[$i]}
3793                for file in $(ls *)
3794                do
3795                   ln -f $file $tmp_data_catalog/${frelout[$i]}
3796                done
3797                cd $TEMPDIR
[1]3798             fi
3799
3800
3801                # ARCHIVIERUNGSJOB WIRD ERZEUGT UND ABGESCHICKT
3802             if [[ $store_on_archive_system = true ]]
3803             then
3804
3805                if [[ $archive_system = asterix ]]
3806                then
3807                   echo "cd  $tmp_data_catalog"                      >> archive_${frelout[$i]}
3808                   if [[ $files_for_pes = false ]]
3809                   then
3810                      echo "stageout  ${frelout[$i]}  > STAGE_OUTPUT${i}_$kennung" >> archive_${frelout[$i]}
3811                   else
3812                      echo "stageout -t  ${frelout[$i]}  > STAGE_OUTPUT${i}_$kennung" >> archive_${frelout[$i]}
3813                   fi
3814                   echo "cat  STAGE_OUTPUT${i}_$kennung"               >> archive_${frelout[$i]}
3815                   echo "if [[ \$(grep -c \"st.msg:150\"  STAGE_OUTPUT${i}_$kennung) != 0 ]]" >> archive_${frelout[$i]}
3816                   echo "then"                                       >> archive_${frelout[$i]}
3817                   echo "   do_stageout=false"                       >> archive_${frelout[$i]}
3818                   echo "else"                                       >> archive_${frelout[$i]}
3819                   echo "   echo \"  +++ $filetyp ${frelout[$i]}  could not be stored on archive-system\" " >> archive_${frelout[$i]}
3820                   echo "   cat  /dev/null  >  ~/job_queue/ARCHIVE_ERROR_$fname" >> archive_${frelout[$i]}
3821                   echo "   cat  STAGE_OUTPUT${i}_$kennung  >  ~/job_queue/archive_${frelout[$i]}_error" >> archive_${frelout[$i]}
3822                   echo "   echo \"  *** $filetyp ${frelout[$i]} will be copied to \$WORK as backup\" " >> archive_${frelout[$i]}
3823                   if [[ $files_for_pes = false ]]
3824                   then
3825                      echo "   cp   ${frelout[$i]}  \$WORK"                    >> archive_${frelout[$i]}
3826                   else
3827                      echo "   cp -r  ${frelout[$i]}  \$WORK/${frelout[$i]}"   >> archive_${frelout[$i]}
3828                   fi
3829                   echo "   echo \"  *** $filetyp ${frelout[$i]} saved\" " >> archive_${frelout[$i]}
3830                   echo "fi"                                         >> archive_${frelout[$i]}
3831                   echo "rm  STAGE_OUTPUT${i}_$kennung"              >> archive_${frelout[$i]}
3832                elif [[ $archive_system = DMF ]]
3833                then
3834                   echo "cd  $tmp_data_catalog"                      >> archive_${frelout[$i]}
3835                   if [[ $files_for_pes = false ]]
3836                   then
3837                      printf "\n  +++ archiving of single files impossible with $archive_system !\n"
3838                      locat=DMF
3839                      exit
3840                   else
3841                         # FUER RECHNER IN JUELICH. DORT KOENNTEN AUCH
3842                         # EINZELNE DATEIEN GESICHERT WERDEN (SPAETER KORR.)
3843                      echo "rm -rf  \$ARCHIVE/${frelout[$i]}"     >> archive_${frelout[$i]}
3844                      echo "cp -r  ${frelout[$i]}  \$ARCHIVE"     >> archive_${frelout[$i]}
3845                   fi
3846                elif [[ $archive_system = tivoli ]]
3847                then
3848                   echo "cd  $tmp_data_catalog"                       >> archive_${frelout[$i]}
3849                   if [[ $files_for_pes = false ]]
3850                   then
3851                         # EVENTUELL NOCH VORHANDENE DATEI IM ARCHIV LOSCHEN
3852                      echo "set -x"                                   >> archive_${frelout[$i]}
3853                      echo "rm  -rf  \$PERM/${frelout[$i]}"           >> archive_${frelout[$i]}
3854                      echo "cp  ${frelout[$i]} \$PERM/${frelout[$i]}" >> archive_${frelout[$i]}
3855                   else
3856
3857                      echo "set -x"                                   >> archive_${frelout[$i]}
3858                      echo "rm  -rf  \$PERM/${frelout[$i]}/*"         >> archive_${frelout[$i]}
3859                      echo "[[ ! -d \$PERM/${frelout[$i]} ]] && mkdir $PERM/${frelout[$i]}" >> archive_${frelout[$i]}
3860                      cd  $tmp_data_catalog
3861                      all_files=`ls -1 ${frelout[$i]}/*`
3862                      cd -  > /dev/null
3863                      (( inode = 0 ))
3864                      (( tp1   = tasks_per_node + 1 ))
3865                      while (( inode < nodes ))
3866                      do
3867#                         echo "*** all_files = \"$all_files\" "
3868                         files=`echo $all_files | cut -d" " -f1-$tasks_per_node`
3869                         all_files=`echo $all_files | cut -d" " -f$tp1-`
3870#                         echo "*** tasks_per_node = \"$tasks_per_node\" "
3871#                         echo "*** files = \"$files\" "
3872#                         echo "*** all_files = \"$all_files\" "
[416]3873                        echo "tar  cvf \$PERM/${frelout[$i]}/${frelout[$i]}.node_$inode.tar $files"   >> archive_${frelout[$i]}
3874                        ### echo "tar  cvf ${frelout[$i]}.node_$inode.tar $files"   >> archive_${frelout[$i]}
3875                        ### echo "cp ${frelout[$i]}.node_$inode.tar \$PERM/${frelout[$i]}/"   >> archive_${frelout[$i]}
3876                         ###echo "rm ${frelout[$i]}.node_$inode.tar"   >> archive_${frelout[$i]}
[397]3877#                         echo "dsmc incremental  \$PERM/${frelout[$i]}/${frelout[$i]}.node_$inode.tar" >> archive_${frelout[$i]}
3878#                         echo "dsmmigrate \$PERM/${frelout[$i]}/${frelout[$i]}.node_$inode.tar"        >> archive_${frelout[$i]}
[1]3879                         (( inode = inode + 1 ))
3880                      done
3881#                      echo "rm  -rf  \$PERM/${frelout[$i]}.tar"       >> archive_${frelout[$i]}
3882#                      echo "tar  cvf \$PERM/${frelout[$i]}.tar ${frelout[$i]}" >> archive_${frelout[$i]}
3883                   fi
3884                elif [[ $archive_system = ut ]]
3885                then
3886                   echo "cd  $tmp_data_catalog"                       >> archive_${frelout[$i]}
3887                   if [[ $files_for_pes = false ]]
3888                   then
3889                         # EVENTUELL NOCH VORHANDENE DATEI IM ARCHIV LOSCHEN
3890                      echo "set -x"                                 >> archive_${frelout[$i]}
3891                      echo "rm  -rf  \$UT/${frelout[$i]}"           >> archive_${frelout[$i]}
3892                      echo "cp  ${frelout[$i]} \$UT/${frelout[$i]}" >> archive_${frelout[$i]}
3893                   else
3894
3895                      echo "set -x"                                 >> archive_${frelout[$i]}
3896                      echo "rm  -rf  \$UT/${frelout[$i]}/*"         >> archive_${frelout[$i]}
3897                      echo "[[ ! -d \$UT/${frelout[$i]} ]] && mkdir $UT/${frelout[$i]}" >> archive_${frelout[$i]}
3898                      cd  $tmp_data_catalog
3899                      all_files=`ls -1 ${frelout[$i]}/*`
3900                      cd -  > /dev/null
3901                      (( inode = 0 ))
3902                      (( tp1   = tasks_per_node + 1 ))
3903                      while (( inode < nodes ))
3904                      do
3905                         files=`echo $all_files | cut -d" " -f1-$tasks_per_node`
3906                         all_files=`echo $all_files | cut -d" " -f$tp1-`
3907                         echo "tar  cvf \$UT/${frelout[$i]}/${frelout[$i]}.node_$inode.tar $files"   >> archive_${frelout[$i]}
3908                         (( inode = inode + 1 ))
3909                      done
3910                   fi
3911                elif [[ $archive_system = none ]]
3912                then
3913                   printf "              +++ archiving on $localhost not available!\n"
3914                fi
3915
3916                if [[ $archive_system != none ]]
3917                then
[399]3918                   if [[ $localhost = lcsgih  ||  $localhost = lcsgib ]]
[1]3919                   then
[164]3920#                      subjob  -d  -v  -q cdata  -X 0  -m 1000  -t 43200  -c $job_catalog  archive_${frelout[$i]}
[416]3921                      subjob   -v  -q permq  -X 1 -T 1  -m 1000  -t 172800  -c $job_catalog  archive_${frelout[$i]}
[1]3922                   elif [[ $localhost = nech ]]
3923                   then
[82]3924                      subjob  -d  -c /pf/b/$usern/job_queue  -v  -q pp  -X 0  -m 1000  -t 7200  archive_${frelout[$i]}
[1]3925                   fi
3926                   printf "              Archiving of $tmp_data_catalog/${frelout[$i]} initiated (batch job submitted)\n"
3927                fi
3928             else
[399]3929                printf "              +++ caution: option -A is switched off. No archiving on $archive_system!\n"
[1]3930             fi
3931
3932
3933                # LEERDATEI IM BENUTZERVERZEICHNIS ANLEGEN, DAMIT BEKANNT IST,
3934                # WIE DIE HOECHSTE ZYKLUSNUMMER AUF DEM ARCHIV-SYSTEM LAUTET
3935             if [[ $files_for_pes = false ]]
3936             then
3937                cat  /dev/null  >  ${pathout[$i]}
3938             else
3939                mkdir -p  ${pathout[$i]}
3940             fi
3941
3942          fi
3943
3944
3945             # KOPIEREN AUF LOKALER MASCHINE ZUM ARCHIV-SYSTEM
3946             # AUSSERDEM MUSS LEERDATEI ANGELEGT WERDEN, DAMIT BEKANNT IST,
3947             # WIE DIE HOECHSTE ZYKLUSNUMMER AUF DEM ARCHIV-SYSTEM LAUTET
3948             # FALLS IRGENDEINE (VON MEHREREN) ARCHIVIERUNGEN SCHIEF GEHT,
3949             # WIRD FLAG GESETZT UND BLEIBT AUCH BEI WEITEREN ORDNUNGS-
3950             # GEMAESSEN ARCHIVIERUNGEN GESETZT
3951          if [[ "${actionout[$i]}" = ar ]]
3952          then
3953             if [[ $files_for_pes = false ]]
3954             then
3955                printf "\n  >>> OUTPUT: ${localout[$i]}  to"
3956                printf "\n              ${pathout[$i]}"
3957                printf "\n              File will be copied to archive-system ($archive_system) !\n"
3958             else
3959                printf "\n  >>> OUTPUT: ${localout[$i]}/_....  to"
3960                printf "\n              ${pathout[$i]}"
3961                printf "\n              Directory will be copied to archive-system ($archive_system) !\n"
3962             fi
3963             mv  ${localout[$i]}  ${frelout[$i]}
3964
3965             file_saved=false
3966
3967             if [[ $archive_system = asterix ]]
3968             then
3969                do_stageout=true
3970                (( stageout_anz = 0 ))
3971                while [[ $do_stageout = true ]]
3972                do
3973                   if [[ $files_for_pes = false ]]
3974                   then
3975                      stageout  ${frelout[$i]}  > STAGE_OUTPUT
3976                   else
3977                      stageout  -t  ${frelout[$i]}  > STAGE_OUTPUT
3978                   fi
3979                   cat  STAGE_OUTPUT
3980                   if [[ $(grep -c "st.msg:150"  STAGE_OUTPUT) != 0 ]]
3981                   then
3982                      file_saved=true
3983                      do_stageout=false
3984                   else
3985                      if [[ $files_for_pes = false ]]
3986                      then
3987                         printf "\n  +++ file ${frelout[$i]}  could not be saved on archive-system"
3988                      else
3989                         printf "\n  +++ directory ${frelout[$i]} could not be saved on archive-system"
3990                      fi
3991                      (( stageout_anz = stageout_anz + 1 ))
3992                      if (( stageout_anz == 10 ))
3993                      then
3994                         printf "\n  +++ stoped after 10 unsuccessful tries!"
3995                         archive_save=false
3996                         do_stageout=false
3997                      else
3998                         printf "\n  *** new try to store on archive after 15 min:"
3999                         sleep 900
4000                      fi
4001                   fi
4002                done
4003             elif [[ $archive_system = DMF ]]
4004             then
4005                if [[ $files_for_pes = false ]]
4006                then
4007                   printf "\n  +++ archiving of single files impossible on $archive_system!\n"
4008                   locat=DMF
4009                   exit
4010                else
4011                   rm -rf  $ARCHIVE/${frelout[$i]}
4012                   cp -r  ${frelout[$i]}  $ARCHIVE
4013                fi
4014                file_saved=true
4015             elif [[ $archive_system = tivoli ]]
4016             then
4017                   # ARCHIVIERUNG NUR PER BATCH-JOB MOEGLICH
4018                   # DATEI MUSS ZWISCHENZEITLICH INS TEMPORAERE DATENVERZEICHNIS
4019                   # GELEGT WERDEN
4020                [[ ! -d $tmp_data_catalog ]]  &&  mkdir -p  $tmp_data_catalog
4021                chmod  g+rx  $tmp_data_catalog
4022                if [[ $files_for_pes = false ]]
4023                then
4024                   ln -f  ${frelout[$i]}  $tmp_data_catalog/${frelout[$i]}
4025                else
4026                   mkdir  $tmp_data_catalog/${frelout[$i]}
4027                   ln -f  ${frelout[$i]}/*  $tmp_data_catalog/${frelout[$i]}
4028                fi
4029
4030                   # BATCH JOB GENERIEREN UND ABSCHICKEN; DATEI MUSS WIEDER
4031                   # AUS TEMPORAEREM DATENVERZEICHNIS ENTFERNT WERDEN
4032                echo "cd  $tmp_data_catalog"                       >  archive_${frelout[$i]}
4033                if [[ $files_for_pes = false ]]
4034                then
4035                      # EVENTUELL NOCH VORHANDENE DATEI IM ARCHIV LOSCHEN
4036                   echo "rm  -rf  \$PERM/${frelout[$i]}"           >> archive_${frelout[$i]}
4037                   echo "cp  ${frelout[$i]} \$PERM/${frelout[$i]}" >> archive_${frelout[$i]}
4038                   echo "rm  -rf  ${frelout[$i]}"                  >> archive_${frelout[$i]}
4039                else
4040                   echo "rm  -rf  \$PERM/${frelout[$i]}.tar"       >> archive_${frelout[$i]}
4041                   echo "tar  cvf \$PERM/${frelout[$i]}.tar ${frelout[$i]}" >> archive_${frelout[$i]}
4042                   echo "rm  -rf  ${frelout[$i]}"                  >> archive_${frelout[$i]}
4043                fi
4044
[164]4045                subjob  -v  -d  -q cdata  -X 0  -m 1000  -t 43200  -c $job_catalog  archive_${frelout[$i]}
[1]4046                printf "              Archiving of $tmp_data_catalog/${frelout[$i]} initiated (batch job submitted)\n"
4047                file_saved=true
4048
4049             elif [[ $archive_system = ut ]]
4050             then
4051                   # ARCHIVIERUNG NUR PER BATCH-JOB MOEGLICH
4052                   # DATEI MUSS ZWISCHENZEITLICH INS TEMPORAERE DATENVERZEICHNIS
4053                   # GELEGT WERDEN
4054                [[ ! -d $tmp_data_catalog ]]  &&  mkdir -p  $tmp_data_catalog
4055                chmod  g+rx  $tmp_data_catalog
4056                if [[ $files_for_pes = false ]]
4057                then
4058                   ln -f  ${frelout[$i]}  $tmp_data_catalog/${frelout[$i]}
4059                else
4060                   mkdir  $tmp_data_catalog/${frelout[$i]}
4061                   ln -f  ${frelout[$i]}/*  $tmp_data_catalog/${frelout[$i]}
4062                fi
4063
4064                   # BATCH JOB GENERIEREN UND ABSCHICKEN; DATEI MUSS WIEDER
4065                   # AUS TEMPORAEREM DATENVERZEICHNIS ENTFERNT WERDEN
4066                echo "cd  $tmp_data_catalog"                       >  archive_${frelout[$i]}
4067                if [[ $files_for_pes = false ]]
4068                then
4069                      # EVENTUELL NOCH VORHANDENE DATEI IM ARCHIV LOSCHEN
4070                   echo "rm  -rf  \$UT/${frelout[$i]}"           >> archive_${frelout[$i]}
4071                   echo "cp  ${frelout[$i]} \$UT/${frelout[$i]}" >> archive_${frelout[$i]}
4072                   echo "rm  -rf  ${frelout[$i]}"                >> archive_${frelout[$i]}
4073                else
4074                   echo "rm  -rf  \$UT/${frelout[$i]}.tar"       >> archive_${frelout[$i]}
4075                   echo "tar  cvf \$UT/${frelout[$i]}.tar ${frelout[$i]}" >> archive_${frelout[$i]}
4076                   echo "rm  -rf  ${frelout[$i]}"                >> archive_${frelout[$i]}
4077                fi
4078
[82]4079                subjob  -v  -c /pf/b/$usern/job_queue  -d  -q pp  -X 0  -m 1000  -t 7200  archive_${frelout[$i]}
[1]4080                printf "              Archiving of $tmp_data_catalog/${frelout[$i]} initiated (batch job submitted)\n"
4081                file_saved=true
4082
4083             else
4084                printf "\n  +++ archive_system=\"$archive_system\"  archiving impossible!"
4085                archive_save=false
4086             fi
4087             if [[ $file_saved = true ]]
4088             then
4089                if [[ $files_for_pes = false ]]
4090                then
4091                   cat  /dev/null  >  ${pathout[$i]}
4092                else
4093                   mkdir -p  ${pathout[$i]}
4094                fi
4095             fi
4096          fi
4097
4098             # APPEND AUF LOKALER MASCHINE
4099          if [[ "${actionout[$i]}" = "a" ]]
4100          then
4101             printf "\n  >>> OUTPUT: ${localout[$i]}  append to  ${pathout[$i]}\n"
4102             cat  ${localout[$i]}  >>  ${pathout[$i]}
4103          fi
4104
4105             # KOPIEREN AUF LOKALER MASCHINE
4106             # ES MUSS KOPIERT WERDEN, DA MOVE NICHT UEBER FILESYSTEM HINAUS MOEGLICH
4107          if [[ "${actionout[$i]}" = ""  &&  $files_for_pes = false ]]
4108          then
4109
4110                # KOPIEREN AUF EINPROZESSORMASCHINE
[5]4111             if [[ "${extout[$i]}" != " "  &&  "${extout[$i]}" != "" ]]
[1]4112             then
4113                printf "\n  >>> OUTPUT: ${localout[$i]}  to  ${pathout[$i]}.${extout[$i]}\n"
[149]4114                if [[ $link_local_output = true ]]
4115                then
4116                    printf "      using ln -f\n"
4117                    ln -f  ${localout[$i]}  ${pathout[$i]}.${extout[$i]}
4118                fi
4119                # If "ln -f" fails of if "$link_local_output = false" do a normal "cp"
4120                if [[ ! -f "${pathout[$i]}.${extout[$i]}" ]]
4121                then
4122                    if [[ $link_local_output = true ]]
4123                    then
4124                        printf "      ln failed, using cp...\n"
4125                    fi
4126                    cp  ${localout[$i]}  ${pathout[$i]}.${extout[$i]}
4127                fi
[1]4128             else
4129                printf "\n  >>> OUTPUT: ${localout[$i]}  to  ${pathout[$i]}\n"
[149]4130                if [[ $link_local_output = true ]]
4131                then
4132                    printf "      using ln -f\n"
4133                    ln -f  ${localout[$i]}  ${pathout[$i]}
4134                fi
4135                # If "ln -f" fails of if "$link_local_output = false" do a normal "cp"
4136                if [[ ! -f "${pathout[$i]}" ]]
4137                then
4138                    if [[ $link_local_output = true ]]
4139                    then
4140                        printf "      ln failed, using cp...\n"
4141                    fi
4142                    cp  ${localout[$i]}  ${pathout[$i]}
4143                fi
[1]4144             fi
4145
4146          elif [[ "${actionout[$i]}" = ""  &&  $files_for_pes = true ]]
4147          then
4148
4149                # DIE DEN PROZESSOREN EINES PARALLELRECHNERS ZUGEHOERIGEN
4150                # DATEIEN WERDEN ERST IN EINEM KATALOG GESAMMELT UND DIESER
4151                # WIRD DANN KOPIERT
4152                # PER MOVE UMBENANNT WERDEN
4153             printf "\n  >>> OUTPUT: ${localout[$i]}/_....  to  ${pathout[$i]}\n"
[149]4154             if [[ $link_local_output = true ]]
4155             then
4156                 printf "      using ln -f\n"
4157                 mkdir  ${pathout[$i]}
4158                 cd ${localout[$i]}
4159                 for file in $(ls *)
4160                 do
4161                   ln -f $file  ${pathout[$i]}
4162                 done
4163                 cd $TEMPDIR
4164             fi
4165             # If "ln -f" fails of if "$link_local_output = false" do a normal "cp -r"
4166             if [[ ! -f "${pathout[$i]}/_0000" ]]
4167             then
4168                 if [[ $link_local_output = true ]]
4169                 then
4170                     printf "      ln failed for .../_0000, using cp...\n"
4171                 fi
4172                 cp -r  ${localout[$i]}  ${pathout[$i]}
4173             fi
[1]4174
4175          fi
4176       fi
4177    done
4178    if (( i != 0 ))
4179    then
4180       if [[ $transfer_problems = true ]]
4181       then
4182          printf "\n$striche\n  *** OUTPUT-files saved"
4183          printf "\n  +++ WARNING: some data transfers failed! \n"
4184       else
4185          printf "\n$striche\n  *** all OUTPUT-files saved \n"
4186       fi
4187    fi
4188
4189
4190       # EVENTUELL FOLGEJOB STARTEN
4191       # DATEI CONTINUE_RUN MUSS VOM BENUTZERPROGRAMM AUS ERZEUGT WERDEN
4192    if [[ -f CONTINUE_RUN ]]
4193    then
4194
4195       if [[ $archive_save = true ]]
4196       then
4197
4198             # ZUERST IN MRUN-AUFRUF OPTIONEN FUER FORTSETZUNGSLAUF, FUER
4199             # STILLES ABARBEITEN (OHNE INTERAKTIVE RUECKFAGEN) UND FUER
4200             # BATCH-BETRIEB (NUR WICHTIG, FALLS BATCH AUF LOKALER MASCHINE
4201             # DURCHGEFUEHRT WERDEN SOLL) EINFUEGEN, FALLS NICHT BEREITS VOR-
4202             # HANDEN
4203          [[ $(echo $mc | grep -c "\-C") = 0 ]]  &&  mc="$mc -C"
4204          [[ $(echo $mc | grep -c "\-v") = 0 ]]  &&  mc="$mc -v"
4205          [[ $(echo $mc | grep -c "\-b") = 0 ]]  &&  mc="$mc -b"
4206          if [[ $(echo $mc | grep -c "#") != 0 ]]
4207          then
4208             mc=`echo $mc | sed 's/#/f/g'`
4209          fi
4210
4211
4212             # JOB STARTEN
4213          printf "\n\n  *** initiating restart-run on \"$return_addres\" using command:\n"
4214          echo "      $mc"
4215          printf "\n$striche\n"
4216          if [[ $localhost != $fromhost ]]
4217          then
4218
[204]4219             if [[ $localhost = lcsgih  ||  $localhost = lcsgib  ||  $localhost = nech  ||  $localhost = ibmb  ||  $localhost = ibmh  ||  $localhost = ibms  ||  $localhost = lctit ]]
[1]4220             then
4221                echo "*** ssh will be used to initiate restart-runs!"
4222                echo "    return_addres=\"$return_addres\" "
4223                echo "    return_username=\"$return_username\" "
4224                if [[ $return_addres = 172.20.25.41 ]]
4225                then
4226                      # WORKAROUND AUF SCIROCCO AM TIT
[374]4227                   print  "PATH=\$PATH:$LOCAL_MRUN_PATH;export PALM_BIN=$LOCAL_MRUN_PATH;cd $LOCAL_PWD; $mc "  |  ssh $return_addres -l $return_username
4228                elif [[ $(echo $return_addres | grep -c "130.75.105") = 1 ]]
4229                then
4230                   ssh $return_addres -l $return_username "PATH=\$PATH:$LOCAL_MRUN_PATH;export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/muksoft/packages/intel/Compiler/11.0/083/lib/intel64/;export PALM_BIN=$LOCAL_MRUN_PATH;cd $LOCAL_PWD; $mc "
[1]4231                else
[33]4232                   ssh $return_addres -l $return_username "PATH=\$PATH:$LOCAL_MRUN_PATH;export PALM_BIN=$LOCAL_MRUN_PATH;cd $LOCAL_PWD; $mc "
[1]4233                fi
4234             else
4235                printf "\n  +++ no restart mechanism available for host \"$localhost\" "
4236                locat=restart; exit
4237             fi
4238
4239                # WARTEN, DAMIT SICH RESTART JOB IN QUEUE EINREIHEN KANN, BEVOR
4240                # DER AKTUELLE JOB ENDET
[399]4241             if [[ $queue = special1q ]]
4242             then
4243                sleep 120
4244             else
4245                sleep 30
4246             fi
[1]4247
4248          else
4249
4250                # BEI RECHNUNGEN AUF LOKALER MASCHINE KANN MRUN DIREKT AUFGE-
[108]4251                # RUFEN WERDEN, AUSSER AUF lcfimm
[1]4252             cd $LOCAL_PWD
[108]4253             if [[ $localhost = lcfimm ]]
4254             then
4255                ssh $return_addres -l $return_username "PATH=\$PATH:$LOCAL_MRUN_PATH;export PALM_BIN=$LOCAL_MRUN_PATH;cd $LOCAL_PWD; $mc " 
4256             else
4257                eval  $mc                # ' MUESSEN AUSGEWERTET WERDEN
4258             fi
[1]4259             cd -  > /dev/null
4260          fi
4261          printf "\n$striche\n  *** restart-run initiated \n"
4262
4263
4264             # EVENTUELL INPUT-DATEIEN, DIE VON TEMPORAEREM DATENVERZEICHNIS
4265             # GEHOLT WORDEN SIND, LOESCHEN
4266          (( i = 0 ))
4267          while (( i < iin ))
4268          do
4269             (( i = i + 1 ))
4270             if [[ "${got_tmp[$i]}" = true   &&  $keep_data_from_previous_run = false ]]
4271             then
4272                rm -r  $tmp_data_catalog/${frelin[$i]}
4273             fi
4274          done
4275
4276       else
4277
4278          printf "\n  +++ no restart-run possible, since errors occured"
4279          printf "\n      during the archive process"
4280       fi
4281
4282    fi
4283
4284
4285   
4286       # EVTL. EMAIL-BENACHRICHTIGUNG UEBER ABGESCHLOSSENEN LAUF
[352]4287    if [[ "$email_notification" != "none" ]]
[1]4288    then
4289
4290       if [[ $localhost != $fromhost ]]
4291       then
4292          if [[ -f CONTINUE_RUN ]]
4293          then
4294             echo "PALM restart run necessary"        >   email_text
4295             echo "description header of actual run:" >>  email_text
4296             cat  CONTINUE_RUN                        >>  email_text
4297             echo "mrun-command to restart:"          >>  email_text
4298             echo "$mc"                               >>  email_text
4299          else
4300             echo "PALM run with base filename \"$fname\" on host \"$localhost\" finished"  >  email_text
4301          fi
4302          mail  $email_notification  <  email_text
4303          printf "\n  *** email notification sent to \"$email_notification\" "
4304       fi
4305    fi
4306
4307
4308
4309       # ALLE ARBEITEN BEENDET. TEMPORAERER KATALOG KANN GELOESCHT WERDEN
4310    cd  $HOME
4311    [[ $delete_temporary_catalog = true ]]  &&  rm -rf $TEMPDIR
4312
4313 else
4314
4315
4316       # FALLS AUF REMOTE-MASCHINE GERECHNET WERDEN SOLL, WERDEN JETZT ENTSPRE-
4317       # CHENDE AKTIONEN DURCHGEFUEHRT
4318
4319       # MRUN-BEFEHL FUER REMOTE-MASCHINE ZUSAMMENSTELLEN
[82]4320    mrun_com="$mrun_script_name -a $afname -c $config_file -d $fname -h $host -H $fromhost -m $memory -t $cpumax -q $queue -R $return_addres -U $return_username -u $remote_username"
[1]4321    [[ "$cpp_opts" != "" ]]       &&  mrun_com=${mrun_com}" -D \"$cpp_opts\""
[79]4322    [[ "$global_revision" != "" ]]  &&  mrun_com=${mrun_com}" -G \"$global_revision\""
[123]4323    [[ $group_number != none ]]   &&  mrun_com=${mrun_com}" -g $group_number"
[1]4324    [[ $do_compile = true ]]      &&  mrun_com=${mrun_com}" -s \"$source_list\""
4325    [[ "$input_list" != "" ]]     &&  mrun_com=${mrun_com}" -i \"$input_list\""
4326    [[ $ignore_archive_error = true ]]  &&  mrun_com=${mrun_com}" -I"
4327    [[ $keep_data_from_previous_run = true ]]  &&  mrun_com=${mrun_com}" -k"
4328    [[ "$additional_conditions" != "" ]]  &&  mrun_com=${mrun_com}" -K \"$additional_conditions\""
4329#    [[ "$makefile" != "$source_path/Makefile" ]]  &&  mrun_com=${mrun_com}" -M \"$makefile\""
4330    [[ "$output_list" != "" ]]    &&  mrun_com=${mrun_com}" -o \"$output_list\""
4331    [[ "$read_from_config" = false ]]  &&  mrun_com=${mrun_com}" -S"
4332    [[ $do_trace = true ]]        &&  mrun_com=${mrun_com}" -x"
4333    [[ "$numprocs" != "" ]]       &&  mrun_com=${mrun_com}" -X $numprocs"
4334    if [[ $use_openmp = true ]]
4335    then
4336       mrun_com=${mrun_com}" -O"
4337       [[ "$tasks_per_node" != "" ]] &&  mrun_com=${mrun_com}" -T $threads_per_task"
4338    else
4339       [[ "$tasks_per_node" != "" ]] &&  mrun_com=${mrun_com}" -T $tasks_per_node"
4340    fi
[397]4341    [[ $store_on_archive_system = true ]]  &&  mrun_com=${mrun_com}" -A"
[1]4342    [[ $package_list != "" ]]     &&  mrun_com=${mrun_com}" -p \"$package_list\""
4343    [[ $return_password != "" ]]  &&  mrun_com=${mrun_com}" -P $return_password"
4344    [[ $delete_temporary_catalog = false ]]  &&  mrun_com=${mrun_com}" -B"
[127]4345    [[ $node_usage != default  &&  "$(echo $node_usage | cut -c1-3)" != "sla"  &&  $node_usage != novice ]]  &&  mrun_com=${mrun_com}" -n $node_usage"
[291]4346    [[ "$ocean_file_appendix" = true ]]  &&  mrun_com=${mrun_com}" -y"
[206]4347    [[ $run_coupled_model = true ]]  &&  mrun_com=${mrun_com}" -Y \"$coupled_dist\""
[1]4348    if [[ $do_remote = true ]]
4349    then
4350       printf "\n>>>> MRUN-command on execution host:\n>>>> $mrun_com \n"
4351    fi
4352
4353
4354       # ZUSAMMENSTELLUNG DES JOBSCRIPTS AUF DATEI jobfile
4355    jobfile=jobfile.$RANDOM
4356
4357
4358       # TEMPORAERES VERZEICHNIS GENERIEREN UND NACH DORT WECHSELN
4359    echo  "mkdir  $TEMPDIR"      >>  $jobfile
4360    echo  "cd  $TEMPDIR"         >>  $jobfile
4361
4362
4363       # EVENTUELL FEHLERVERFOLGUNG AKTIVIEREN
4364    if [[ $do_trace = true ]]
4365    then
4366       echo  "set -x"                                    >>  $jobfile
4367    else
4368       echo  "set +vx"                                   >>  $jobfile
4369    fi
4370
4371
[191]4372       # BEREITSTELLUNG VON QUELLTEXTEN, MRUN-SCRIPTS UND KONFIGURATIONS-
4373       # DATEI FUER DEN JOB
4374    if [[ $( echo $host | cut -c1-5 ) = lcsgi ]]
[1]4375    then
4376
[191]4377          # KONFIGURATIONSDATEI UND MRUN_SCRIPT IN DAS SOURCE-VERZEICHNIS
4378          # KOPIEREN
4379       if [[ $restart_run != true ]]
4380       then
4381          cp  $config_file  $working_directory/SOURCES_FOR_RUN_$fname
4382          cp  ${PALM_BIN}/$mrun_script_name  $working_directory/SOURCES_FOR_RUN_$fname
4383       fi
[1]4384
[191]4385          # SOURCE-VERZEICHNIS VOM LOKALEN RECHNER PER SCP TRANSFERIEREN
[193]4386       echo  "set -x"  >>  $jobfile
4387       echo  "scp  -r  $return_username@$return_addres:$working_directory/SOURCES_FOR_RUN_$fname ."  >>  $jobfile
4388       echo  "export SOURCES_COMPLETE=true"                      >>  $jobfile
[1]4389
[193]4390          # QUELLTEXTE, MRUN-SCRIPT UND KONFIGURATIONSDATEI IN DAS AKTUELLE
4391          # ARBEITSVERZEICHNIS VERSCHIEBEN
4392       echo  "mv  SOURCES_FOR_RUN_$fname/$config_file  . "       >>  $jobfile
4393       echo  "mv  SOURCES_FOR_RUN_$fname/$mrun_script_name  . "  >>  $jobfile
4394       echo  "execute_mrun=true"                                 >>  $jobfile
4395       echo  " "                                                 >>  $jobfile
4396
[191]4397    else
4398
4399          # ABSPEICHERN DER QUELLTEXTE (NUR FALLS UEBERSETZT WERDEN SOLL)
4400          # SOWIE GEGEBENENFALLS DES MAKEFILES
4401       if [[ $do_compile = true ]]
4402       then
4403
4404          source_catalog=SOURCES_FOR_RUN_$fname
4405
4406              # UNTERVERZEICHNIS FUER QUELLTEXTE UND MAKEFILE ANLEGEN
4407              # MRUN WIRD DIESES VRZEICHNIS UEBER ENVIRONMENT VARIABLE
4408              # MITGETEILT (UEBERSTEUERT ANGABE IN KONFIGURATIONSDATEI)
4409          echo  "mkdir  SOURCES_FOR_RUN_$fname"                >>  $jobfile
4410          echo  "export SOURCES_COMPLETE=true"                 >>  $jobfile
4411          echo  "cd     SOURCES_FOR_RUN_$fname"                >>  $jobfile
4412
4413          for  filename  in  $source_list
4414          do
4415                # ABDECKZEICHEN VERHINDERN, DASS ERSETZUNGEN ERFOLGEN
4416             echo  "cat > $filename << \"%END%\""              >>  $jobfile
4417             cat   $source_catalog/$filename                   >>  $jobfile
4418             echo  " "                                         >>  $jobfile
4419             echo  "%END%"                                     >>  $jobfile
4420             echo  " "                                         >>  $jobfile
4421          done
4422
[1]4423             # ABDECKZEICHEN VERHINDERN, DASS ERSETZUNGEN ERFOLGEN
[191]4424          echo  "cat > Makefile << \"%END%\""               >>  $jobfile
4425          cat   $source_catalog/Makefile                    >>  $jobfile
[1]4426          echo  " "                                         >>  $jobfile
4427          echo  "%END%"                                     >>  $jobfile
4428          echo  " "                                         >>  $jobfile
4429
[191]4430          echo  "cd -  > /dev/null"                         >>  $jobfile
[1]4431
[191]4432       fi
[1]4433
4434
[191]4435          # ABSPEICHERN DER KONFIGURATIONSDATEI
4436          # ABDECKZEICHEN VERHINDERN, DASS ERSETZUNGEN ERFOLGEN
4437       echo  "cat > $config_file << \"%END%\""      >>  $jobfile
4438       cat   $config_file                           >>  $jobfile
4439       echo  "%END%"                                >>  $jobfile
4440       echo  " "                                    >>  $jobfile
[1]4441
4442
[191]4443          # ABSPEICHERN DER AKTUELLEN MRUN-VERSION
4444          # ABDECKZEICHEN VERHINDERN, DASS ERSETZUNGEN ERFOLGEN
4445       echo  "cat > $mrun_script_name <<\"%END%\""  >>  $jobfile
4446       cat   ${PALM_BIN}/$mrun_script_name          >>  $jobfile
4447       echo  "%END%"                                >>  $jobfile
4448       if [[ $host = lctit ]]
4449       then
4450          echo "sed 's/bin\/ksh/home2\/usr5\/mkanda\/pub\/ksh/' < $mrun_script_name > mrun_new" >>  $jobfile
4451          echo "mv  mrun_new  $mrun_script_name"    >>  $jobfile
4452       fi
4453       echo  "chmod u+x $mrun_script_name"          >>  $jobfile
4454       echo  "execute_mrun=true"                    >>  $jobfile
4455       echo  " "                                    >>  $jobfile
[1]4456
4457    fi
4458
[191]4459
[1]4460       # EVTL. BENOETIGTE INPUT-DATEIEN PER FTP HOLEN ODER DEM JOB DIREKT
4461       # MITGEBEN UND AUF DEM REMOTE-RECHNER IM BENUTZERVERZEICHNIS ABLEGEN
4462       # FALLS DIESES NICHT EXISTIERT, WIRD VERSUCHT, DAS JEWEILS LETZTE
4463       # UNTERVERZEICHNIS DES PFADNAMENS ANZULEGEN
4464    if [[ $do_remote = true ]]
4465    then
4466       (( i = 0 ))
4467       while (( i < iin ))
4468       do
4469          (( i = i + 1 ))
4470          echo  "[[ ! -d ${pathin[$i]} ]]  &&  mkdir -p  ${pathin[$i]}"  >>  $jobfile
4471          if [[ "${transin[$i]}" = job ]]
4472          then
4473             echo  "cat > ${remotepathin[$i]} <<\"%END%\""    >>  $jobfile
4474             eval cat   ${pathin[$i]}/${frelin[$i]}           >>  $jobfile
4475             echo  " "                                        >>  $jobfile
4476             echo  "%END%"                                    >>  $jobfile
4477          else
[82]4478             echo  "batch_scp -b -o -g -s -u $return_username $return_addres ${remotepathin[$i]} \"${pathin[$i]}\" ${frelin[$i]}" >>  $jobfile
[1]4479          fi
4480
4481             # UEBERPRUEFEN, OB DATEI ANGELEGT WERDEN KONNTE
4482          echo  "if [[ \$? = 1 ]]"                    >>  $jobfile
4483          echo  "then"                                >>  $jobfile
4484          echo  "   echo \" \" "                      >>  $jobfile
4485          echo  "   echo \"+++ file ${remotepathin[$i]} could not be created\" "   >>  $jobfile
4486          echo  "   echo \"    please check, if directory exists on $host!\" "  >>  $jobfile
4487          echo  "   echo \"+++ MRUN will not be continued\" "  >>  $jobfile
4488          echo  "   execute_mrun=false"               >>  $jobfile
4489          echo  "fi"                                  >>  $jobfile
4490       done
4491    fi
4492
4493       # ARBEITSKATALOG AUF DER LOKALEN MASCHINE FUER EVENTUELLE
4494       # FORTSETZUNGSLAUEFE PER ENV-VARIABLE UEBERGEBEN
4495    echo  "LOCAL_PWD=$working_directory"                >>  $jobfile
4496    echo  "export LOCAL_PWD"                            >>  $jobfile
4497
4498       # EBENSO LOKALEN MRUN-KATALOG UEBERGEBEN
[22]4499    echo  "LOCAL_MRUN_PATH=$PALM_BIN"                   >>  $jobfile
[1]4500    echo  "export LOCAL_MRUN_PATH"                      >>  $jobfile
4501
[66]4502       # WORKAROUND FUER RIAM-NEC-JOBS WEGEN PROFILE-SCHWIERIGKEITEN
[69]4503    if [[ $localhost_realname = "gate"  ||  $localhost = lctit ]]
[66]4504    then
4505       echo  "export PALM_BIN=$PALM_BIN"                >>  $jobfile
4506    fi
[1]4507
4508       # MRUN AUF ZIELRECHNER AUFRUFEN
4509    echo  "set -x"                                      >>  $jobfile
4510    echo  "[[ \$execute_mrun = true ]]  &&  ./$mrun_com"  >>  $jobfile
4511
4512    echo  'ls -al; echo `pwd`'                          >>  $jobfile
4513    echo  "cd \$HOME"                                   >>  $jobfile
4514    echo  "rm -rf  $TEMPDIR"                            >>  $jobfile
4515
4516
4517
4518
4519       # JOB PER SUBJOB STARTEN
4520    if [[ $silent = false ]]
4521    then
4522       printf "\n     "
4523    else
4524       printf "\n\n"
4525    fi
4526
[352]4527    subjob  $job_on_file  -h $host  -u $remote_username -g $group_number -q $queue  -m $memory  -N $node_usage -t $cpumax  $XOPT  $TOPT  $OOPT  -n $fname  -v  -c $job_catalog  -e $email_notification  $jobfile
[1]4528    rm -rf  $jobfile
4529
4530
4531 fi  # ENDE REMOTE-TEIL
4532
4533
4534
4535     # ENDE DER PROZEDUR
Note: See TracBrowser for help on using the repository browser.