#!/bin/bash # --------------------------------------------------------------------------- # # comp : Compiler script for use in ad3 - Customised for compilation on the # # NEC SX6/SX8 supercomputer using the sxf90 compiler # # # # use : comp name # # name: name of source code file without the extension. # # # # error codes : 1 : input error # # 2 : no environment file $ww3_env found. # # 3 : error in creating scratch directory. # # 4 : w3adc error. # # 5 : compiler error. # # # # remarks : # # # # - This script runs from the scratch directory, where it should remain. # # # # - For this script to interact with ad3, it needs to generate / leave # # following files : # # $name.f90 : Source code (generated by ad3). # # $name.o : Object module. # # $name.l : Listing file. # # comp.stat.$name : status file of compiler, containing number of errors # # and number of warnings (generated by comp). # # # # # # Hendrik L. Tolman # # February 2005 # # # # Modification history: # # # # 05-Mar-2008 Modified original compile script for use on NEC. # # (Chris Bunney, UK Met Office) # # # # --------------------------------------------------------------------------- # # 1. Preparations # # --------------------------------------------------------------------------- # # 1.a Check and process input if [ "$#" != '1' ] then echo "usage: comp name" ; exit 1 fi name="$1" # 1.b Initial clean-up - - - - - - - - - - - - - - - - - - - - - - - - - - - - rm -f $name.l rm -f $name.o rm -f comp.stat.$name # --------------------------------------------------------------------------- # # 2. Compile # # --------------------------------------------------------------------------- # # Add here the correct compiler call including command line options # Note: - do not invoke a link step # - if possible, generate a listing $name.l # - make sure the compiler point to the proper directory where the # modules are stored ($m_path), see examples below. # 2.a Determine file extension - - - - - - - - - - - - - - - - - - - - - - - - # .f90 assumes free format, .f assumes fixed format, change if necessary # *** file extension (fext) is set and exported by calling program (ad3) *** # 2.b Perform compilation - - - - - - - - - - - - - - - - - - - - - - - - - - # Save compiler exit code in $OK # # sxf90 cross compiler under Linux-------------------------------------------- # 2.b.1 Build options and determine compiler name # compiler flags description: # -c Compilation only (no link) # -f2003 Compile to Fortran 2003 standard. # -Chopt Use highest level of vector optimisation. # -Wf'-pvctl vwork=stack' Use the stack for vector work space. # -Wf'-M noinv' Don't report invalid operation errors. # -Wf'-M noflovf' Don't report floating point overflow errors. # -Wf'-cont' Specifies to use an array pointer name or an assumed shape array # name in the actual argument list or the input/output list contiguously. # The compiler does not use a work array for the variable. # -I Module include path opt="-c -f2003 -Chopt -Wf'-pvctl vwork=stack' -Wf'-M noinv' -Wf'-M noflovf' -Wf'-cont' -I $path_m" # If you have a large model with more than 5000 sea points, it might be necessary to increase the # compiler's maximum vector loop size. If the loop size (default 5000) is less than the number of model sea # points, you will get run time errors similar to "Loop count is greater than that assumed by the compiler:". # To fix this un-comment the following line and set 'xxx' to be >= to number of model sea points: # # opt="$opt -Wf'-pvctl loopcnt=xxx'" # mpi implementation if [ "$mpi_mod" = 'yes' ] then comp=sxmpif90 else comp=sxf90 fi # open mpi implementation if [ "$omp_mod" = 'yes' ] then opt="$opt -mp" fi # oasis coupler include dir if [ "$oasis_mod" = 'yes' ] then opt="$opt -I$OASISDIR/build/lib/psmile.MPI1" fi # netcdf include dir if [ "$netcdf_compile" = 'yes' ] then case $WWATCH3_NETCDF in NC3) opt="$opt -I$NETCDF_INCDIR" ;; NC4) if [ "$mpi_mod" = 'no' ]; then comp="`$NETCDF_CONFIG --fc`"; fi opt="$opt -I`$NETCDF_CONFIG --includedir`" ;; esac fi # ftn include dir opt="$opt -I$path_i" opt="$opt $ESMF_F90COMPILEPATHS" opt="$opt $EXTRA_COMP_OPTIONS" # 2.b.2 Compile eval $comp $opt $name.$fext > $name.out 2> $name.err OK="$?" # 2.b.2 Process listing # if [ -s $name.lst ] # then # mv $name.lst $name.l # fi # 2.b.3 Add test output to listing for later viewing # if [ -s $name.l ] # then # echo '------------' >> $name.l # echo "$comp $opt" >> $name.l # echo '------------' >> $name.l # cat $name.out >> $name.l 2> /dev/null # echo '------------' >> $name.l # cat $name.err >> $name.l 2> /dev/null # echo '------------' >> $name.l # fi # --------------------------------------------------------------------------- # # 3. Postprocessing # # --------------------------------------------------------------------------- # # 3.a Capture errors # nr_err : number of errors. # nr_war : number of errors. nr_err='0' nr_war='0' if [ -s $name.err ] then echo > /dev/null nr_err=`grep -i 'f[97][750]: error' $name.err | wc -l | awk '{ print $1 }'` nr_war=`grep -i 'f[97][750]: warn' $name.err | wc -l | awk '{ print $1 }'` else if [ "$OK" != '0' ] then nr_err='1' fi fi # 3.b Make file comp.stat.$name - - - - - - - - - - - - - - - - - - - - - - - - - - echo "ERROR $nr_err" > comp.stat.$name echo "WARNING $nr_war" >> comp.stat.$name # 3.c Prepare listing - - - - - - - - - - - - - - - - - - - - - - - - - - - - # if compiler does not provide listing, make listing from source code # and compiler messages. Second input line for w3list identifies if # comment lines are to be numbered. if [ ! -f $name.l ] then echo "$name.$fext" > w3list.inp echo "T" >> w3list.inp w3list < w3list.inp 2> /dev/null rm -f w3list.inp mv w3list.out $name.l echo '------------' >> $name.l echo "$comp $opt" >> $name.l echo '------------' >> $name.l cat $name.out >> $name.l #2> /dev/null echo '------------' >> $name.l cat $name.err >> $name.l #2> /dev/null echo '------------' >> $name.l fi # 3.d Remove unwanted files - - - - - - - - - - - - - - - - - - - - - - - - - # include here unwanted files generated by the compiler # rm -f $name.out # rm -f $name.err # end of comp --------------------------------------------------------------- #